¿Qué es el perfil Bluetooth iBeacon?

150

Me gustaría crear mi propio iBeacon con algunos kits de desarrollo bluetooth de baja energía. Apple aún no ha publicado una especificación para iBeacons, sin embargo, algunos desarrolladores de hardware han realizado ingeniería inversa del iBeacon a partir del código de muestra de AirLocate y comenzaron a vender kits de desarrollo de iBeacon.

Entonces, ¿qué es el perfil Bluetooth iBeacon?

Bluetooth Low Energy utiliza GATT para el descubrimiento del servicio de perfil LE. Entonces, creo que necesitamos conocer el identificador de atributo, el tipo de atributo, el valor de atributo y quizás los permisos de atributo del atributo iBeacon. Entonces, para un iBeacon con un UUID de E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 un valor mayor de 1 y un valor menor de 1, ¿cuál sería el servicio de perfil Bluetooth GATT?

He aquí algunas suposiciones que hice de la discusión en los foros de Apple y a través de los documentos.

  1. Solo necesita ver el servicio de perfil (GATT) de un periférico Bluetooth para saber que es un iBeacon.

  2. Las teclas Mayores y Menores están codificadas en algún lugar de este servicio de perfil.

Aquí hay algunas compañías con iBeacon Dev Kits que parecen tener esta figura ya:

Esperemos que a tiempo tengamos un perfil publicado en Bluetooth.org como este: https://www.bluetooth.org/en-us/specification/adopted-specifications

PaulWoodIII
fuente
en realidad ahora lo tengo a 4 valores de atributo
PaulWoodIII
@ Dan1One He replicado el servicio usando Light Blue, luego usando el código de muestra AirLocate de Apple No pude calcular el servicio duplicado Creo que hay algo más, también Light Blue no tiene el Mango de Atributo en la lista
PaulWoodIII
¿Está buscando una manera de crear un iBeacon con CBPeripheralManager (que se ejecuta en segundo plano), u otra pieza de software o hardware (que no sea iOS)? Esto conducirá a los detalles requeridos.
Wain
@Wain Estoy tratando de instalar mi propio hardware como se indica en el primer párrafo. Pero como señalé en la pregunta vinculada, podría ser útil para la respuesta de la pregunta vinculada usando CBPeripheralManager anunciando el iBeacon en segundo plano
PaulWoodIII
1
¡Excelente! ¿Puede compartir esa documentación aquí para futuros programadores? Cuando hice la pregunta en 2013, definitivamente todavía no existía
PaulWoodIII

Respuestas:

228

Para un iBeacon con ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, mayor 0, menor 0y potencia de -59transmisión calibrada de RSSI, el paquete de publicidad BLE transmitido se ve así:

d6 be 89 8e 40 24 05 a2 17 6e 3d 71 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 52 ab 8d 38 a5

Este paquete se puede desglosar de la siguiente manera:

d6 be 89 8e # Access address for advertising data (this is always the same fixed value)
40 # Advertising Channel PDU Header byte 0.  Contains: (type = 0), (tx add = 1), (rx add = 0)
24 # Advertising Channel PDU Header byte 1.  Contains:  (length = total bytes of the advertising payload + 6 bytes for the BLE mac address.)
05 a2 17 6e 3d 71 # Bluetooth Mac address (note this is a spoofed address)
02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 # Bluetooth advertisement
52 ab 8d 38 a5 # checksum

La parte clave de ese paquete es el anuncio de Bluetooth, que puede desglosarse así:

02 # Number of bytes that follow in first AD structure
01 # Flags AD type
1A # Flags value 0x1A = 000011010  
   bit 0 (OFF) LE Limited Discoverable Mode
   bit 1 (ON) LE General Discoverable Mode
   bit 2 (OFF) BR/EDR Not Supported
   bit 3 (ON) Simultaneous LE and BR/EDR to Same Device Capable (controller)
   bit 4 (ON) Simultaneous LE and BR/EDR to Same Device Capable (Host)
1A # Number of bytes that follow in second (and last) AD structure
FF # Manufacturer specific data AD type
4C 00 # Company identifier code (0x004C == Apple)
02 # Byte 0 of iBeacon advertisement indicator
15 # Byte 1 of iBeacon advertisement indicator
e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon proximity uuid
00 00 # major 
00 00 # minor 
c5 # The 2's complement of the calibrated Tx Power

Cualquier dispositivo Bluetooth LE que se pueda configurar para enviar un anuncio específico puede generar el paquete anterior. He configurado una computadora Linux usando Bluez para enviar este anuncio, y los dispositivos iOS7 que ejecutan el código de prueba AirLocate de Apple lo recogen como un iBeacon con los campos especificados anteriormente. Ver: Usar BlueZ Stack como periférico (Anunciante)

Este blog tiene detalles completos sobre el proceso de ingeniería inversa.

davidgyoung
fuente
¡Esto es genial! Exactamente lo que estaba buscando. ¿Pero alguien podría explicar cómo puedo calcular la suma de verificación?
Benjamin Groener
Tengo otra pregunta para que nos ayudes a completar la especificación un poco más. ¿Cuál parece ser el intervalo de transmisión correcto en ms? Me doy cuenta de que estoy usando el código de los instrumentos de Texas que estoy usando como base para mi iBeacon, lo que hace que la aplicación Airlocate de Apple sea un poco inconsistente cuando se muestra una lista de iBeacons cercanos.
PaulWoodIII
¿El UUID / proximUUUUID es un perfil BLE específico de iBeacon o depende del fabricante del dispositivo? ¿Cuál es el método preferido para distinguir entre dispositivos iBeacon: la dirección MAC BT, el UUID o los valores mayor / menor?
nickaknudson el
David, ¿has podido configurar un dispositivo iOS con un paquete de publicidad específico al utilizar las API Core Bluetooth GATT? No pude encontrar la opción. Puede definir UUID personalizados para servicios y características, pero no para el anuncio.
miguel
1
@ReinaldoJunior AD = Datos publicitarios. Ver referencias en respuesta por slackhappy.
RenniePet
47

Parece basarse en los datos publicitarios, particularmente los datos del fabricante:

4C00 02 15 585CDE931B0142CC9A1325009BEDC65E 0000 0000 C5

<company identifier (2 bytes)> <type (1 byte)> <data length (1 byte)>
    <uuid (16 bytes)> <major (2 bytes)> <minor (2 bytes)> <RSSI @ 1m>
  • Identificador de la empresa Apple (Little Endian), 0x004c
  • tipo de datos, 0x02 => iBeacon
  • longitud de datos, 0x15 = 21
  • uuid: 585CDE931B0142CC9A1325009BEDC65E
  • mayor: 0000
  • menor: 0000
  • Potencia medida a 1 metro: 0xc5 = -59

Tengo este script node.js trabajando en Linux con el ejemplo de la aplicación AirLocate.

sandeepmistry
fuente
Lamentablemente, el script ya no está disponible. ¿Te importaría compartirlo de nuevo?
Thomaschaaf
@Thomaschaaf lo siento, eliminé aquí hay un enlace a la versión anterior en Github. También he actualizado bleacon para que no requiera desovar hcitool / hciconfig.
sandeepmistry
"potencia medida a 1 metro: 0xc5 = -59" ¿cómo se calcula de 0xc5 a -59?
andreasbecker.de
@ andreasbecker.de tomas el complemento de dos
sandeepmistry
@sandeepmistry el enlace al script node.js ahora está roto.
tedyyu
20

Solo para conciliar la diferencia entre la respuesta de sandeepmistry y la respuesta de davidgyoung:

02 01 1a 1a ff 4C 00

Forma parte de la especificación del formato de datos publicitarios [1]

  02 # length of following AD structure
  01 # <<Flags>> AD Structure [2]
  1a # read as b00011010. 
     # In this case, LE General Discoverable,
     # and simultaneous BR/EDR but this may vary by device!

  1a # length of following AD structure
  FF # Manufacturer specific data [3]
4C00 # Apple Inc [4]
0215 # ?? some 2-byte header

Falta de AD es una definición de Servicio [5]. Creo que el protocolo iBeacon en sí mismo no tiene relación con el GATT y el descubrimiento de servicios estándar. Si descarga el programa iBeacon de RedBearLab, verá que utilizan el GATT para configurar los parámetros de publicidad, pero esto parece ser específico para su implementación y no forma parte de la especificación. El programa AirLocate no parece usar el GATT para la configuración, por ejemplo, de acuerdo con LightBlue u otros programas similares que probé.

Referencias

  1. Core Bluetooth Spec v4, Vol 3, Parte C, 11
  2. Vol. 3, Parte C, 18.1
  3. Vol. 3, Parte C, 18.11
  4. https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers
  5. Vol. 3, Parte C, 18.2
slackhappy
fuente
Gracias @slackhappy, he actualizado mi respuesta. El encabezado de 2 bytes es el tipo de datos 0x02, 0x15 = 21 longitud de datos.
sandeepmistry
gracias @slackhappy esto es bueno, pero ¿puedo hacer una pregunta tonta? Si quisiera enviar un mensaje como "Venga a tomar un café gratis" o algo así, ¿reemplazaría FFen su ejemplo el valor HEX de mi cadena? (¿y también actualizar la longitud de la estructura AD a la suite?)
Marque el
0

El perfil de iBeacon contiene 31 bytes que incluyen los siguientes

  1. Prefijo: 9 bytes, que incluye los datos adv y los datos del fabricante
  2. UUID: 16 bytes
  3. Mayor - 2 bytes
  4. Menor: 2 bytes
  5. TxPower - 1 byte

ingrese la descripción de la imagen aquí

Ambi
fuente