Obtener la dirección MAC del periférico bluetooth de baja energía

Actualmente estoy trabajando en una aplicación de iOS basada en dispositivos bluetooth de baja energía. Para obtener un identificador único para comparar los periféricos, tengo que obtener la dirección MAC de los periféricos.

Se observa que la propiedad UUID de un dispositivo periférico varía según los dispositivos iOS y también para que el dispositivo periférico obtenga un UUID, deberá conectarse a un dispositivo maestro al menos una vez. Como tengo que ocuparme de los check-in, no quiero establecer una conexión. Al pasar por el portal de servicios bluetooth, descubrí que la información del dispositivo en sí es un servicio que no podría recuperarse a menos que se haya establecido una conexión entre el dispositivo iOS maestro y el dispositivo periférico bluetooth de baja energía.

Descubrí que en Android obtenemos la información completa del dispositivo, incluida su dirección MAC (usando getAddress ()) cuando recibimos la respuesta del dispositivo al escanear el dispositivo.

No encontré ninguna propiedad en la clase CBPeripheral relacionada con la dirección del dispositivo. Otra forma de obtener un parámetro único sería personalizar los datos del anuncio para enviar información adicional con respecto al dispositivo, lo que requiere más trabajo en el lado del firmware.

Entonces, ¿hay alguna forma en iOS de que pueda obtener la dirección MAC del periférico bluetooth de baja energía sin establecer una conexión?

Cualquier ayuda sería muy apreciada.

No hay una API pública para obtener esta información.

Si se trata de una aplicación interna o jailbreak, puede obtener el valor de la clave kLockdownBluetoothAddressKey a través de liblockdown.dylib

La propiedad del identificador de CBPeripheral servirá para su propósito, disponible desde un dispositivo aún no conectado en el método de delegado didDiscoverPeripheral de CBCentralManager:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI CBPeripheral *peripheral ... NSUUID* serverId = [peripheral identifier]; 

Tengo media docena de dispositivos LE con los que estoy experimentando, incluidos varios juegos de dispositivos idénticos. Acabo de confirmar que, en dos dispositivos iOS, los identificadores de todos estos widgets LE eran diferentes, pero para CADA dispositivo iOS, el identificador de cada widget se conservaba en los lanzamientos de aplicaciones e incluso en las eliminaciones y reinstalaciones de aplicaciones. Diría que esto definitivamente demuestra que el sistema operativo está almacenando suficiente información internamente que, para un iThing dado, podrá distinguir y volver a identificar todos los periféricos con los que se encuentra su aplicación, sin conectarse realmente a ellos. También tenga en cuenta que los datos advertisementData , también disponibles antes de la conexión, están llenos de información útil como CBAdvertisementDataLocalNameKey , CBAdvertisementDataManufacturerDataKey , CBAdvertisementDataServiceUUIDsKey , CBAdvertisementDataSolicitedServiceUUIDsKey , y otros, aunque ninguno es tan seguro de identificar de manera única el dispositivo como [identificador de periférico].

No intenté hacer una copia de seguridad y restaurar el dispositivo para demostrar que los UUID se conservaron, pero apostaría que sí, y si no lo están, es algo que Apple consideraría un error.

Los periféricos de baja energía pueden usar la función de privacidad que oculta la dirección MAC, por lo que no es necesariamente posible obtener la dirección antes de la conexión o vinculación. Si de alguna manera obtiene la dirección MAC que pasa por el air, necesita manejar la privacidad o tiene problemas de interoperabilidad.

Apple usa los UUID para abstraer estas características de privacidad, para que los usuarios no tengan que preocuparse por ellas.

La forma correcta de hacerlo, como escribió, es agregar algunos datos específicos del proveedor al paquete de publicidad o usar el servicio de Información del dispositivo.

En nombre de la discusión de los otros profesionales, he encontrado algunos hechos que dicen:

IOS oculta la dirección MAC del dispositivo y genera un UUID. El UUID en iOS es generado por el dispositivo iOS. Los diferentes dispositivos iOS obtendrán diferentes UUID para el mismo periférico. La dirección MAC generalmente se basa en el hardware. Si ambos tenemos iPhones y escaneamos el mismo periférico, veremos diferentes UUID. iOS genera el UUID en el dispositivo y oculta la dirección MAC. Resumen: iOS no le permite obtener la dirección MAC de un dispositivo, sino que le proporciona un UUID aleatorio.

Fuente – https://github.com/don/cordova-plugin-ble-central/issues/77

Según el estudio anterior, he encontrado que no existe una forma única de conectarse al tablero hasta el momento. Cada placa tiene una dirección MAC, que no cambia y es de fácil acceso en (solo) Android, mientras que iOS no funciona. t permite acceder a la dirección MAC del periférico, sin embargo, iOS utiliza esta dirección MAC para crear un identificador de periférico (UUID), que es único en dispositivos (únicos). El identificador periférico para una sola placa es diferente para diferentes dispositivos de iPhone (pero único en un solo dispositivo).

Sin embargo, podemos conectarnos a una placa buscando con el UUID de servicio Bluetooth de Peripheral, pero este UUID de servicio es el mismo para todos los tableros de un tipo, por ejemplo, “Adafruit Feather M0”. Significa que la aplicación buscará alrededor de las placas BLE del mismo tipo (“Adafruit Feather M0”) y se conectará a CUALQUIERA de ellas. Con el fin de conectar a un usuario en particular a un Consejo específico no parece posible hasta ahora debido a la inaccesibilidad de MAC y al dar el UUID aleatorio en iOS.