Apple a annoncé la sortie imminente d’iBeacon, de petits appareils communiquant à l’aide du standard Bluetooth Low Energy. Ils seront utilisés afin de notifier leur présence à des appareils proches, tel q’un iPhone. Il sera ainsi possible par exemple de localiser un utilisateur dans un centre commercial équipé d’iBeacons, afin par exemple de guider l’utilisateur à l’aide d’une application spécifique.

La question que tout le monde s’est posé lors de cette annonce est : quel est le format exact échangé entre un iPhone et un iBeacon ? Bien qu’aucun iBeacon n’ait encore été livré à l’heure actuelle, Apple a fourni une application d’exemple, AirLocate, qui peut non seulement servir à découvrir les iBeacon proche, mais également tranformer un iPhone en iBeacon. Nous allons utiliser ceci pour déterminer le format.

En premier lieu, nous allons configurer l’iPhone afin de faire office d’iBeacon (un iPhone compatible est nécessaire). Tout d’abord, [télécharger](https://developer.apple.com/downloads/index.action?name=WWDC%202013#), compiler et installer AirLocate depuis le site d’Apple (un compte développeur est nécessaire). Lancer l’application, aller dans configuration, passer en “Enabled” puis “save”. L’iPhone est prêt à faire office d’iBeacon.

Commençons par activer le bluetooth, si ce n’est pas déjà fait :

# hciconfig hci0 up

(note : hciconfig, hcidump et hcitool sont dans le paquet bluez-utils)

Dans un premier terminal, nous pouvons initier la capture des paquets bluetooth :

# hcidump

Dans un second, nous lançons le scan des appareils proches :

# hcitool lescan

Le premier terminal devrait sortir quelque chose comme ça :

HCI sniffer - Bluetooth packet analyzer ver 5.9
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 value 0x00 (scanning disabled) filter duplicates 0x01 (enabled) > HCI Event: Command Complete (0x0e) plen 4
LE Set Scan Enable (0x08|0x000c) ncmd 1
status 0x00
< HCI Command: LE Set Scan Parameters (0x08|0x000b) plen 7 type 0x01 (active) interval 10.000ms window 10.000ms own address: 0x00 (Public) policy: All > HCI Event: Command Complete (0x0e) plen 4
LE Set Scan Parameters (0x08|0x000b) ncmd 1
status 0x00
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 value 0x01 (scanning enabled) filter duplicates 0x01 (enabled) > HCI Event: Command Complete (0x0e) plen 4
LE Set Scan Enable (0x08|0x000c) ncmd 1
status 0x00
> HCI Event: LE Meta Event (0x3e) plen 42
LE Advertising Report
ADV_IND - Connectable undirected advertising (0)
bdaddr 4D:C6:94:98:16:3B (Random)
Flags: 0x1a
Unknown type 0xff with 25 bytes data
RSSI: -59
> HCI Event: LE Meta Event (0x3e) plen 12
LE Advertising Report
SCAN_RSP - Scan Response (4)
bdaddr 4D:C6:94:98:16:3B (Random)
RSSI: -59

La partie intéressante est l’avant-dernière (le reste est juste de la communication entre le contrôlleur bluetooth et le driver). Nous voyons passer un « advetising report » contenant des données spécifiques. En ajoutant -R à hcidump, nous pouvons voir ces données :

# hcidump -R
HCI sniffer - Bluetooth packet analyzer ver 5.9
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< 01 0C 20 02 00 01 > 04 0E 04 01 0C 20 00
< 01 0B 20 07 01 10 00 10 00 00 00 > 04 0E 04 01 0B 20 00
< 01 0C 20 02 01 01 > 04 0E 04 01 0C 20 00
> 04 3E 2A 02 01 00 01 3B 16 98 94 C6 4D 1E 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
01 00 02 C5 C5
> 04 3E 0C 02 01 04 01 3B 16 98 94 C6 4D 00 C5

Le paquet intéressant est donc

04 3E 2A 02 01 00 01 3B 16 98 94 C6 4D 1E 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
01 00 02 C5 C5

Que nous pouvons découper ainsi :

04 3E 2A 02 01 00 01 3B 16 98 94 C6 4D 1E 02 01 1A FF # Entête bluetooth
4C 00 02 15 # Entête iBeacon
E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0 # UUID
00 01 # Major
00 02 # Minor
C5 # RSSI de référence (à moins d’un mètre)
C5 # RSSI détecté (éloignez le téléphone de quelques mètres pour changer la valeur)

Pour la signification de l’entête bluetooth, se référer aux spécifications[1], mais ce n’est pas très intéressant. L’entête iBeacon n’étant pas documentée, découvrir sa signification semble difficile.

Plus tard, nous verrons comment faire l’inverse, c’est-à-dire générer des paquets iBeacon à l’aide de bluez-utils.

[1] https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=229737, Volume 2 - Core System Package, Part E - Host Controller Inetrface functional Specification, 7.7.65.2 LE Advertising Report Event