Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Bluetooth et Threads

    20 janvier 2018 à 13:16:22

    Bonjour à tous,

    Je me suis lancé dans la création d'une App qui doit communiquer avec un ESP12 (lui même communiquant en WiFi avec d'autres ESP12). Je reçois en Bluetooth des chaines de caractère entrantes qui définissent des objets (class Glask et class GlaskPlayers) et de manière simultanée, l'utilisateur sur son Android doit pouvoir modifier ces objets (paramètres différents donc pas de collisions) et les envoyer sur le Bluetooth.

    Etant encore assez novice dans la programmation Android, j'ai un peu bricolé les codes trouvés. Il s'avère que la réception est excellente, les objets sont créés/modifés selon les données envoyées. L'envoi est, par contre, impossible. C'est comme si rien ne partait.

    Je vous mets quelques extraits du code :

    package com.example.nicolas.glaskbluetooth;
    
    import android.app.Activity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.bluetooth.BluetoothSocket;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;
    import android.text.method.ScrollingMovementMethod;
    import android.view.View;
    import android.widget.TextView;
    import android.widget.EditText;
    import android.widget.Button;
    import android.widget.Toast;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.nio.charset.StandardCharsets;
    import java.util.Random;
    import java.util.Set;
    import java.util.UUID;
    
    public class MainActivity extends Activity implements  View.OnClickListener
    {
        private Handler sending = new Handler();
        TextView result;
        TextView trait;
        TextView status1;
        TextView status2;
    
    
        EditText myTextbox;
    
        BluetoothAdapter mBluetoothAdapter;
        BluetoothSocket mmSocket;
        BluetoothDevice mmDevice;
        OutputStream mmOutputStream;
        InputStream mmInputStream;
    
        boolean stopThread = false;
        volatile boolean stopWorker;
        int k = 0;
        int l = 0;
    
        byte[] buffer = new byte[256];
    
        GlaskPlayers game;
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button b1 = (Button) findViewById(R.id.button1);
            b1.setOnClickListener(this);
            Button b2 = (Button) findViewById(R.id.button2);
            b2.setOnClickListener(this);
            Button b3 = (Button) findViewById(R.id.button3);
            b3.setOnClickListener(this);
    
            Button b4 = (Button)findViewById(R.id.open);
            b4.setOnClickListener(this);
            Button b5 = (Button)findViewById(R.id.send);
            b5.setOnClickListener(this);
            Button b6 = (Button)findViewById(R.id.close);
            b6.setOnClickListener(this);
    
    
    
            result = (TextView)findViewById(R.id.result);
            result.setMovementMethod(new ScrollingMovementMethod());
            trait = (TextView)findViewById(R.id.trait);
            status1 = (TextView)findViewById(R.id.status1);
            status2 = (TextView)findViewById(R.id.status2);
            myTextbox = (EditText)findViewById(R.id.entry);
    
    
            game = new GlaskPlayers();
            sending.postDelayed(runnable1, 1000);
    
        }
    
        @Override
        public void onClick(View v) {
            switch(v.getId()) {
                case R.id.open:
                    try
                    {
                        findBT();
                        openBT();
                    }
                    catch (IOException ex) { }
                    break;
                case R.id.close:
                    try
                    {
                        closeBT();
                    }
                    catch (IOException ex) { }
                    break;
    
                case R.id.send:
                    try
                    {
                       // TEST D'UN ENVOI
                        mmOutputStream.write("#2;0;0;255;0;".getBytes());
                        mmOutputStream.write("\n".getBytes());
                        mmOutputStream.flush();
                        result.setText("Data Sent");
                    }
                    catch (IOException ex) { }
                    break;
    
            }
        }
    
        private Runnable runnable1 = new Runnable()
        {
            @Override
            public void run()
            {
                if(game.isOnline()) {
    
                    try {
                        k = k + 1;
                        trait.setText(game.formatOut());
                        //JE PENSAIS ENVOYE TOUTES LES X SECONDES ICI, NE FONCTIONNE PAS
                    } catch (Exception e) {}
                }
                sending.postDelayed(this, 1000);
            }
        };
    
        void beginListenForData()
        {
            final Handler handler = new Handler();
            buffer = new byte[1024];
            Thread thread  = new Thread(new Runnable()
            {
                public void run()
                {
                    String s = "";
                    while(!Thread.currentThread().isInterrupted() && !stopThread)
                    {
                        try
                        {
                            int byteCount = mmInputStream.available();
                            if(byteCount > 0)
                            {
                                byte[] rawBytes = new byte[byteCount];
                                mmInputStream.read(rawBytes);
                                final String string = new String(rawBytes,"UTF-8");
                                if(string.contains("#"))
                                {
                                    String[] sub = string.split("#");
                                    if(sub.length >  0) {s = s + sub[0];}
                                    final String comp = s.replace("\n", "");
                                    handler.post(new Runnable() {
                                        public void run()
                                        {
                                               
                                                // CREATION DES OBJETS ICI AVEC comp => FONCTIONNE OK
    
                                                
                                        }
                                    });
                                    if(sub.length > 0) {s = "#" + sub[1];}
                                    else {s = "#";}
                                }
                                else if(string.contains(";")) {s = s + string;}
                            }
                        }
                        catch (IOException ex)
                        {
                            stopThread = true;
                        }
                    }
                }
            });
    
            thread.start();
        }
    
        void findBT()
        {
            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
            if(mBluetoothAdapter == null)
            {
                result.setText("No bluetooth adapter available");
            }
    
            if(!mBluetoothAdapter.isEnabled())
            {
                Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBluetooth, 0);
            }
    
            Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
            if(pairedDevices.size() > 0)
            {
                for(BluetoothDevice device : pairedDevices)
                {
                    if(device.getName().equals("HC-05"))
                    {
                        mmDevice = device;
                        break;
                    }
                }
            }
            result.setText("Bluetooth Device Found");
        }
    
        void openBT() throws IOException
        {
            UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID
            mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
            mmSocket.connect();
            mmOutputStream = mmSocket.getOutputStream();
            mmInputStream = mmSocket.getInputStream();
    
            result.setText("Bluetooth Opened");
            beginListenForData();
        }
    
        void closeBT() throws IOException
        {
            stopWorker = true;
            mmOutputStream.close();
            mmInputStream.close();
            mmSocket.close();
            result.setText("Bluetooth Closed");
        }
    }
    

    J'ai enlevé ce qui était inutile. En fait, parfois ça fonctionne (délai énorme et sans logique) quand l'envoi se déroule, il me semble, avant la lecture. J'ai essayé de placer un exemple d'envoi un peu partout mais sans résultat. J'ai l'impression que l'entrée bloque la sortie mais je ne trouve pas trop de documentation. Tout doit être assez rapide (max 500ms) et je ne vois pas du tout où est le problème.

    Merci d'éclairer ma lanterne si vous avez trouvé la force de tout lire !

    Col

    • Partager sur Facebook
    • Partager sur Twitter

    [Android] Bluetooth et Threads

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown