Qu'est-ce que le profil Bluetooth iBeacon

150

J'aimerais créer mon propre iBeacon avec des kits de développement Bluetooth basse consommation. Apple n'a pas encore publié de spécification pour les iBeacons, mais quelques développeurs de matériel ont procédé à une ingénierie inverse de l'iBeacon à partir du code exemple AirLocate et ont commencé à vendre des kits de développement iBeacon.

Alors, quel est le profil Bluetooth iBeacon?

Bluetooth Low Energy utilise GATT pour la découverte de services de profil LE. Je pense donc que nous devons connaître le descripteur d'attribut, le type d'attribut, la valeur d'attribut et peut-être les autorisations d'attribut de l'attribut iBeacon. Donc, pour un iBeacon avec un UUID de E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, une valeur majeure de 1 et une valeur mineure de 1 que serait le service de profil Bluetooth GATT?

Voici quelques hypothèses que j'ai faites à partir de la discussion sur les forums d'Apple et de la documentation.

  1. Il vous suffit de voir le service de profil (GATT) d'un périphérique Bluetooth pour savoir qu'il s'agit d'un iBeacon.

  2. Les clés majeures et mineures sont encodées quelque part dans ce service de profil

Voici quelques entreprises avec des kits de développement iBeacon qui semblent déjà avoir ce chiffre:

Avec un peu de chance, nous aurons un profil publié sur Bluetooth.org comme celui-ci: https://www.bluetooth.org/en-us/specification/adopted-specifications

PaulWoodIII
la source
en fait maintenant je l'ai compris à 4 valeurs d'attribut
PaulWoodIII
@ Dan1One J'ai répliqué le service en utilisant Light Blue, puis en utilisant l'exemple de code AirLocate d'Apple, je ne pouvais pas régler le service dupliqué Je pense qu'il y a quelque chose de plus, Light Blue n'a pas non plus le
descripteur d'
Cherchez-vous un moyen de créer une iBeacon avec CBPeripheralManager (qui s'exécute en arrière-plan), ou un autre logiciel (non-iOS) ou du matériel? Cela mènera au détail requis.
Wain
@Wain J'essaie d'installer mon propre matériel comme le note le premier paragraphe. Mais comme je l'ai noté dans la question liée, cela pourrait potentiellement être utile pour la réponse à la question liée en utilisant CBPeripheralManager annonçant l'iBeacon en arrière
PaulWoodIII
1
Génial! pouvez-vous partager cette documentation ici pour les futurs programmeurs, quand j'ai posé la question en 2013, elle n'existait certainement pas encore
PaulWoodIII

Réponses:

228

Pour un iBeacon avec ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0, majeur 0, mineur 0et calibré Tx Power de -59RSSI, le paquet de publicité BLE transmis ressemble à ceci:

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

Ce paquet peut être décomposé comme suit:

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 partie clé de ce paquet est la publicité Bluetooth, qui peut être décomposée comme ceci:

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

Tout appareil Bluetooth LE qui peut être configuré pour envoyer une publicité spécifique peut générer le paquet ci-dessus. J'ai configuré un ordinateur Linux utilisant Bluez pour envoyer cette publicité, et les appareils iOS7 exécutant le code de test AirLocate d'Apple le récupèrent comme iBeacon avec les champs spécifiés ci-dessus. Voir: Utiliser BlueZ Stack comme périphérique (annonceur)

Ce blog contient tous les détails sur le processus de rétro-ingénierie.

Davidgyoung
la source
C'est bien! Exactement ce que je cherchais. Mais quelqu'un pourrait-il expliquer comment je peux calculer la somme de contrôle?
Benjamin Groener
J'ai une autre question pour vous pour nous aider à compléter un peu plus les spécifications. Quel semble être l'intervalle de diffusion correct en ms? Je remarque que l'utilisation du code des instruments texas que j'utilise comme base pour mon iBeacon rend l'application Airlocate d'Apple un peu incohérente lors de l'affichage d'une liste d'iBeacons à proximité.
PaulWoodIII
L'UUID / proximitéUUID est-il un profil BLE spécifique à iBeacon ou appartient-il au fabricant de l'appareil? Quelle est la méthode préférée pour distinguer les appareils iBeacon: l'adresse MAC BT, l'UUID ou les valeurs majeures / mineures?
nickaknudson
David, avez-vous pu configurer un appareil iOS avec un paquet publicitaire spécifique lors de l'utilisation des API Core Bluetooth GATT? Je n'ai pas trouvé l'option. Vous pouvez définir des UUID personnalisés pour les services et les caractéristiques mais pas pour l'annonce.
miguel
1
@ReinaldoJunior AD = Données publicitaires. Voir les références en réponse par slackhappy.
RenniePet
47

Il semble basé sur des données publicitaires, en particulier les données du fabricant:

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>
  • Identifiant d'entreprise Apple (Little Endian), 0x004c
  • type de données, 0x02 => iBeacon
  • longueur des données, 0x15 = 21
  • uuid: 585CDE931B0142CC9A1325009BEDC65E
  • majeur: 0000
  • mineur: 0000
  • puissance mesurée à 1 mètre: 0xc5 = -59

J'ai ce script node.js fonctionnant sous Linux avec l'exemple d'application AirLocate.

sandeepmistry
la source
Malheureusement, le script n'est plus disponible. Voudriez-vous le partager à nouveau?
Thomaschaaf
@Thomaschaaf désolé j'ai supprimé voici un lien vers l'ancienne version de Github. J'ai également mis à jour bleacon pour ne pas exiger la création de hcitool / hciconfig.
sandeepmistry
"Puissance mesurée à 1 mètre: 0xc5 = -59" comment calcule-t-on de 0xc5 à -59?
andreasbecker.de
@ andreasbecker.de vous prenez le complément à deux
sandeepmistry
@sandeepmistry le lien vers le script node.js est maintenant rompu.
tedyyu
20

Juste pour concilier la différence entre la réponse de Sandeepmistry et la réponse de Davidgyoung:

02 01 1a 1a ff 4C 00

Fait partie de la spécification du format des données publicitaires [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

Une définition de service [5] est absente de l'AD. Je pense que le protocole iBeacon lui-même n'a aucun rapport avec le GATT et la découverte de services standard. Si vous téléchargez le programme iBeacon de RedBearLab, vous verrez qu'ils utilisent le GATT pour configurer les paramètres de publicité, mais cela semble être spécifique à leur implémentation et ne fait pas partie de la spécification. Le programme AirLocate ne semble pas utiliser le GATT pour la configuration, par exemple, selon LightBlue et / ou d'autres programmes similaires que j'ai essayés.

Références:

  1. Core Bluetooth Spec v4, Vol 3, Partie C, 11
  2. Vol 3, partie C, 18.1
  3. Vol 3, partie C, 18.11
  4. https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers
  5. Vol 3, partie C, 18.2
heureux
la source
Merci @slackhappy, j'ai mis à jour ma réponse. L'en-tête de 2 octets est de type de données 0x02, 0x15 = 21 longueur de données.
sandeepmistry
merci @slackhappy c'est bien, mais puis-je poser une question stupide? Si je voulais envoyer un message comme "Venez prendre un café gratuit" ou quelque chose comme ça, est-ce que je remplacerais simplement le FFdans votre exemple par la valeur HEX de ma chaîne? (et aussi mettre à jour la longueur de la structure AD en suite?)
Mark
0

Le profil iBeacon contient 31 octets qui comprend les éléments suivants

  1. Préfixe - 9 octets - qui comprend les données adv et les données du fabricant
  2. UUID - 16 octets
  3. Majeur - 2 octets
  4. Mineur - 2 octets
  5. TxPower - 1 octet

entrez la description de l'image ici

Ambi
la source