Wer sich mit IoT beschäftigt, kommt irgendwann auch auf iBeacons. Letztendlich sind iBeacons kleine Bluetooth Low Energy Sendemodule, die nichts weiter machen als eine definierte Kennung auszusenden. Aber was können wir jetzt damit machen?
Die Möglichkeiten sind fast grenzenlos. Jedes Mobilgerät kann über die Location Services zusammen mit GPS und Wi-Fi seinen Standort bestimmen. Schreibt man jetzt eine App (es gibt allerdings schon reichlich davon in den App-Stores), könnte man zum Beispiel Restaurants, Sehenswürdigkeiten etc. in der Nähe angezeigt bekommen. Alles nichts neues.
Was ist jetzt aber innerhalb eines Gebäudes. Per GPS wissen wir zwar, das wir uns an einer bestimmten Position befinden (solange GPS auch verfügbar ist). Was wir aber nicht wissen ist, in welchem Stockwerk wir uns befinden. Hier kommen iBeacons ins Spiel. Sobald unser Mobilgerät einen iBeacon ortet, können wir in einer App darauf reagieren. Zum Beispiel in einem Museum auf weiterführende Informationen verweisen oder in einem Shop auf das Regal mit Sonderangeboten gegenüber.
Die Idee die ich hier verfolge ist da ähnlich. Zum Beispiel wenn ich in mein Büro komme (oder es verlasse) bestimmte Aktionen durchzuführen (Licht aus, Fenster zu etc.).
Da ich mich fast ausschließlich mit Apple beschäftige, ist auch dieser Artikel sehr Apple-lastig. Die reine Funktion lässt sich aber auch mit anderen Geräten erreichen.
Fangen wir erstmal mit der Hardware an. Wir benötigen natürlich einen (oder mehrere) iBeacons. Diese lassen sich mittlerweile fast überall relativ günstig kaufen. Doch bevor ich jetzt iBeacons kaufe, verwende ich erstmal einige Teile die ich bereits besitze.
Mein erster Gedanke war natürlich ein Raspberry Pi. Das würde auch super funktionieren, allerdings war mir der Raspi zu schade und vor allem zu groß für einen „simplen“ iBeacon. Ich habe deshalb auf einen Onion Omega 2+ zurückgegriffen. Was jetzt nicht bedeuten soll, das dieser weniger nützlich ist. Dieser ist nur viel kleiner und hat genau die Leistungsmerkmale, die ich für dieses Projekt benötige.
Was verwende ich hier alles:
- Onion Omega 2+
- Omega Expansion Board (oder Powerboard, wer unabhängig vom Stromanschluss sein möchte)
- Bluetooth LE Expansion
- 2GB SD-Card
Die komplette Hardware gibt es für unter 50 EUR z.B. hier. Das fertige Setup sieht dabei relativ unspektakulär aus.
Die Ersteinrichtung des Omega überspringe ich an dieser Stelle. Dafür gibt es einen sehr guten Getting started Guide auf der Onion Website. Kommen wir gleich zu Installation der benötigten Pakete auf der Konsole.
Auf dem Omega2+ installieren wir zuerst die benötigten Bluetooth Pakete.
opkg update
opkg install bluez-libs bluez-utils
reboot
Sobald die Installation fertiggestellt und der Omega neu gestartet ist, überprüfen wir noch ob die Bluetooth Erweiterung auch erkannt wurde und funktioniert.
hciconfig hci0 -a
Die Ausgabe auf der Konsole sollte dann wie folgt aussehen:
Danach müssen wir das ganze natürlich noch aktivieren. Die ersten Schritte sind dabei sehr simpel. Mit den nachfolgenden Kommandos aktivieren wir die Erweiterung, setzen den Modus und deaktivieren, dass der Omega selbst nach Bluetooth Geräten scannt (schont den Akku, falls wir das Power Dock verwenden).
hciconfig hci0 up
hciconfig hci0 leadv 3
hciconfig hci0 noscan
Kommen wir nun zum etwas komplexeren Teil, denn der Omega macht bisher ja noch nichts. Wie Eingangs erwähnt, sendet ein iBeacon eine eindeutige Kennung aus auf die wir reagieren wollen. Diese Kennung müssen wir jetzt noch vorbereiten und den Omega so konfigurieren, dass er diese auch sendet. Die Kennung die wir senden besteht im wesentlich aus ein paar Bytes.
- ID (uint8_t) – Die ID ist immer 0x02
- Data Length (uint8_t) – Die Anzahl der Bytes der nachfolgenden Payload = 0x15 (21 in dezimal)
- 128-bit UUID (uint8_t[16]) – Die 128-bit lange ID die wir zur Identifizierung verwenden
- Major (uint16_t) – Ein Major Wert (z.B. um unterschiedliche Standorte zu unterscheiden)
- Minor (uint16_t) – Ein Minor Wert (z.B. um unterschiedliche Büros innerhalb eines Standorts zu unterscheiden)
- TX Power (uint8_t) – Der Wert wird verwendet um die Entfernung zu schätzen, basierend auf dem RSSI Wert
Bauen wir uns jetzt die UUID unseres Omega iBeacons zusammen. Prinzipiell können wir uns eine UUID automatisch bei OpenUUID erstellen lassen. Mac User werden aber sicher lieber im Terminal
uuidgen
Mit dieser eindeutigen UUID bauen wir uns jetzt die iBeacon ID zusammen, was wie folgt aussehen sollte:
Interessant ist hier erstmal der Prefix. Uns interessiert hier jedoch nur der Vendor Teil, der nach dem FF beginnt. In unserem Fall ist das 4c 00, was für Apple steht. Danach folgt die ID (0x02), data length (0x15) sowie die zuvor erstellte UUID. Alles davor können wir einfach so übernehmen.
Fehlt nun noch Major und Minor Teil. Hiermit können wir wie vorher beschrieben, noch bestimmte Standorte oder Orte innerhalb dieser Standorte identifizieren. Der UUID Teil vor Major und Minor sollte für alle iBeacons, die wir einsetzen, immer identisch sein. Das folgende Bild macht das hoffentlich noch etwas klarer.
Abschließend lassen wir den Teil TX Power ebenfalls bei c8 00.
Fertig, jetzt müssen wir unserem Omega nur noch beibringen, diese UUID auch zu senden. Dafür verwenden wir das folgende Kommando:
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
Ein klein wenig Erläuterung zu dem Kommando.
- hcitool -i hci0 = Wir sprechen mit dem HCITOOL die Schnittstelle hci0 an.
- cmd 0x08 0x0008 = Das Kommando 0x08 0x0008 bedeutet LE Set Advertising Data
- z.B bedeuten die folgenden cmd Optionen:
- cmd 0x08 0x0006 LE Set Advertising Parameters
- cmd 0x08 0x000a LE Set Advertise Enable
- Für alle Bluetooth LE Debugging-Themen auf dem Omega eignet sich das Tool hcidump sehr gut.
Das ist ganz nützlich zu Wissen, wenn wir zum Beispiel die Zeit des Absendens der UUID etwas verkürzen wollen. In unserem Fall erledigen wir das mit dem Kommando hciconfig hci0 leadv 3 was ein Standard-Advertisement alle 1250 ms bedeutet.
Wollen wir hier zum Beispiel alle 100 ms die UUID senden, würden die Befehle wie folgt aussehen (Achtung Stromverbrauch beachten):
sudo hciconfig hci0 up 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 hcitool -i hci0 cmd 0x08 0x0006 A0 00 A0 00 03 00 00 00 00 00 00 00 00 07 00 hcitool -i hci0 cmd 0x08 0x000a 01 hciconfig hci0 noscan
Fertig, der Omega 2+ sendet jetzt munter seine UUID.
Wäre doch aber auch schön, wenn wir das überprüfen könnten. Ok, die passende iOS Anwendung würde jetzt den Rahmen sprengen. Ich werde mich aber auch daran machen und hier darüber schreiben. Für die Überprüfung, ob wir auch alles richtig gemacht haben, bedienen wir uns einer fertigen Anwendung aus dem App-Store. Ich verwende hier auf dem iPhone die App Locate Beacon.
Sobald wir die App auf einem iPhone installiert haben, müssen wir noch die UUID nach der gescannt werden soll in den Einstellungen erfassen. Hier benötigen wir NUR die UUID.
Nachdem die App unsere UUID kennt, können wir nach Beacons scannen und sehen sofort unseren Omega 2+.
Wenn jetzt alles funktioniert und der iBeacon gefunden wird, herzlichen Glückwunsch. Unsere Konfiguration hat bis hierher funktioniert. Allerdings ist das jetzt noch nicht Reboot resistent. Um unseren iBeacon auch über einen Reboot hinweg zu verwenden, benötigen wir die Einträge in der Datei /etc/rc.local.
Bei einem frischen Omega sollte uns das Kommando:
cat /etc/rc.local
folgendes anzeigen:
Zum editieren öffnen wir die Datei mit dem vi und tragen alle vorher ausgeführten Kommandos vor dem exit 0 ein und speichern die Datei.
vi /etc/rc.local
hciconfig hci0 up
hciconfig hci0 leadv 3
hciconfig hci0 noscan
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
So, nun hält unser Omega iBeacon auch einen Reboot aus.
Was immer wieder in diesem Zusammenhang diskutiert wird, ist die Sicherheit. Prinzipiell kann das hier etwas vernachlässigt werden. Denn nur wer die UUID des iBeacons kennt, kann diesen in eine App einbinden. Allerdings können Bluetooth Scanner die UUID auch sehr einfach scannen und verwenden. Letztendlich kann aber auch ein Angreifer nichts damit anfangen, denn der iBeacon sendet lediglich seine UUID. Die eigentlich Intelligenz steckt später in einer App, die Aktionen auslöst wenn ein bestimmter Beacon erkannt wird.
Natürlich kann ein Angreifer, der im Besitz einer iBeacon UUID ist, diesen klonen und der entsprechenden App diesen Beacon an einem anderen Standort präsentieren. Hier benötigt die entsprechende App noch weitere Prüfungen (z.B GPS Standort plausibelität etc.). Im wesentlich ist das iBeacon Konzept nicht unsicher, man sollte sich aber vorher darüber im klaren sein, was alles möglich ist und entsprechend in seiner App reagieren.
Als Weiterführung dieses Artikels, werde ich mich um die iOS App kümmern und das ganze dann noch mit Octoblu oder IFTTT verbinden. Also Abwarten, hier kommt bestimmt demnächst noch ein weiterer Artikel.