Aller au contenu principal
~/GiwiSoft
Beacon

Beacons Android / Ubuntu

Giwi 2 min de lecture Linux

Alors que je me promenais dans les allées du Devoxx, mon smartphone Android a bipé avec une notification provenant d’un « physical web » beacon.

Je me suis dit que ce serait cool d’avoir également ce type de beacon pour propager ma « carte de visite » virtuelle… mais bon, j’ai pas envie d’en acheter un. Faisons avec les moyens du bord.

Sur Android, facile : BeaconToy

Sur Ubuntu :

$ sudo apt-get install bluez bluez-hcidump python3 python3-pip
$ sudo pip install PyBeacon --upgrade
$ sudo PyBeacon -u https://goo.gl/abwWtC

L’url doit être en HTTPS et faire moins de 18 caractères. (plus d’infos ici)

Les formats Eddystone et iBeacon

Il existe deux formats de beacon BLE grand public :

  • iBeacon (Apple, 2013) : diffuse un UUID, un major et un minor. Utilisé pour la proximité, le déclenchement d’actions dans les apps iOS.
  • Eddystone (Google, 2015) : ouvert, plusieurs frames possibles - Eddystone-URL (notre cas), Eddystone-UID, Eddystone-TLM (télémétrie). C’est le protocole derrière le Physical Web.

Notre beacon diffuse une URL Eddystone, que Chrome ou un Physical Web browser interprète au passage.

Scanner les beacons avec hcitool

Pour voir ce qui traîne dans les ondes autour de vous :

$ sudo hcitool lescan --passive

Vous obtenez la liste des adresses MAC des devices BLE qui diffusent. Pour voir les données des paquets publicitaires :

$ sudo hcitool lescan --passive --duplicates

Version plus lisible avec hcidump :

$ sudo hcidump --raw

Créer un beacon avec un Raspberry Pi

Un Raspberry Pi (Zero W ou 3/4) peut diffuser un beacon Eddystone sans batterie externe :

$ sudo apt-get install bluez bluez-hcidump python3 python3-pip
$ sudo pip install PyBeacon --upgrade
$ sudo PyBeacon -u https://votre-site.com

Pour que le beacon survive à un redémarrage, créez un service systemd :

[Unit]
Description=Beacon BLE Eddystone
After=bluetooth.target

[Service]
ExecStart=/usr/local/bin/PyBeacon -u https://votre-site.com
Restart=always
User=root

[Install]
WantedBy=multi-user.target
$ sudo systemctl daemon-reload
$ sudo systemctl enable beacon
$ sudo systemctl start beacon

Alternatives modernes avec BLE

Aujourd’hui (2021+), vous avez d’autres options :

  • bleurt : une bibliothèque Python plus récente pour diffuser des trames BLE sans avoir à patcher bluez :
$ sudo pip install bleurt
$ python3 -c "import bleurt; bleurt.advertise(name='MonBeacon', service_uuid='FEAA')"
  • esp32 + Arduino : un ESP32 coûtant moins de 5 € peut diffuser un beacon Eddystone avec la librairie ESP32_BLE_Arduino. Autonomie : des mois sur une pile CR2032.
  • Mobile : sous iOS, utilisez l’app Physical Web ou Beacon Simulator. Sous Android, BeaconToy reste le plus simple (mentionné plus haut).