Ich versuche eine Anwendung zu erstellen, die die neue Bluetooth Low Energy API von Android verwendet. Zu diesem Zweck habe ich mit dem BLE-Beispiel begonnen, das mit API-Level 18 geliefert wurde .
Als ich las, dass Android nicht als Peripheriegerät fungieren kann, versetzte ich das Android-Telefon in den zentralen Modus und suchte nach BLE-Geräten . Zu diesem Zweck habe ich einige Tests mit einer nordischen Plattform durchgeführt, die einen Herzsensor simuliert. Alles funktioniert perfekt!
Danach versuche ich, ein iPhone (iOS 7 Beta 4) auszuwählen , es peripher zu platzieren und einen Herzfrequenzsensor wie beim 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 auf Android-Seite removeServices () aufrufe, wird außerdem kein Rückruf ausgelöst! In einigen Fällen empfängt das Android-Gerät das Ereignis "Verbunden", auch wenn der iOS-Bluetooth-Chip ausgeschaltet ist. Das ist sehr seltsam. Um dies zu beweisen, habe ich das Nordic Board in den Zentralmodus versetzt und konnte problemlos eine Verbindung zum iOS-Gerät herstellen.
Was könnte es sein? Es gibt einige Einschränkungen für 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 überprüft werden
quelle
Antworten:
Hinzufügen einer Zusammenfassung als Referenz:
Was könnte es sein? Es gibt einige Einschränkungen für Android oder iOS, die keine Verbindung von Android zu iOS oder umgekehrt zulassen.
Wenn Sie eine Verbindung zu einem GATT-Server herstellen, der durch Aufrufen von connectGatt (...) als Dualmode-Gerät (BLE und BR / EDR) angekündigt wird, wird Android durch das intern hinzugefügte TRANSPORT_AUTO-Flag standardmäßig auf den BR / EDR-Modus ( Link ) zurückgesetzt.
Folgende Problemumgehungen sind möglich:
Beispiel:
Bearbeiten 4/2016
Wie Arbel Israeli in dem Kommentar betonte, führte Google eine überladene Version von connectGatt (...) ein , mit der der Transport in Android M angegeben werden kann .
quelle
Ich habe ein einfaches Arbeitsbeispiel geschrieben, das relativ einfach ist, und es Open Source in Github aufgenommen: 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 für die Kommunikation zwischen einem Android und einem iPhone eingerichtet, aber ich gehe davon aus, dass es optimierbar ist, viel mehr zu tun.
quelle
Vielleicht etwas verspätet, aber vielleicht können deine Schmerzen etwas gelindert werden;)
Wir haben viel mit plattformübergreifenden BLE-Verbindungen (iOS <-> Android) experimentiert und festgestellt, dass es immer noch viele Inkompatibilitäten und Verbindungsprobleme gibt. Abgesehen von der Instabilität von Android sollten Sie auch berücksichtigen, dass bis heute nicht viele Android-Geräte den BLE-Peripheriemodus unterstützen.
Wenn Ihr Anwendungsfall funktionsgesteuert ist und Sie nur einen grundlegenden Datenaustausch benötigen, würde ich empfehlen, sich Frameworks und Bibliotheken anzuschauen, die eine plattformübergreifende Kommunikation für Sie ermöglichen, ohne dass Sie diese 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.
quelle
Sie können jetzt
TRANSPORT_LE
überBluetoothDevice.connectGatt
ab API 23 übergeben.Bitte beachten Sie die folgenden Hinweise zur Android-Dokumentation:
quelle
iOS-Geräte sind immer Peripheriegeräte oder Zentralgeräte, Android-Geräte jedoch nicht selten. In diesem Fall muss Ihr iOS-Gerät ein Peripheriegerät und Android ein Zentralgerät sein. Wir können uns vorstellen, dass Peripheriegeräte ein Server und Zentralgeräte ein Client sind. Dies ist einfach.
quelle