Estoy intentando crear una aplicación que utilice la nueva API de Bluetooth Low Energy de Android. Para esto, comencé con la muestra BLE que viene con API nivel 18 .
Cuando leí que Android no puede actuar como un periférico, puse el teléfono Android en modo central, buscando dispositivos BLE a su alrededor. Para ello, realicé algunas pruebas con una plataforma nórdica simulando un sensor cardíaco. ¡Todo funciona a la perfección!
Después de esto, trato de coger un iPhone (iOS 7 beta 4) y ponerlo de forma periférica y simulando un sensor de frecuencia cardíaca como la prueba anterior. La aplicación de Android puede ver el dispositivo y conectarse a él. Pero una vez que la conexión está activa, los 2 dispositivos se desconectan entre sí en 3-4 segundos. Además de eso, cuando llamo a discoverServices () en el lado de Android, ¡no se activa ninguna devolución de llamada! En algunos casos, el dispositivo Android recibe el evento "Conectado" incluso si el chip Bluetooth de iOS está apagado. Esto es muy extraño. Para demostrarlo, puse el Nordic Board en modo Central y pude conectarme correctamente al dispositivo iOS sin problemas.
¿Qué podría ser? ¿Existen algunas limitaciones en Android o iOS que no permiten conectarse de un Android a un iOS o viceversa?
Gracias.
EDITAR: Después de algunas pruebas duras, planteé un problema en la página de AOSP. Se puede consultar aquí
fuente
Respuestas:
Agregar un resumen como referencia:
¿Qué podría ser? ¿Existen algunas limitaciones en Android o iOS que no permiten conectarse de un Android a un iOS o viceversa?
Cuando se conecta a un servidor GATT que se anuncia como dispositivo de modo dual (BLE y BR / EDR) llamando a connectGatt (...), la marca TRANSPORT_AUTO que se agrega internamente hace que Android tenga por defecto el modo BR / EDR ( enlace ).
Son posibles las siguientes soluciones:
Ejemplo:
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); ... }
Editar 4/2016
Como Arbel israelí señaló en el comentario, Google presentó una versión sobrecargada de connectGatt (...) lo que permite especificar el transporte en Android M .
fuente
Escribí un ejemplo de trabajo simple, relativamente simple, y lo incluí de código abierto en Github: https://github.com/GitGarage . Hasta ahora solo se ha probado con un Android Nexus 9 y un iPhone 5s, pero supongo que también funcionaría con un Nexus 6 y varios tipos de iPhone. Hasta ahora está configurado explícitamente para comunicarse entre un Android y un iPhone, pero supongo que se puede modificar para hacer mucho más.
fuente
Quizás un poco retrasado, pero quizás su dolor pueda aliviarse un poco;)
Hemos estado experimentando mucho con conexiones BLE multiplataforma (iOS <-> Android) y aprendimos que todavía existen muchas incompatibilidades y problemas de conexión. Aparte de la inestabilidad de Android, también debe considerar que todavía, a día de hoy, no muchos dispositivos Android son compatibles con el modo BLE Peripheral.
Por lo tanto, si su caso de uso se basa en funciones y solo necesita un intercambio de datos básico, le sugiero que mire los marcos y bibliotecas que pueden lograr la comunicación entre plataformas para usted, sin necesidad de crearla desde cero.
Por ejemplo: http://p2pkit.io o google cercano
Descargo de responsabilidad: trabajo para Uepaa, desarrollando p2pkit.io para Android e iOS.
fuente
Ahora puede pasar a
TRANSPORT_LE
travésBluetoothDevice.connectGatt
de API 23.Consulte las referencias de la documentación de Android a continuación:
fuente
Los dispositivos iOS siempre serán periféricos o centrales, pero los dispositivos Android no pueden serlo raras veces. En este caso, tu dispositivo iOS debe ser un periférico y Android debe ser una central. Podemos pensar que el periférico es un servidor y la central es un cliente. Esto es simple.
fuente