wake-up-neo.net

So verbinden Sie ein Android-Gerät über BLE mit einem iOS-Gerät (Bluetooth Low Energy)

Ich versuche, eine Anwendung zu erstellen, die die neue Bluetooth Low Energy API von Android verwendet. Dafür habe ich mit dem BLE-Beispiel mit API Level 18 begonnen. 

Als ich gelesen habe, dass Android nicht als Peripheriegerät fungieren kann, habe ich das Android-Telefon in den zentralen Modus versetzt und nach BLE-Geräten gesucht. Zu diesem Zweck habe ich einige Tests mit einer Nordic-Plattform durchgeführt, die einen Herzsensor simuliert. Alles funktioniert perfekt!

Danach versuche ich, ein iPhone (iOS 7 beta 4) auszuwählen, Peripheriegeräte zu verwenden und einen Herzfrequenzsensor als vorherigen Test zu simulieren. Die Android-App kann das Gerät sehen und eine Verbindung herstellen. Nachdem die Verbindung aktiv ist, trennen sich die beiden Geräte innerhalb von 3-4 Sekunden voneinander. Wenn ich außerdem auf Android-Seite discoverServices () anrufe, wird kein Rückruf ausgelöst! In einigen Fällen empfängt das Android-Gerät das Ereignis "Connected" (Verbunden), auch wenn der iOS-Bluetooth-Chip ausgeschaltet ist. Das ist sehr seltsam. Um das zu beweisen, habe ich das Nordic Board im Central-Modus eingestellt und ich konnte mich problemlos mit dem iOS-Gerät verbinden. 

Was könnte es sein? Es gibt einige Einschränkungen bei Android oder iOS, die keine Verbindung von Android zu iOS oder umgekehrt zulassen.

Vielen Dank.

EDIT: Nach einigen harten Tests habe ich ein Problem auf der AOSP-Seite angesprochen. Es kann hier geprüft werden

81
edoardotognoni

Hinzufügen einer Zusammenfassung als Referenz:

Was könnte es sein? Es gibt einige Einschränkungen bei Android oder iOS, die keine Verbindung von Android zu iOS oder umgekehrt zulassen.

Beim Herstellen einer Verbindung zu einem GATT-Server, der als Dualmode-Gerät (BLE und BR/EDR) durch Aufrufen von connectGatt (...) angekündigt wird, wird das intern hinzugefügte TRANSPORT_AUTO-Flag von Android standardmäßig auf den BR/EDR-Modus ( Verbindung ).

Folgende Problemumgehungen sind möglich:

  1. Peripherie: Stoppen Sie die Werbung für BR/EDR-Funktionen, indem Sie die entsprechenden Flags anpassen ( link ).
  2. Zentrale Seite: Setzen Sie den Transportparameter explizit auf TRANSPORT_LE, indem Sie die verborgene Version von connectGatt () mit Reflection aufrufen

Beispiel:

public void connectToGatt(BluetoothDevice device) {    
   ...    
   Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);    
   int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null);     // LE = 2, BREDR = 1, AUTO = 0    
   BluetoothGatt mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport);    
   ... 
}

Bearbeiten Sie 4/2016

Wie Arbel Israeli in dem Kommentar hervorhebt, hat Google eine überladene Version von connectGatt (...) eingeführt, die es erlaubt, den Transport in Android M anzugeben.

7
Dominik Gebhart

Ich habe ein einfaches Arbeitsbeispiel geschrieben, das relativ einfach ist und auf Github Open-Source enthalten ist: https://github.com/GitGarage . Bisher wurde es nur mit einem Android Nexus 9 und einem iPhone 5s getestet, aber ich gehe davon aus, dass es auch mit einem Nexus 6 und verschiedenen iPhone-Typen funktionieren würde. Bisher ist es explizit eingerichtet, zwischen einem Android und einem iPhone zu kommunizieren, aber ich gehe davon aus, dass es sehr viel mehr tun kann.

2
omikes

Vielleicht etwas verspätet, aber vielleicht lassen sich Ihre Schmerzen etwas lindern;)

Wir haben viel mit plattformübergreifenden BLE-Verbindungen (iOS <-> Android) experimentiert und haben festgestellt, dass es immer noch viele Inkompatibilitäten und Verbindungsprobleme gibt. Abgesehen von der Instabilität von Android sollten Sie auch bedenken, dass bis heute nicht viele Android-Geräte den BLE-Peripheriemodus unterstützen.

Wenn Ihr Anwendungsfall auf Funktionen basiert und Sie nur einen grundlegenden Datenaustausch benötigen, würde ich empfehlen, Frameworks und Bibliotheken zu betrachten, die eine plattformübergreifende Kommunikation für Sie ermöglichen, ohne dass Sie sie von Grund auf neu aufbauen müssen.

Zum Beispiel: http://p2pkit.io oder google in der Nähe

Haftungsausschluss: Ich arbeite für Uepaa und entwickle p2pkit.io für Android und iOS.

2
p2pkit

Sie können jetzt TRANSPORT_LE über BluetoothDevice.connectGatt ab API 23 übergeben.

Bitte beachten Sie die Android-Dokumentationsreferenzen unten:

0
Kevin Crain

iOS-Geräte sind immer ein Peripheriegerät oder eine Zentraleinheit, Android-Geräte können jedoch nicht selten sein. In diesem Fall muss Ihr iOS-Gerät ein Peripheriegerät sein und Android muss eine zentrale Stelle sein. Wir können denken, dass Peripheriegeräte ein Server und die Zentrale ein Client ist. Dies ist einfach.

0
Mustafa Demir