web-dev-qa-db-fra.com

Comment connecter un appareil Android à un appareil iOS via BLE (Bluetooth Low Energy)

J'essaie de créer une application qui utilise la nouvelle API Bluetooth Low Energy d'Android. Pour cela, j'ai commencé avec l'exemple BLE avec API de niveau 18

En lisant qu'Android ne peut pas agir en tant que périphérique, je mets le téléphone Android en mode central en recherchant les périphériques BLE. À cette fin, j'ai effectué des tests avec une plate-forme nordique simulant un capteur cardiaque. Tout fonctionne de manière parfaite!

Après cela, j'essaie de choisir un iPhone (iOS 7 beta 4) et de le placer de manière périphérique en simulant un capteur de fréquence cardiaque comme lors des tests précédents. L'application Android est capable de voir l'appareil et de s'y connecter. Mais une fois la connexion établie, les 2 périphériques se déconnectent en 3 à 4 secondes. De plus, lorsque j'appelle discoverServices () côté Android, aucun rappel n'est déclenché! Dans certains cas, le périphérique Android reçoit l'événement "Connecté" même si la puce Bluetooth iOS est désactivée. C'est très étrange. Pour prouver cela, j’ai mis le Nordic Board en mode central et j’ai pu correctement me connecter au périphérique iOS sans aucun problème. 

Qu'est ce que ça pourrait être? Il existe certaines limitations sur Android ou iOS qui ne permettent pas de se connecter d'un Android à un iOS ou vice-versa.

Merci.

EDIT: Après quelques tests difficiles, j'ai soulevé un problème sur la page de l'AOSP. Il peut être vérifié ici

81
edoardotognoni

Ajouter un résumé pour référence:

Qu'est ce que ça pourrait être? Il existe certaines limitations sur Android ou iOS qui ne permettent pas de se connecter d'un Android à un iOS ou vice-versa.

Lors de la connexion à un serveur du GATT annoncé comme périphérique bimode (BLE et BR/EDR) en appelant connectGatt (...), le drapeau TRANSPORT_AUTO ajouté en interne fait passer Android par défaut au mode BR/EDR ( link ).

Les solutions suivantes sont possibles:

  1. Côté périphérique: arrêtez d'annoncer les capacités du BR/EDR en ajustant Les drapeaux appropriés ( link )
  2. Côté central: définissez explicitement le paramètre de transport sur TRANSPORT_LE en appelant la version masquée de connectGatt () à l'aide de Reflect

Exemple:

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

Édition 4/2016

Comme le souligne Arbel Israeli dans le commentaire, Google a introduit une version surchargée de connectGatt (...) qui permet de spécifier le transport dans Android M.

7
Dominik Gebhart

J'ai écrit un exemple de travail simple, bien relativement simple, et je l'ai inclus open-source sur Github: https://github.com/GitGarage . Jusqu'à présent, il n'a été testé qu'avec un Android Nexus 9 et un iPhone 5s, mais je suppose que cela fonctionnerait également avec un Nexus 6 et divers types d'iPhone. Jusqu'à présent, il est explicitement configuré pour communiquer entre un Android et un iPhone, mais je suppose qu'il est possible de faire beaucoup plus.

2
omikes

Peut-être un peu en retard, mais peut-être que votre douleur peut être soulagée légèrement;)

Nous avons beaucoup expérimenté les connexions BLE entre plates-formes (iOS <-> Android) et avons appris qu'il restait encore de nombreuses incompatibilités et problèmes de connexion. Outre l'instabilité d'Android, vous devriez également considérer que, même à l'heure actuelle, peu d'appareils Android prennent en charge le mode Périphérique BLE.

Par conséquent, si votre cas d'utilisation est axé sur les fonctionnalités et que vous n'avez besoin que d'échanger des données de base, je vous suggérerais de regarder les frameworks et bibliothèques qui peuvent réaliser une communication multiplate-forme pour vous, sans que vous ayez besoin de la construire à partir de zéro.

Par exemple: http://p2pkit.io ou Google à proximité

Disclaimer: Je travaille pour Uepaa, développant p2pkit.io pour Android et iOS.

2
p2pkit

Vous pouvez maintenant transmettre TRANSPORT_LE via BluetoothDevice.connectGatt à partir de l'API 23.

Veuillez consulter les références de la documentation Android ci-dessous:

0
Kevin Crain

les périphériques iOS doivent toujours être des périphériques ou des centraux, mais les périphériques Android ne le sont pas rarement. Dans ce cas, votre périphérique iOS doit être un périphérique et Android doit être un central.

0
Mustafa Demir