IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Android Discussion :

Bluetooth via une liaison série sur HC05


Sujet :

API standards et tierces Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Par défaut Bluetooth via une liaison série sur HC05
    Bonjour,
    pour m'appuyer sur des exemples se trouvant sur le net, je voudrais allumer/éteindre une led connectée à un GPIO de Raspberry qui est relié à un module HC05 sur sa liaison série. Je veux commander ce module à partir de mon téléphone Android.
    Pour l'instant mon appli java détecte le HC05 et j'accède à son nom et à son adresse MAC. Mon thread de communication avec le module a cette tête:
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    public class ClientBluetooth extends Thread {
        private String TAG = "ClientBluetooth";
        private final BluetoothSocket mmSocket;
        private final BluetoothDevice mmDevice;
        private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
        private Handler mHandler = null;
     
        //constructeur
        public ClientBluetooth(BluetoothDevice device) {
            mmDevice = device;
            try {
                mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                Log.e(TAG, "Socket's create() method failed", e);
            }
        }
     
        public void run() {
            //se mettre en attente d'une valeur en provenance du threadUI (1 --> allume la led,
            //0 --> éteint la led) à travers un handler
            try {
                Looper.prepare();
                mHandler = new Handler() {
                    public void handleMessage(Message msg) {
                        switch (msg.arg1)
                        {
                            case 1:
                                //lancer la valeur à travers mmsocket
                                byte data[] = new byte[1];
                                data[0] = 1;
                                try {
                                    mmSocket.getOutputStream().write(data);
                                } catch(IOException e)
                                {
                                    e.printStackTrace();
                                }
                                break;
                            case 2:
                                break;
                            default:
                                Log.d(TAG, "Unknown");
                        }
                    }
                };
                Looper.loop();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
     
        }
    Sans trop s'attarder sur le fait que ce ne soit pas trop bien écrit, à l'exécution j'ai ce message: java.io.IOException: Transport endpoint is not connected
    ce qui est normal vu que je n'ai pas appelé la fonction connect() sur ma socket.
    C'est là que je coince complètement côté Raspberry. C'est une liaison série et je ne comprend pas du tout comment mettre en place l'équivalent d'un serveur avec un accept() qui irait bien avec le connect() de l'autre côté.

    Merci pour vos avis.

  2. #2
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Par défaut
    Bonjour,
    c'est une auto-réponse en fait.
    Il faut donc bien faire un appel à connect() avec la socket bluetooth et c'est le module HC-05 qui fait le accept() de son côté puisque je suis maintenant effectivement connecté.

    Côté Raspberry, il ne reste qu'à faire un read pour acquérir ce qui arrive depuis le téléphone.
    Mais je n'en suis pas encore là... Je m'inspire du document suivant: http://www.egr.msu.edu/classes/ece48...roidDevice.pdf pour écrire mon appli et étant novice (très) en Java, je bloque complètement sur la méthode run() de la classe ConnectedThread. L'objet mHandler qui appelle la méthode obtainMessage() est inconnu pour Android Studio.
    Etant défini dans le threadUI si j'ai bien compris, je ne vois pas comment on peut en disposer dans ce thread de connexion.

    Si vous avez 5mn, je prend tous les conseils.
    Merci.

  3. #3
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Par défaut
    bonjour,
    j'ai repris le projet et j'ai pas mal avancé mais je bloque maintenant sur le tout dernier point à savoir le write sur la BluetoothSocket.
    Code de mon thread à qui je délègue l'émission:
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    th = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        OutputStream tmpOut = null;
                        try {
                            tmpOut = btSocket.getOutputStream();
                            mmOutStream = tmpOut;
                            Log.d("mmOutStream", "ok");
                        } catch (IOException e) {
                            Log.d("mmOutStream", "IOException");
                            e.printStackTrace();
                        }
     
                        byte[]tab = {'a', 'b', 'c'};
     
                        try {
                            mmOutStream.write(tab);
                        }catch(IllegalFormatConversionException e) {
                            Log.d("WRITE", "IllegalFormatConversionException");
                            e.printStackTrace();
                        }
                        catch(IOException e) {
                            Log.d("WRITE", "IOException");
                            e.printStackTrace();
                        }
                }
            });
            th.start();
    Le write déclenche systématiquement un IOException avec System.err: java.io.UnsupportedEncodingException: abc Caused by: java.nio.charset.UnsupportedCharsetException: abc et je ne comprend absolument pas pourquoi. Je ne décode pas le message d'erreur.
    Merci pour vos avis.

  4. #4
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Par défaut
    bonjour,
    ce fût laborieux mais j'y suis arrivé.
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char data[] = {'A', 'Z', 'E'};
    String str = new String(data);
    byte[]car = str.getBytes("UTF-8");
    mmOutStream.write(car);
    Je vais faire plus propre et concis mais l'idée est là.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/09/2014, 13h27
  2. PIC 12F675: envoie d'un octet sur une liaison série
    Par forum dans le forum Téléchargez
    Réponses: 0
    Dernier message: 21/12/2013, 19h14
  3. Réponses: 2
    Dernier message: 14/05/2013, 09h26
  4. Réponses: 4
    Dernier message: 20/04/2009, 19h49
  5. Comment capturer les données sur une liaison série RS232
    Par jef Orome dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 02/04/2007, 18h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo