Um einen Raspberry Pi in einen Beacon zu verwandeln benötigt es folgende Komponenten:
- Einen Raspberry Pi (Ich habe das Modell B verwendet, wobei das verwendete Modell aber irrelevant sein sollte)
- Ein Bluetooth 4.0 USB Modul, welches mit BlueZ zusammenarbeiten kann
- Ein Apple iPhone oder Android 4.3 Smartphone, welches Bluetooth 4.0 unterstützt und eine entsprechende App. Diese kann natürlich auch selbstentwickelt sein.
Bevor wir die benötigten Libraries installieren sollten die Paketlisten aktualisiert werden und dabei auch gleich ein Upgrade durchführen, welches die Versionen der installierten Applikationen auf die Neueste aktualisiert:
sudo apt-get update
sudo apt-get upgrade
Anschließend können mittels
sudo apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev
die benötigten Libraries installiert werden.
Dann wird im Home-Verzeichnis ein Ordner mit dem Namen “bluez” erstellt und die Version 5.11 von BlueZ heruntergeladen:
sudo mkdir bluez
cd bluez
sudo wget www.kernel.org/pub/linux/bluetooth/bluez-5.11.tar.xz
Danach wird BlueZ mit den folgenden Befehlen installiert. Der Installationsvorgang nimmt ungefähr 20-30 Minuten in Anspruch. Sofern die oben angeführten Libraries allerdings korrekt installiert wurden, sollte die Installation problemlos verlaufen:
sudo unxz bluez-5.11.tar.xz
sudo tar xvf bluez-5.11.tar
cd bluez-5.11
sudo ./configure --disable-systemd
sudo make
sudo make install
Abschließend kann, sofern noch nicht geschehen, das USB Bluetooth Modul in den Raspberry Pi gesteckt werden und mittels folgendem Befehl neu gestartet:
sudo reboot
Wir wechseln vom Home-Verzeichnis wieder ins bluez-5.11-Verzeichnis
cd ./bluez/bluez5.11/
Hier prüfen wir ob alles richtig konfiguriert und installiert wurde. In diesem Fall sollte der Befehl
tools/hiconfig
die Ausgabe bringen, welche in der Abbildung dargestellt wird:
Noch ist das Bluetooth Modul DOWN wie man bereits in der obigen Abbildung sehen kann. Um das Modul zu aktivieren wird das Host Controller Interface (HCI) benutzt, welches als Schnittstelle zwischen Hardware und Host Stack dient. Es sind folgende Befehle abzusetzen:
sudo tools/hciconfig hci0 up
sudo tools/hciconfig hci0 leadv 0
sudo tools/hciconfig hci0 noscan
Der erste Befehl öffnet und initialisiert das USB Bluetooth Modul. Der zweite aktiviert das sogenannte „Advertising“. Gibt man anstatt der 0 eine 3 mit so wird das Advertising wieder deaktiviert. Der dritte und letzte Befehl schaltet den eigenen Scan des Bluetooth Moduls ab, da dies für einen Beacon nicht relevant ist und höchstens Probleme verursacht.
Mittels dem Befehl
tools/hciconfig -a
kann man sich die Detaildaten ansehen und wie in der nächsten Abbildung dargestellt wird läuft nun unser USB Bluetooth Modul (UP RUNNING):
Zu guter Letzt ist es noch notwendig die entsprechenden Beacon Advertising Daten einzugeben. Dies geschieht mittels:
sudo tools/hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00
Der gesamte Befehl muss natürlich nur in einer Zeile abgesetzt werden. Der Befehl sendet ein HCI Command Packet (cmd) zum LE Controller um die LE Advertising Daten zu ändern. In der Tabelle wird der Befehl nochmals detailliert dargestellt:
Daten |
Beschreibung |
Detail |
---|---|---|
0x08 |
OpCode Group |
LE Controller Commands |
0x0008 |
OpCode Command |
HCI_LE_Set_Advertising_Data |
1E |
Kommandolänge |
30 Zeichen |
02 |
Advertising Typ |
Scannable undirected advertising (ADV_SCAN_IND) |
01 |
Flag 1 |
|
1A |
Flag 2 |
|
1A |
Length |
26 Zeichen |
FF |
Type |
|
4C 00 |
Company |
Dieser Wert steht für Apple |
02 15 |
Beacon Type |
Proximity Beacon (ID & Data Length) |
E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 |
UUID |
Repräsentiert die Applikation (Sollte für alle Beacons gleich sein, welche dem selben Zweck dienen) |
00 00 |
Major |
16-bit ID um z.B. das Gebäude zu identifizieren |
00 00 |
Minior |
16-bit ID um z.B. ein Regal in einem Gebäude zu identifizieren |
C8 |
Measured Power |
Power Calibration Value – wird dazu verwendet die Distanz zum Beacon aufgrund des RSSI-Wertes zu bestimmen |
Nach jedem HCI-Kommando wird an den Host asynchron ein HCI Event geschickt. Die Antwort auf unser vorheriges Kommando ist in der Abbildung dargestellt:
Ein HCI Event besteht aus einem Event Code. In unserem Fall 0x0e, welches für Command Complete steht. Dieses beinhaltet zusätzliche Daten, welche sich beim Command Complete wie in der Tabelle dargestellt zusammensetzen:
Wert |
Beschreibung |
---|---|
01 |
Die Anzahl der HCI Kommandopakete welche erlaubt waren zum Controller des Hosts gesendet zu werden |
08 20 |
Opcode des Kommandos welches dieses Event ausgelöst ht |
00 |
Der Return-Wert. Dieser hängt vom Kommando selbst ab. |
Möchte man mit der Estimote SDK arbeiten reicht es die UUID von
E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61
auf
B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D
zu ändern, welches letztendlich den Befehl:
sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D 00 00 00 00 C8 00
ergibt. Mit dem so modifizierten Beacon kann dann auch die Android Estimote App getestet werden.
Quellen, welche für diesen Artikel verwendet wurden (Danke an alle Beteiligten):
Kevin Townsend, DIY Beacon with a Raspberry Pi
BLE Spezifikation Core Version 4.0 (ZIP-Datei enthält PDF-Datei)
Marcel Holtmann, Einblicke in Bluetooth unter Linux
Wer mehr über den Aufbau der Befehle und die möglichen Befehle wissen möchte sei die oben verlinkte offizielle BLE Spezifikation der Bluetooth Special Interest Group ans Herz gelegt.