Beacons Android / Ubuntu
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 |
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 |
Pour que le beacon survive à un redémarrage, créez un service systemd :
[Unit] |
sudo systemctl daemon-reload |
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 à patcherbluez:
sudo pip install bleurt |
esp32+ Arduino : un ESP32 coûtant moins de 5 € peut diffuser un beacon Eddystone avec la librairieESP32_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).