21.02.2014

iBeacon mit dem Raspberry Pi (Apples Bluetooth-Low-Energy indoor-Navigation)

Apple hat mit IOS 7 die iBeacon-Technologie eingeführt. Die zugehörige Empfänger-Hardware ist auf dem iPhone (ab iPhone 4s) und iPad (ab 3. Generation + iPad mini) vefügbar.

Ältere Geräte haben kein Bluetooth Low Energy und funktionieren nicht mit iBeacons! Das Gegenstück - die iBeacon selbst - kann man entweder fertig kaufen, oder mit einem Raspberry Pi selbst bauen.

Schnellstart : iBeacon mit dem Raspberry Pi

  1. auf dem Raspberry Pi: Image installieren: 2014-01-07-wheezy-raspbian 
  2. BLE-Dongle in RasPi stecken
  3. bluetooth-Software installieren (als root):

apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev
wget www.kernel.org/pub/linux/bluetooth/bluez-5.14.tar.xz
unxz bluez-5.27.tar.xz
tar xvf bluez-5.27.tar
cd bluez-5.27/
LDFLAGS=-lrt ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library -disable-systemdmake
make install

4. Beacon starten
hciconfig hci0 up
hciconfig hci0 leadv 3 
hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 91 2E 23 A0 97 1E 11 E3 A5 E2 08 00 20 0C 9A 66 00 00 00 00 C5 00

5. iBeacon-App auf iPhone installieren (iBeacon locate (Radius Networks) oder AirLocate (Apple))

6. App für UUID 912E23A0-971E-11E3-A5E2-0800200C9A66 konfigurieren
7. fertig



Details/Erläuterung

Was ist eine iBeacon?

Eine iBeacon ist zunächst einmal ein Sender, der der per Bluetooth Low Energy (BLE) eine UUID und ein bischen Zusatzinformation sendet. Kommunikation geht also nur von der iBeacon in Richtung mobiles Endgerät, in die andere Richtung wird nichts übertragen. Auf Bluetooth-Ebene sind das Bluetooth-Low-Energy-Advertisement-Packets, die  im Sekundenrhytmus ausgestrahlt werden.

App wird in der Nähe einer iBeacon aktiv

Das Mobilgerät empfängt nun diese Advertisement-Pakete. Ist eine UUID dabei, die in einer installierten App zugeordnet ist, wird diese App angezeigt und sogar gestartet, falls sie gerade nicht aktiv ist.  Die App weiß nun, daß jetzt eine zugeordnete iBeacon in der Nähe ist und kann entsprechende Aktionen ausführen. Sind mehrere iBeacons im Empfangsbereich, kann durch Triangulation sogar der Standort genauer bestimmt werden. Reichweite eines iBeacons sind nominal etwa 50m, in Gebäuden deutlich weniger, je nach Situation.

Use cases

Use-cases können z.B. Läden sein, die einen Kunden auf ein Sonderangebot hinweisen, oder Museen, die Zusatzinformationen zu bestimmten Kunstwerken liefern, Lenken von Besuchern in Stadien, etc. Wichtig ist, daß dem Mobilgerät nur der Standort bekannt gemacht wird, eine App muß darauf entsprechend reagieren und die eigentliche Information an den Benutzer liefern.

Die iBeacon-Technologie wird oft als Apples Antwort auf NFC gesehen - das trifft aber nicht den Kern der Sache, NFC hat nur eine Reichweite von wenigen cm, eine iBeacon reicht wesentlich weiter.

iBeacon-Hardware

Verschiedene Hersteller bieten fertige iBeacons an, oder haben die Lieferung angekündigt. Das sind meist Knopfzellen-betriebene Geräte, die z.B. an ein Regal geklebt werden können.

Raspberry Pi als iBeacon

Mit einem Raspberry Pi und einem Bluetooth-Low-Energy (BLE) -Dongle geht das auch und man kann damit viel leichter (per Software) die UUID und andere Parameter ändern. Nachteil ist natürlich der höhere Energieverbrauch.

Im Internet gibt es dazu Anleitungen, es sind allerdings einige Stolperfallen zu überwinden (wenn man Pech hat)

http://learn.adafruit.com/pibeacon-ibeacon-with-a-raspberry-pi/overview
http://developer.radiusnetworks.com/ibeacon/virtual.html

Hardware: Bluetooth Low-Energy-Dongle.

Ein normales USB-Dongle funktioniert nicht! Das Dongle muß Bluetooth Low Energy (BLE) unterstützen - wenn "Bluetooth V4.0", "Bluetooth smart" oder "Bluetooth smart ready"  auf der Packung steht, ist das meist der Fall.

Ich habe mit zwei verschiedenen Dongles Erfolg gehabt.

1. LogiLink USB Bluetooth V4.0 Dongle.
Die USB-ID dieses Dongle ist 0a12:0001. Gekauft bei Pollin.de - es kommt in so einer Packung:

2. Plugable USB-BT4LE Bluetooth 4.0 USB Adapter for Windows and Linux PCs
http://plugable.com/products/usb-bt4l.
USB-ID ist 0a5c:21e8. Gekauft habe ich dieses Dongle bei Amazon.de

Software:

Als OS-Image für den Raspberry Pi (Model B) verwende ich 2014-01-07-wheezy-raspbian.zip. Zusätzlich müssen einige Software-Packages installiert und dann die aktuelle BlueZ-Software (Bluetooth-Stack) gebaut werden. Dazu loggt man sich als root auf dem RasPi ein und führt folgendes aus (make dauert etwa 30 Minuten):

apt-get install libusb-dev libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev
wget www.kernel.org/pub/linux/bluetooth/bluez-5.14.tar.xz
unxz bluez-5.14.tar.xz
tar xvf bluez-5.14.tar
cd bluez-5.14/
./configure --disable-systemd
make
make install

Anschließend braucht man eine UUID (die man sich z.B. bei http://www.famkruithof.net/uuid/uuidgen generieren kann oder man erfindet selbst eine) als Identifikation des iBeacon.

Zusätzlich wird eine MAJOR-Nummer (16 Bit, Gruppe von iBeacons) und eine MINOR-Nummer (16 Bit, individuelle iBeacon) mitgesendet. Als letzter Wert kommt noch die RSSI (Received Signal Strength Indicator) hinzu, das ist ein Wert für die Sendeleistung. Aus der RSSI und der tatsächlich empfangenen Signalstärke kann der Empfänger die Entfernung zum Sender abschätzen.

Eine App horcht auf eine festgelegte UUID, MINOR und MAJOR sind dabei beliebig. Ein guter Anfangswert für RSSI ist -59, das entspricht 0xC5 (hex).

Hier die von mir verwendeten Werte:

iBeacon prefix: 02 01 06 1A FF 4C 00 02 15 (fix)
UUID: 912E23A0-971E-11E3-A5E2-0800200C9A66
MAJOR: 0000
MINOR: 0000
RSSI:  C5

mit diesem Shell-Script wird die iBeacon gestartet, wichtig war bei mir, daß die Reihenfolge der Befehle  eingehalten wird:

#!/bin/bash
#
# Start interface
hciconfig hci0 up
#
# Set adapter to "Low Energy Advertise"
hciconfig hci0 leadv 3
#
# start advertising with 
# UUID: 912E23A0-971E-11E3-A5E2-0800200C9A66
# MAJOR: 0000
# MINOR: 0000
# RSSI:  C5
#
# next command is *one* line
hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 91 2E 23 A0 97 1E 11 E3 A5 E2 08 00 20 0C 9A 66 00 00 00 00 C5 00

App auf dem iPhone

Zum Lokalisieren und Testen von iBeacons habe ich drei iPhone-Apps gefunden, aber nicht alle funktionieren bei mir. Wichtig ist, daß die UUID richtig eingegeben wird. Hier eine Übersicht der Apps die ich getestet habe:
  • iBeacon Locate (Radius Networks) http://www.radiusnetworks.com/ibeacon-services.html
  • AirLocate (Apple): funktioniert, Sourcen verfügbar
  • Beacon Tool: funktioniert bei mir nicht (iPhone 4S, es wird keine iBeacon gefunden)
Am besten gefallen hat mir iBeacon Locate. AirLocate liegt als Beispiel von Apple im Quelltext vor, kann also gut als Ausgangspunkt für eine eigene App dienen.

iBeacon-Technologie für Android

Seit Android 4.3 gibt es auch auf dieser Plattform Bluetooth Low-Energy-Unterstützung. Allerdings habe erst wenig Android-Geräte BLE-Hardware eingebaut. Die Situation ist aber gerade stark im Fluß.

Stolperfallen

  • Es ist Bluetooth Low-Energy-Dongle nötig: o.g. Logilink oder plugable-Dongle funktionieren bei mir
  • Die Reihenfolge der hcitool-Befehle ist kritisch
  • Gerät (iPhone/Android) muß BLE unterstützen
  • Nicht alle Apps funktionieren

App-Entwicklung


Links



4 Kommentare:

  1. Hi, vielen Dank. Hat sehr gut geklappt!
    Ich versuche verzweifelt die bash automatisch beim booten starten zu lassen. Was würdest du dafür empfehlen? Mit rc.local klappt es leider nicht, da er die Befehle nicht kennt (hciconfig).

    AntwortenLöschen
  2. Scripte, die automatisch starten, kommen unter Linux ins Verzeichnis /etc/init.d und werden über einen Link aufgerufen.
    Wie das genau geht ist in
    http://wiki.ubuntuusers.de/Dienste
    beschrieben. Am besten ein paar Scripte, die dort rumliegen anschauen und anpassen!

    AntwortenLöschen
  3. Gibt es auch eine Möglichkeit dass der Raspberry merkt, dass das iPhone in der nähe ist?

    AntwortenLöschen
  4. ... wäre es mit der genannten Konfiguration auch möglich, binäre Daten an den Raspi zu schicken und diese dort abzuspeichern?

    AntwortenLöschen