2015-05-24 15 views
5

Ich bin mit zwei Android 5.0-Geräten über Bluetooth Low Energy zu kommunizieren und ich wan't:BLE mit Android 5.0: Wie man ein Gerät erhält, um als zentraler AND-Server zu fungieren?

  • Gerät 1 als Mittel- und Server handeln.

  • Gerät 2 als Peripheral und Client- zu handeln.


Dies ist das Verhalten, das ich erreichen möchte:

1) Gerät 2 startet Werbung (periphere Rolle).

2) Gerät 1 startet das Scannen (zentrale Rolle) und ruft das Werbemittel (BluetoothDevice-Objekt) über die onScanResult-Methode von ScanCallback ab.

3) Ich möchte jetzt die Werbe Gerät (Device 2) mitgeteilt werden, dass es gescannt wurde und in der Lage, die BluetoothDevice mit Gerät verbunden bekommen 1.

4) Die Vorrichtung 1 hat eine Instanz von BluetoothGattServer. Gerät 2 würde nun connectGatt (Kontextkontext, boolescher AutoConnect, BluetoothGattCallback-Rückruf) auf Gerät 1 aufrufen, um eine Instanz von BluetoothGatt zu erhalten.

5) Am Ende ist Gerät 1 Server und Gerät 2 ist Client.


Bisher habe ich festgestellt, dass in Schritt 2, wenn Gerät 1 die BluetoothDevice für Gerät 2 hält, ist es nur als Client wie in Schritt 4 mit connectGatt verbinden kann.

ich im Stande sein könnte die BluetoothGattServer definiert in der Vorrichtung 1, und rufen Sie zu verwenden: gattServer.connect (BluetoothDevice Gerät, boolean autoconnect) mit Gerät sein Gerät 2.

Aber wie wird Gerät 2 benachrichtigt werden, dass es verbunden ist?

Und wie werde ich eine Instanz von BluetoothGatt im Gerät-2 erhalten, wenn ich nicht connectGatt (Context, boolean, BluetoothGattCallback) nennen kann auf einem BluetoothDevice?

Vielen Dank im Voraus für Ihre Hilfe!

Einige Dokumentation:

BluetoothGattServer

BluetoothDevice

+0

Hallo Thomas, haben Sie eine Lösung für Ihr Problem gefunden? – Hollerweger

+0

Hallo Hollerweger, leider habe ich nie die Lösung gefunden. Es war für ein Projekt an der Universität, dass ich meine Arbeit mit zwei Telefonen demonstrierte und erklärte, warum es mit diesem speziellen Mikrocontroller nicht funktionieren könnte. Ich habe seitdem meinen Abschluss gemacht und habe nicht mehr Zeit dafür. Es könnte sich jedoch lohnen zu überprüfen, ob sich mit Android 6 etwas geändert hat. Bitte lassen Sie es mich wissen, wenn Sie etwas herausfinden! ;) –

Antwort

0

Sie müssen umdrehen ein bisschen. Der Scanner verbindet sich mit dem Werbetreibenden. Dev1 scannt dev2 adv und scannt die Antwort.dann sollte dev1 verbinden. Dev2 wird beim Verbindungsaufbau einen Rückruf erhalten. Es gibt keinen Rückruf, wenn jemand Ihre Antwort hört oder Scan-Antwort auf Android anfragt. Überprüfen Sie stattdessen 0x14 «Liste der 16-Bit-Dienstanfragen-UUIDs» von btsig, wenn Sie eine Anforderung für Server mit einem bestimmten Dienst ankündigen möchten, um eine Verbindung zu Ihnen herzustellen. Es ist ein bisschen ungewöhnlich, das zu sehen.

+0

Hallo henrik, danke für deine Antwort. –

+0

Meinst du, dev1 sollte einen BluetoothGattServer öffnen und dann gattServer.connect aufrufen (device2, boolean)? Die Verbindung funktioniert während des Debuggens von dev1, wenn ich das tue. Das Problem ist: Die einzige Möglichkeit BluetoothGatt in dev2 zu bekommen und zu implementieren und den Callback zu implementieren, ist über BluetoothDevice.connectGatt (context, boolean, callback). Und ich kann das nicht in dev2 tun, ohne zu wissen, wer dev1 ist. –

1

1) Gerät 2 startet Werbung (peripherische Rolle).

Peripheral Rolle wird werben, stellen Sie sicher, ANSCHLIESSBAR

 AdvertiseSettings.Builder settingBuilder = new AdvertiseSettings.Builder(); 
    settingBuilder.setConnectable(true); 

und starten Anzeige entsprechend hinzuzufügen.

2) Gerät 1 startet das Scannen (zentrale Rolle) und ruft das Werbemittel (BluetoothDevice-Objekt) über die onScanResult-Methode von ScanCallback ab.

Perfekt, jetzt rufen Sie connectGatt auf diesem Gerät (peripheral), stellen Sie sicher, dass Sie die Werbung stoppen, nachdem Sie erforderliche Gerät erhalten, sonst werden Sie mehrere Verbindungsbefehle senden.

3) Ich möchte jetzt die Werbe Gerät (Device 2) mitgeteilt werden, dass es gescannt wurde und in der Lage, die BluetoothDevice mit Gerät verbunden bekommen 1.

Wenn Sie connectGatt aus Mittel-/Client ruft Rolle, Ihr Peripheriegerät erhält eine Benachrichtigung in seine .

Dort werden Sie wissen, dass die Verbindung hergestellt wurde. Allerdings müssen Sie gatt Service mit Merkmalen an der Peripherie registrieren.

4) Gerät 1 verfügt über eine Instanz von BluetoothGattServer. Gerät 2 würde nun connectGatt (Kontextkontext, boolescher AutoConnect, BluetoothGattCallback-Rückruf) auf Gerät 1 aufrufen, um eine Instanz von BluetoothGatt zu erhalten.

Falsch, Gerät 1 leitet die Verbindung ein, wie in Punkt 3 angegeben. Beide Geräte onConnectionStateChange werden aufgerufen, um zu wissen, dass die Verbindung hergestellt wurde.

5) Am Ende ist Gerät 1 Server und Gerät 2 ist Client.

Wrong, Gerät 2 ist peripher (Server), Geräte-1 Monitor (Client)

+0

Ich habe diese Lösung bereits implementiert und meine App funktioniert auf beiden Seiten gut. Das Problem ist, dass es nicht dem Verhalten entspricht, das ich erreichen möchte.Was ich mit Device 2 versuche, ist die Emulation eines bestimmten Mikrocontrollers, der NICHT nach Geräten suchen kann, aber nur werben kann. (Daher muss Gerät 2 GAP-Peripheriegerät sein und Gerät 1 muss GAP-zentral sein). Allerdings sendet mein Telefon (Gerät 1) die Daten an den Mikrocontroller (Gerät 2), wodurch Gerät 1 zu einem Gatt-Server und Gerät 2 zu einem Gatt-Client wird. –

+0

Das obige entspricht den Definitionen unter ** Rollen und Verantwortlichkeiten ** hier: [BLE Android] (https://developer.android.com/guide/topics/connectivity/bluetooth-le.html) Welcher Gebrauch Denkst du, die folgende Methode kann sein? BluetoothGattServer.connect (BluetoothDevice device, boolean autoConnect) –

+0

BluetoothGattServer.connect kann für die Verbindung verwendet werden, wenn autoConnection den Wert true hat und die Server/Monitor-Rolle das Ereignis disconnected sieht. – AAnkit