Obtención de datos de respuesta de escaneo LE de Bluetooth con iOS

Estoy trabajando con dispositivos Bluetooth Low Energy, y me preguntaba si es posible leer los datos de respuesta de escaneo a un anuncio con iOS y Core Bluetooth sin connection.

Entiendo que después de leer un package de publicidad, puede solicitar datos adicionales desde el periférico en el formatting de una respuesta de escaneo de 31 bytes. Sé que Core Bluetooth sugiere que si el package de anuncios está lleno, puede poner el nombre local en el package de respuesta de exploración, pero ¿le permite ver el package completo?

Sí, puede usar CoreBluetooth para leer los bytes completos de un anuncio de BLE , siempre que NO sea un anuncio de iBeacon. Si se trata de un anuncio de iBeacon, CoreBluetooth bloqueará su capacidad para ver los bytes. La callback que usa es la siguiente:

 - (void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 

Los bytes sin formatting estarán presentes dentro del NSDictionary *advertisementData . Pero la key de retención de esos datos será eliminada por el sistema operativo de iBeacons.

Aquí hay un ejemplo de lo que obtienes en la NSDictionary de datos NSDictionary en la callback. Este ejemplo es para detectar un anuncio de AltBeacon (un estándar de baliza de fuente abierta), con identificadores 2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6 1 2

 { kCBAdvDataIsConnectable = 0; kCBAdvDataManufacturerData = <1801beac 2f234454 cf6d4a0f adf2f491 1ba9ffa6 00010002 be00>; } 

Puede ver cómo decodificar los bytes anteriores mirando la especificación AltBeacon aquí.

Para get más detalles sobre por qué no puede leer los datos de iBeacon junto con el código adicional que muestra cómo configuró esto, consulte aquí:

http://developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html

Estoy trabajando con un periférico que tiene algunos datos del fabricante que creo que se transmiten en la respuesta de escaneo porque no hay lugar para ello en el anuncio inicial con un canal UUID plus de 128 bits, RSSI y un indicador conectable. Estoy recibiendo dos llamadas a didDiscoverPeripheral: … en rápida sucesión (3 ms aparte, incluyendo un cierto time de manejo en mi código). El primero no tiene la key kCBAdvDataManufacturerData en dict, pero el segundo sí. Estoy asumiendo que la respuesta de escaneo se solicita automáticamente y la respuesta da como resultado la segunda llamada.