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:
Je voudrais vraiment savoir comment résoudre ce problème, donc toute aide serait appréciée.
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.
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.
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.
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.
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.
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();
}
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