web-dev-qa-db-fra.com

Comment se connecter à Raspberry Pi avec une application Android via Bluetooth

Je ne parviens pas à connecter mon smartphone à mon Raspberry Pi via Bluetooth à l'aide d'une application.

Ma situation:

Je développe une application contrôlable Bluetooth basée sur un Raspberry Pi. Je peux me connecter au Raspberry Pi via Bluetooth et envoyer et recevoir des données via une prise RFCOMM à l'aide de l'application "terminal bluetooth". Le Raspberry Pi est constamment à l'écoute de la connexion RFCOMM.

Mon but:

Je souhaite développer une application dans laquelle l'utilisateur peut se connecter au Raspberry Pi via Bluetooth. L'application doit ouvrir la prise RFCOMM pour pouvoir communiquer avec le pi.

Mon problème:

Mon application ne parvient pas à se connecter au Raspberry Pi et, comme je ne connais pas l'UUID du Raspberry Pi, je pense que cela pourrait être le problème. 

Mon code:

Je suis assez nouveau en programmation Java alors corrigez-moi si vous voyez quelque chose d'étrange. C’est la méthode à laquelle j’essaie de me connecter.

        public void BTConnect() {

    final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    BluetoothSocket socket = null;
    String RPi_MAC = "XX:XX:XX:XX:XX:XX";

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    // If there are paired devices
    if (pairedDevices.size() > 0) {

        // Loop through paired devices
        for (BluetoothDevice device : pairedDevices) {
            if (device.getAddress().equals(RPi_MAC)) {
                try {
                    socket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
                } catch (IOException e0) {
                    Log.d("BT_TEST", "Cannot create socket");
                    e0.printStackTrace();
                }

                try {
                    socket.connect();
                } catch (IOException e1) {
                    try {
                        socket.close();
                        Log.d("BT_TEST", "Cannot connect");
                        e1.printStackTrace();
                    } catch (IOException e2) {
                        Log.d("BT_TEST", "Socket not closed");
                        e2.printStackTrace();
                    }
                }
            }
        }
    }
}

Lorsque je clique sur le bouton pour me connecter, voici la sortie du studio Android:

   W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
   D/BT_TEST: Cannot connect
   W/System.err: Java.io.IOException: read failed, socket might closed or timeout, read ret: -1
   W/System.err:     at Android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.Java:599)
   W/System.err:     at Android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.Java:610)
   W/System.err:     at Android.bluetooth.BluetoothSocket.connect(BluetoothSocket.Java:333)
   W/System.err:     at com.example.gebruiker.soundslikepi.MainActivity.BTConnect(MainActivity.Java:80)
   W/System.err:     at com.example.gebruiker.soundslikepi.MainActivity$1.onClick(MainActivity.Java:39)
   W/System.err:     at Android.view.View.performClick(View.Java:4856)
   W/System.err:     at Android.view.View$PerformClick.run(View.Java:19956)
   W/System.err:     at Android.os.Handler.handleCallback(Handler.Java:739)
   W/System.err:     at Android.os.Handler.dispatchMessage(Handler.Java:95)
   W/System.err:     at Android.os.Looper.loop(Looper.Java:211)
   W/System.err:     at Android.app.ActivityThread.main(ActivityThread.Java:5373)
   W/System.err:     at Java.lang.reflect.Method.invoke(Native Method)
   W/System.err:     at Java.lang.reflect.Method.invoke(Method.Java:372)
   W/System.err:     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1020)
   W/System.err:     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:815)

Résumé:

Donc, pour pouvoir me connecter au Raspberry Pi depuis une application Android, est-ce que je:

  • Besoin de savoir ce qu'est l'UUID du Raspberry Pi, si oui, comment puis-je le savoir?
  • Besoin d'utiliser une approche différente dans mon application Android?

Je voudrais vraiment savoir comment résoudre ce problème, donc toute aide serait appréciée.

9
R_Zee

Réponse rapide

Semblable à la façon dont vous avez commencé sur ce point, une connexion Bluetooth nécessite les adresses device et service UUID

L'adresse de l'appareil (ex: 00: 72: 02: 97: 33: 2C) peut être obtenue à partir d'appareils couplés (ou en autorisant la découverte), voir l'exemple d'application Android pour plus d'informations. 

L'UUID (ex: 00001101-0000-1000-8000-00805F9B34FB) est généralement défini sur la partie serveur où un service Bluetooth est exécuté avec un identifiant spécifique. 

Maintenant, si vous voulez éviter cette dernière partie et que vous souhaitez simplement communiquer des données simples, vous pouvez vous fier à un paramètre par défaut en utilisant le port série Bluetooth. De la documentation Bluetooth Android:

Astuce: Si vous vous connectez à une carte série Bluetooth, essayez alors d’utiliser le bien connu SPP UUID 00001101-0000-1000-8000-00805F9B34FB. Toutefois Si vous vous connectez à un homologue Android, veuillez générer votre propre fichier UUID unique.

Plus d'information

Documentation Android et exemple de code

L'exemple Android BluetoothChat est un bel exemple de la gestion de la communication bidirectionnelle entre 2 appareils Android. 

Documentation Bluetooth Androidhttps://developer.Android.com/guide/topics/connectivity/bluetooth.html

L'échantillon de conversation Bluetoothhttps://developer.Android.com/samples/index.html . Notez que vous pouvez extraire ce projet en sélectionnant simplement Fichier> Nouveau> Exemple de projet et en recherchant le chat Bluetooth dans Android Studio. 

Connexion Bluetooth d'Android à Raspberry Pi (code Python & Android)

Vous pouvez trouver le démarrage d’un tel service sur un Raspberry Pi en utilisant cet exemple Python: http://blog.davidvassallo.me/2014/05/11/Android-linux-raspberry-pi-bluetooth- communication/ . Juste un des nombreux exemples disponibles en ligne. Cet exemple inclut le code Android. 

Utilisation de l'UUID par défaut pour le port série (code C++)

Si vous voulez implémenter une telle chose sur Raspberry Pi en utilisant le code C++, je peux vous recommander la documentation de http://people.csail.mit.edu/albert/bluez-intro/x502.html .

Ce lien contient un exemple de code pour le serveur et le client. Etant donné que cela utilise les spécifications RFCOMM et l'UUID du port série par défaut, il n'est pas nécessaire de spécifier un UUID. 

Application open source BlueTerm Android (code Android)

Si vous cherchez à vous connecter à cette application depuis Android, vous finirez probablement par trouver l'application Android BlueTerm. Ceci est une application open source afin que vous puissiez trouver toutes les sources sur https://github.com/johnhowe/BlueTerm/tree/master/src/es/pymasde/blueterm . Vous y trouverez l'UUID de ce service de port série:

private static final UUID SerialPortServiceClass_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

La classe complète BluetoothSerialService constitue un bon moyen de gérer une connexion Bluetooth, y compris la gestion des messages renvoyés à l'interface utilisateur. 

8
hcpl

Je pense que Linux utilise Bluetooth besoin de spécifier le port de connexion.

      try {
            Method m = remoteDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
            try {
                BluetoothSocket tmp = (BluetoothSocket)m.invoke(remoteDevice, 1);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
1
Charein

vous n'avez pas besoin de connaître l'uuid, vous devez définir l'uuid que vous souhaitez utiliser sur le client et le serveur

0
Josue Martinez