¿Qué es el perfil Bluetooth de iBeacon?

Me gustaría crear mi propio iBeacon con algunos kits bluetooth de bajo consumo de energía. Apple aún no ha lanzado una especificación para iBeacons, sin embargo, algunos desarrolladores de hardware han invertido Diseñado el iBeacon del código AirLocate Sample y comenzaron a vender kits de desarrollo iBeacon.

Entonces, ¿qué es el perfil Bluetooth de iBeacon?

Bluetooth Low Energy usa GATT para el descubrimiento del service de perfil LE. Por lo tanto, creo que necesitamos conocer el identificador de atributo, el tipo de atributo, el valor del atributo y, tal vez, los permissions 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 service del perfil Bluetooth GATT?

Aquí hay algunos supuestos que hice a partir de la discusión en los foros de Apple y en los documentos.

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

  2. Las keys mayor y menor se codifican en algún lugar de este service de perfil.

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

  • http://networkingbearlab.com/ibeacon/
  • http://kontakt.io/

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

Para un iBeacon con ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 , mayor 0 , menor 0 y potencia Tx calibrada de -59 RSSI, el package de anuncios 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 package 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 key de ese package es el anuncio de Bluetooth, que se puede desglosar 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 pueda configurarse para enviar un anuncio específico puede generar el package anterior. He configurado una computadora Linux usando Bluez para enviar este anuncio, y los dispositivos iOS7 que ejecutan el código de testing AirLocate de Apple lo recogen como un iBeacon con los campos especificados anteriormente. Consulte: Use BlueZ Stack As A Peripheral (Anunciante)

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

Parece basarse en datos publicitarios, particularmente en 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 empresa de Apple (Little Endian), 0x004c
  • tipo de datos, 0x02 => iBeacon
  • longitud de datos, 0x15 = 21
  • uuid: 585CDE931B0142CC9A1325009BEDC65E
  • mayor: 0000
  • menor: 0000
  • potencia medida en 1 metro: 0xc5 = -59

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

Solo para reconciliar la diferencia entre la respuesta de Sandeepmistry y la respuesta de David:

 02 01 1a 1a ff 4C 00 

Es parte de la especificación de formatting 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 del AD es una definición del Servicio [5]. Creo que el protocolo iBeacon en sí mismo no tiene ninguna relación con el GATT y el descubrimiento de services estándar. Si descarga el progtwig iBeacon de RedBearLab, verá que utilizan el GATT para configurar los parameters de anuncio, pero esto parece ser específico para su implementación y no forma parte de la especificación. El progtwig AirLocate no parece usar el GATT para la configuration, por ejemplo, según LightBlue u otros progtwigs 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

Si la razón por la que hace esta pregunta es porque desea usar Core Bluetooth para anunciarse como un iBeacon en lugar de utilizar la API estándar, puede hacerlo fácilmente anunciando un NSDictionary como:

 { kCBAdvDataAppleBeaconKey = <a7c4c5fa a8dd4ba1 b9a8a240 584f02d3 00040fa0 c5>; } 

Vea esta respuesta para más información.

Es muy simple, solo anuncia una cadena que contiene algunos caracteres que se ajustan al estándar iBeacon de Apple. puede consultar el enlace http://glimwormbeacons.com/learn/what-makes-an-ibeacon-an-ibeacon/