Raspberry Pi in einen BLE Beacon verwandeln

Share This Post

Um einen Raspberry Pi in einen Beacon zu verwandeln benötigt es folgende Komponenten:

  1. Einen Raspberry Pi (Ich habe das Modell B verwendet, wobei das verwendete Modell aber irrelevant sein sollte)
  2. Ein Bluetooth 4.0 USB Modul, welches mit BlueZ zusammenarbeiten kann
  3. 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:
Ausgabe von hciconfig

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):
PiBeaconAbb2

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
Field (OGF)

LE Controller Commands

0x0008

OpCode Command
Field (OCF)

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:
Antwort auf die Änderung der Advertising Daten

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.

Was Sie auch interessieren könnte:

Sie wollen Schwung in Ihre Digitalisierung bringen?

Schreiben Sie uns und wir bleiben in Kontakt

Lass uns ins Gespräch kommen