Emuler un iBeacon avec le Raspberry Pi

Vous avez peut-être entendu parler de la technologie iBeaon d’Apple (j’en parlais là), une technologie qui permet d’utiliser de petits émetteurs Bluetooth LE pour activer des fonctions dans des applications. Et si on se fabriquait un émulateur d’iBeacon ? Avec mon petit appareil préféré, le Raspberry Pi.
Bluetooth-Logo

L’idée est simple : utiliser le Raspberry Pi et un adaptateur Bluetooth USB pour émettre les informations que l’on veut. Un iBeacon, c’est simplement un UUID (une longue chaîne d’identification) et deux valeurs, donc c’est assez simple à émuler.

On trouve des solutions plus compactes, mais le Raspberry Pi n’est pas très cher et c’est assez simple à faire. Le principal problème, c’est trouver un adaptateur USB compatible.

J’ai suivi le tutorial qui est là, avec quelques modifications.

Le point le plus important est d’utiliser un contrôleur Bluetooth doté de la bonne puce. Si plusieurs constructeurs proposent des modèles compatibles avec le Bluetooth LE (Low Energy, parfois appelé Bluetooth Smart ou Bluetooth 4.0), attention : l’émulation de iBeacon ne fonctionne qu’avec un contrôleur d’origine Broadcom. Les modèles CSR ne fonctionnent pas. Dans les exemples de modèles compatibles, j’ai le GBU521 de chez IOGEAR.

La première chose à faire est de mettre à jour Raspbian, la distribution dédiée au Raspberry Pi.

sudo apt-get update
sudo apt-get upgrade

On a d’abord besoin de quelques packages.

sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev

On va maintenant installer une version adaptée de BlueZ, la stack (pilote) Bluetooth pour Linux. Il faut compiler manuellement une version récente, celle livrée avec le Raspberry Pi ne prenant pas en compte le Bluetooth LE au moment de la rédaction du post.

wget www.kernel.org/pub/linux/bluetooth/bluez-5.11.tar.xz
unxz bluez-5.11.tar.xz
tar xvf bluez-5.11.tar
cd bluez-5.11
./configure -disable-systemd
make
sudo make install

Maintenant, une petite commande pour vérifier si la puce fonctionne.

hciconfig

Si la troisième ligne indique DOWN, il faut lancer la commande suivante.

sudo hciconfig hci0 up

Tester si ça fonctionne

Deux commandes. La première configure la puce, la seconde lance la détection.

sudo hcitool -i hci0 cmd 0x08 0x0008 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 00 00 00 c5 00 00 00 00 00 00 00 00 00 00 00 00 00
sudo hciconfig hci0 leadv 0

Ca fonctionne avec AirLocate, un programme de test Apple a compiler pour votre appareil iOS et disponible sur le site d’Apple (dans WWDC 2013 Sample Code, il faut être développeur).

Pour simplifier les choses, on peut automatiser le tout.

nano ibeacon.conf

Avec le contenu suivant :

export BLUETOOTH_DEVICE=hci0
export UUID="e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0"
export MAJOR="00 00"
export MINOR="00 00"
export POWER="c9"

Ensuite, un script de lancement et un script de fermeture.

nano start

Le contenu :

#!/bin/sh
. ./ibeacon.conf
echo "Launching virtual iBeacon..."
sudo hciconfig $BLUETOOTH_DEVICE up
sudo hciconfig $BLUETOOTH_DEVICE noleadv
sudo hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 1a 1a ff 4c 00 02 15 $UUID $MAJOR $MINOR $POWER 00 00 00 00 00 00 00 00 00 00 00 00 00
sudo hciconfig $BLUETOOTH_DEVICE leadv 0
echo "Complete"

Le second script :

nano stop

Le contenu :

#!/bin/sh
. ./ibeacon.conf
echo "Disabling virtual iBeacon..."
sudo hciconfig $BLUETOOTH_DEVICE noleadv
echo "Complete"

On rend le tout exécutable.

chmod 777 start
chmod 777 stop

Et voilà, on peut émuler un iBeacon facilement (en modifiant les valeurs) en utilisant les deux commandes suivantes. Par exemple si Apple active le support des iBeacon dans ses Apple Store

./start
./stop

Pour ceux que ça intéresse, il est possible de lancer le tout au démarrage, comme expliqué là.