it-swarm.com.de

Verbindung mit Raspberry Pi mit einer Android-App über Bluetooth herstellen

Ich habe Probleme, mithilfe einer App mein Smartphone über Bluetooth mit meinem Raspberry Pi zu verbinden.

Meine Situation:

Ich entwickle eine steuerbare Bluetooth-Anwendung, die auf einem Raspberry Pi basiert. Ich kann über Bluetooth eine Verbindung zum Raspberry Pi herstellen und über die RFCOMM-Buchse über die App "Bluetooth-Terminal" Daten senden und empfangen. Das Raspberry Pi wartet ständig auf RFCOMM-Verbindungen.

Mein Ziel:

Ich möchte eine App entwickeln, in der sich der Benutzer über Bluetooth mit dem Raspberry Pi verbinden kann. Die App sollte den RFCOMM-Socket öffnen, damit er mit dem Pi kommunizieren kann.

Mein Problem:

Meine App kann keine Verbindung zum Raspberry Pi herstellen und da ich die UUID des Raspberry Pi nicht kenne, denke ich, dass dies das Problem sein könnte. 

Mein Code:

Ich bin ein Neuling in der Java-Programmierung, also korrigieren Sie mich, wenn Sie etwas Merkwürdiges sehen. Dies ist die Methode, mit der ich mich verbinden möchte.

        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();
                    }
                }
            }
        }
    }
}

Wenn ich auf die Schaltfläche zum Verbinden klicke, ist dies die Ausgabe von Android Studio:

   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)

zusammengefasst:

Um von einer Android-App eine Verbindung zum Raspberry Pi herstellen zu können, muss ich Folgendes tun:

  • Sie müssen wissen, was die UUID des Raspberry Pi ist. Wenn ja, wie finde ich das heraus?
  • Müssen Sie einen anderen Ansatz in meiner Android-App verwenden?

Ich würde wirklich gerne wissen, wie ich dieses Problem beheben kann, also wäre jede Hilfe dankbar.

9
R_Zee

Schnelle Antwort

Ähnlich wie bei diesem Vorgang für eine Bluetooth-Verbindung, sind sowohl Geräteadresse als auch service-UUID erforderlich. 

Die Geräteadresse (ex: 00: 72: 02: 97: 33: 2C) kann von gekoppelten Geräten abgerufen werden (oder durch Erkennen der Erkennung). Weitere Informationen hierzu finden Sie in der Android-Beispiel-App. 

Die UUID (ex: 00001101-0000-1000-8000-00805F9B34FB) wird normalerweise auf dem Serverteil definiert, auf dem ein Bluetooth-Dienst mit einer bestimmten Kennung ausgeführt wird. 

Wenn Sie nun den letzten Teil vermeiden möchten und nur einfache Daten kommunizieren möchten, können Sie sich auf einen Standard mit dem seriellen Bluetooth-Anschluss verlassen. Aus der Android-Bluetooth-Dokumentation:

Hinweis: Wenn Sie eine Verbindung zu einer seriellen Bluetooth-Karte herstellen, versuchen Sie es mit die bekannte SPP-UUID 00001101-0000-1000-8000-00805F9B34FB. Jedoch Wenn Sie sich mit einem Android-Peer verbinden, generieren Sie bitte Ihre eigene eindeutige UUID.

Mehr Informationen

Android-Dokumentation & Beispielcode

Das Android-Beispiel BluetoothChat ist ein schönes Beispiel für den Umgang mit der 2-Wege-Kommunikation zwischen 2 Android-Geräten. 

Android Bluetooth-Dokumentationhttps://developer.Android.com/guide/topics/connectivity/bluetooth.html

Das Bluetooth-Chat-Beispielhttps://developer.Android.com/samples/index.html . Sie können dieses Projekt auschecken, indem Sie einfach Datei> Neu> Beispielprojekt auswählen und in Android Studio nach Bluetooth-Chat suchen. 

Bluetooth-Verbindung von Android zu Raspberry Pi (Python- und Android-Code)

Der Umgang mit dem Starten eines solchen Dienstes auf einem Raspberry Pi kann in diesem Python-Beispiel gefunden werden: http://blog.davidvassallo.me/2014/05/11/Android-linux-raspberry-pi-bluetooth-communication/ . Nur eines der vielen online verfügbaren Muster. Dieses Beispiel enthält Android-Code. 

Verwenden der Standard-UUID für den seriellen Anschluss (C++ - Code)

Wenn Sie so etwas auf dem Raspberry Pi mit C++ - Code implementieren möchten, kann ich die Dokumentation unter http://people.csail.mit.edu/albert/bluez-intro/x502.html empfehlen.

Dieser Link enthält Beispielcode für Server und Client. Da dies die RFCOMM-Spezifikation und die standardmäßige UUID des seriellen Ports verwendet, müssen Sie keine UUID angeben. 

BlueTerm Android Open-Source-App (Android-Code)

Wenn Sie nachschauen, wie Sie von Android aus eine Verbindung herstellen, werden Sie wahrscheinlich die BlueTerm Android-App finden. Dies ist eine Open-Source-App, mit der Sie alle Quellen unter https://github.com/johnhowe/BlueTerm/tree/master/src/es/pymasde/blueterm finden. Dort finden Sie die UUID für diesen seriellen Port-Dienst:

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

Die vollständige BluetoothSerialService-Klasse ist eine gute Möglichkeit, eine Bluetooth-Verbindung zu verwalten, einschließlich der Rückmeldungen an die Benutzeroberfläche. 

8
hcpl

Ich denke, Linux-Bluetooth muss den Verbindungsport angeben.

      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

sie müssen die uuid nicht kennen, Sie müssen die uuid festlegen, die Sie auf Client und Server verwenden möchten

0
Josue Martinez