iBeacons generados bajo Mavericks OSX funciona, pero tienen algunos bytes diferentes desde iOS

Sigo este proyecto de ejemplo BeaconEmitter bajo OSX para generar muestras iBeacons para desarrollar una aplicación en iPhone. La aplicación BeaconEmitter se basa en el tutorial de Matthew Robinson , y hasta que Apple decida introducir el soporte de iBeacon en Core Location para OSX, la única posibilidad de generar un iBeacon es build el package de publicidad desde cero con IO Bluetooth Framework.

PERO … ¡eso no funciona!

Probé, por supuesto, también el código tutorial de AirLocate de Apple en iOS, y sí, entre dispositivos iOS que funcionan bien. Pero si intentas generar un iBeacon con OSX (BeaconEmitter) y lo recibes con un dispositivo iOS (AirLocate) que no funciona.

Tengo un Sniffer BLE RF basado en el chip TI CC2540 y con el software sniffer TI en Windows. Entonces observo que el package iBeacons generado por AirLocate y por BeaconEmitter fue un poco diferente.

Eso es iBeacon generado con AirLocate: introduzca la descripción de la imagen aquí

Tha es ibeacon generado con BeaconEmitter: introduzca la descripción de la imagen aquí

Después del ingeniero inverso realizado en esta publicación (porque Apple todavía no ha lanzado las especificaciones de iBeacons), es posible ver que el encabezado de PDU Adv es diferente de dos casos. En OSX, Type = 2 y TxAdd = 0, en iOS, Type = 0 y TxAdd = 1.

¿Por qué esta diferencia?

En bruja, ¿es posible obligar a OSX a enviar el mismo encabezado Adv PDU de iOS?

Parece que también en los primeros 5 bytes de AdvData los dos packages no son iguales:

OSX: 02 01 06 1A FF

iOS: 02 01 1A 1A FF

El rest de la carga útil de AdvData está de acuerdo con la publicación de ingeniería inversa vinculada anteriormente.

Una vez más, ¿por qué estos bytes son diferentes?

No encontré de qué parte del código depende la muestra de OSX.

ACTUALIZACIÓN: FUNCIONA

La razón principal porque el iBeacon generado por BeaconEmitter no fue reconocido por AirLocate es culpa mía. No entendí que AirLocate filtra algún ejemplo específico de UUID, es decir: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 o 5A4BCFCE-174E-4BAC-A814-092E77F6B7E5 o 74278BDA-B644-4520-8F0C-720EAF059935 no todos los valores de UUID.

Por lo tanto, el UUID aleatorio generado por BeaconEmitter no coincide con el UUID previamente escrito en AirLocate.

Si puede "forzar" el UUID desde BeaconEmitter con un buen valor, el AirLocate puede reconocerlo:

BeaconEmitter

Entonces esta es la testing exitosa en la aplicación de ejemplo iOS AirLocate:

AirLocate

Sigue las diferencias de los mismos bytes descritos anteriormente … que solo el rastreador puede ver :).

Parece que dices sobre la identificación del enlace Bluetooth entre 2 dispositivos concretos. No es aleatorio porque siempre es igual para cada par de dispositivos.

Será diferente para diferentes pares de dispositivos.

De todas forms, si tiene algunos problemas con las balizas, puede usar el bluetooth básico, que es más complejo, pero también es bastante antiguo y es compatible con una mayor gama de dispositivos y SO