@ -282,7 +282,7 @@ Diese Arbeit soll untersuchen wie eine solche Lokalisierung umgesetzt werden kan
# Implementierung
# Implementierung
In den folgenden Abschnitten wird die verwendete Hardware sowie die Umsetzung beschrieben. Zum Einsatz kommen die Programmiersprachen JavaScript, Python und Kotlin. Dieser Mix erklärt sich aus der gewählten Hardware.
In den folgenden Abschnitten wird die verwendete Hardware sowie die Umsetzung beschrieben. Zum Einsatz kommen die Programmiersprachen JavaScript, Python und Kotlin. Dieser Mix erklärt sich aus der gewählten Hardware und dem Vorgehen.
## Beacon
## Beacon
@ -290,17 +290,17 @@ Als Bluetooth-Beacon kommen Puck.js\footnote{https://www.puck-js.com/}, Abbildun
Durch eine Programmierschnittstelle lässt sich der Beacon mit Hilfe von Javascript Programmieren. Beim Einstieg hilft eine Datenbank mit Beispielprogrammen sowie ein ausführlich dokumentiertes \ac{api} [@Ltd_2017]. Zur Programmierung verbindet man den Beacon mittels Bluetooth zu einer \ac{ide} im Browser. Abbildung \ref{fig:ide} zeigt die \ac{ide}: links befindet sich die Konsole über die Befehle direkt auf dem Beacon ausgeführt werden können, rechts ist der Editor in dem man Programme einfügen oder schreiben kann. Der Programmcode kann sowohl Temporär, zum Testen, auf den Beacon geladen werden als auch nach dem Test im Flash des Beacon gespeichert werden. Bei der temporären Ausführung ist der Code nach einem Batteriewechsel nicht mehr auf dem Beacon. Diese Art der Entwicklung macht das Experimentieren mit den Bluetooth-Beacon sehr einfach.
Durch eine Programmierschnittstelle lässt sich der Beacon mit Hilfe von Javascript Programmieren. Beim Einstieg hilft eine Datenbank mit Beispielprogrammen sowie ein ausführlich dokumentiertes \ac{api} [@Ltd_2017]. Zur Programmierung wid der Beacon mittels Bluetooth zu einer \ac{ide} im Browser verbunden. Abbildung \ref{fig:ide} zeigt die \ac{ide}: links befindet sich die Konsole über die einzelne Befehle direkt auf dem Beacon ausgeführt werden können, rechts ist der Editor zu sehen, in diesem können die Befehle zu Programmen zusammengeführt werden. Der Programmcode kann sowohl Temporär, zum Testen, auf den Beacon geladen werden als auch, nach dem Test, im Flash des Beacon gespeichert werden. Bei der temporären Ausführung ist der Code nach einem Batteriewechsel nicht mehr auf dem Beacon. Diese Art der Entwicklung macht das Experimentieren mit den Bluetooth-Beacon sehr einfach.
![Screenshot der Espruino \ac{ide} im Chrome Browser. \label{fig:ide}](../static/espruino_ide.png)
![Screenshot der Espruino \ac{ide} im Chrome Browser. \label{fig:ide}](../static/espruino_ide.png)
### Modi
### Modi
Während der Versuche mit den Beacon wird ein hohes Advertising-Intervall benötigt. Dies sorgt für eine kürzere Batterielebensdauer. Um die Batterie nicht zu stark zu belasten wurden zwei Modi Programmiert. Durch den integrierten Button, kann zwischen dem Versuchsmodus und dem Programmiermodus gewechselt werden. Zur Visualisierung in welchem Modus sich der Beacon befindet wird die eingebaute grüne und rote LED verwendet. Beim Wechsel vom Programmiermodus in den Versuchsmodus leuchtet die grüne LED auf und blinkt dann alle \SI{10}{\second}. Wird der Beacon erneut gedrückt, so zeigt die rote LED das beenden des Versuchsmodus an und der Beacon wechselt in den Programmiermodus zurück.
Während der Versuche mit den Beacon wird ein hohes Advertising-Intervall benötigt, welches für eine kürzere Batterielebensdauer sorgt. Um die Batterie nicht zu stark zu belasten wurden zwei Modi Entwickelt. Durch den integrierten Button, kann zwischen dem Versuchsmodus und dem Programmiermodus gewechselt werden. Zur Visualisierung in welchem Modus sich der Beacon befindet wird die eingebaute grüne und rote LED verwendet. Beim Wechsel vom Programmiermodus in den Versuchsmodus leuchtet die grüne LED auf und blinkt dann alle \SI{10}{\second}. Wird der Beacon erneut gedrückt, so zeigt die rote LED das beenden des Versuchsmodus an und der Beacon wechselt in den Programmiermodus zurück.
### Identifizierung
### Identifizierung
Jeder Beacon verfügt über eine einzigartige Hardware-Adresse, \ac{mac}-Adresse genannt. Zur einfachen Identifizierung werden die letzten zwei Byte der \ac{mac}-Adresse in Kleinbuchstaben als Kurzname der Beacon verwendet. Für das Advertising wird der vor den Kurznamen ein BLE für \acl{ble} gesetzt. Tabelle \ref{tab:devices} listet die \ac{mac}-Adresse sowie den dazugehörigen Advertising Namen und Kurznamen der Beacon auf. Im Versuchsmodus wird der Advertising Name nicht mit ausgesendet, mehr dazu im Kapitel \ref{advertising}.
Jeder Beacon verfügt über eine einzigartige Hardware-Adresse, \ac{mac}-Adresse genannt. Zur einfachen Identifizierung werden die letzten zwei Byte der \ac{mac}-Adresse in Kleinbuchstaben als Kurzname der Beacon verwendet. Für das Advertising wird vor den Kurznamen ein ``BLE`` für \acl{ble} gesetzt. Tabelle \ref{tab:devices} listet die \ac{mac}-Adresse sowie den dazugehörigen Advertising Namen und Kurznamen der Beacon auf. Im Versuchsmodus wird der Advertising Name nicht mit ausgesendet, mehr dazu im Kapitel \ref{advertising}.
| \ac{mac}-Adresse | Advertising Name | Kurzname |
| \ac{mac}-Adresse | Advertising Name | Kurzname |
| ---------------- | --------- | -------- |
| ---------------- | --------- | -------- |
@ -309,27 +309,27 @@ Jeder Beacon verfügt über eine einzigartige Hardware-Adresse, \ac{mac}-Adresse
| D6:7C:70:1C:5B:5B | BLE 5b5b | 5b5b |
| D6:7C:70:1C:5B:5B | BLE 5b5b | 5b5b |
: Übersicht der \ac{mac}-Adressen und zugehörigen Namen der verwendeten Beacon. \label{tab:devices}
: Übersicht der \ac{mac}-Adressen und zugehörigen Namen der verwendeten Beacon. \label{tab:devices}
Um die Advertising-Pakete zuordnen zu können wird ein universeller Identifikator benötigt. Espruino bietet hierzu eine Reservierte 16 bit \ac{uuid} ``0x0590`` für die Entwicklung von Anwendung mit ihrer Hardware. Diese \ac{uuid} wird zur Filterung der Advertising-Pakete im Scanner verwendet.
Weiterhin wird für das Advertising ein universeller Identifikator benötigt. Diese erlaubt es die Advertising-Pakete eindeutig zuzuordnen. Espruino bietet hierzu eine Reservierte 16 bit \ac{uuid} ``0x0590`` für die Entwicklung von Anwendung mit ihrer Hardware. Diese \ac{uuid} wird zur Filterung der Advertising-Pakete im Scanner verwendet.
### Advertising
### Advertising
Für das Advertising stehen 31 Byte für Benutzerdefinierte Daten zur Verfügung. Davon werden 5 byte im Versuchsmodus benötigt. Das Advertising-Paket im Versuchsmodus setzt sich aus der 16 bit langen \ac{uuid} ``0x0590`` und 3 Byte zur Übertragung der $scPower$ zusammen. Die $scPower$ wird in einer festen Reihenfolge abgespeichert und übertragen. Für einen produktiven Einsatz sollten diese Werte gekennzeichnet werden. Hierfür sind weitere 26 byte in dem Advertising-Paket frei.
Für das Advertising stehen 31 Byte für Benutzerdefinierte Daten zur Verfügung. Davon werden 5 byte im Versuchsmodus benötigt. Das Advertising-Paket im Versuchsmodus setzt sich aus der 16 bit langen \ac{uuid} ``0x0590`` und 3 Byte zur Übertragung der $scPower$ zusammen. Die $scPower$ wird in einer festen Reihenfolge abgespeichert und übertragen. Für einen produktiven Einsatz sollten diese Werte gekennzeichnet werden. Hierfür sind weitere 26 byte in dem Advertising-Paket frei.
Für den Versuchsmodus wird der Beacon auf in den Advertising-\ac{pdu} ``ADV_NONCONN_IND`` gesetzt. Dadurch ergibt sich ein Maximales Advertisingintervall von \SI{100}{\milli\second} welches für den gewählten Versuchsaufbau ausreichend ist. Der Advertising Name des Beacon wird im Versuchsmodus nicht ausgesendet.
Für den Versuchsmodus wird der Beacon in den Advertising-\ac{pdu} ``ADV_NONCONN_IND`` gesetzt. Hierbei lässt der Beacon keine Verbindung zu und reagiert nicht auf Anfragen sondern sendet nur Advertising-Pakete aus. Das Maximales Advertising-Intervall ist in diesem Modus zwar auf \SI{100}{\milli\second} beschränkt, dies ist jedoch für den gewählten Versuchsaufbau ausreichend. Zur Erfassung der Position bewegter Objekte sollte eine aktive Verbindung genutzt werden da hier das Advertising-Intervall auf \SI{20}{\milli\second} verkürzt werden kann. Der Advertising Name des Beacon wird im Versuchsmodus nicht ausgesendet.
Im Programmiermodus wird der Beacon auf den Advertising-\ac{pdu} ``ADV_IND`` zurück gesetzt. Auch der Advertising Name des Beacon wird nun wieder mit ausgesendet. So kann man den Beacon mit der \ac{ide} verbinden und neu Programmieren.
Im Programmiermodus befindet sich der Beacon im Advertising-\ac{pdu} ``ADV_IND``. Dieser ist notwendig damit eine Verbindung mit dem Beacon zur erneuten Programmierung hergestellt werden kann. Auch der Advertising Name des Beacon wird in diesem Modus wieder mit ausgesendet.
### scPower
### scPower
Zur Umsetzung eines selbst korrigierenden Systems müssen die Bluetooth-Beacon sowohl als Scanner wie auch als Advertiser fungieren. Im Versuchsmodus Scannen die Beacon hierzu, parallel zum aussenden der Advertising Pakete, auf solche von den anderen beiden Beacon. Abbildung \ref{fig:selfkorrekting} zeigt den Ablauf des selbst korrigierenden Systems bei dem Beacon 5b5b ein Advertising Paket aussendet, welches von den Beacon 690f und 9d31 empfangen und verarbeitet wird. Die Beacon 690f und 9d31 speichern den \ac{rssi}-Wert des Empfangenen Pakets von Beacon 5b5b als $scPower$ in ihre Advertising-Pakete und strahlen dieses aus. Bei jedem erneuten Empfang eines Advertising-Pakets von Beacon 5b5b wird die $scPower$ aktualisiert.
Zur Umsetzung eines selbst korrigierenden Systems müssen die Bluetooth-Beacon sowohl als Scanner wie auch als Advertiser fungieren. Im Versuchsmodus Scannen die Beacon hierzu, parallel zum aussenden der Advertising-Pakete, auf solche Pakete von den anderen beiden Beacon. Abbildung \ref{fig:selfkorrekting} zeigt den Ablauf des selbst korrigierenden Systems bei dem Beacon 5b5b ein Advertising Paket aussendet, welches von den Beacon 690f und 9d31 empfangen und verarbeitet wird. Die Beacon 690f und 9d31 speichern den \ac{rssi}-Wert des Empfangenen Pakets von Beacon 5b5b als $scPower$ in ihrem Advertising-Pakete und senden dieses aus. Bei jedem erneuten Empfang eines Advertising-Pakets von Beacon 5b5b wird die $scPower$ aktualisiert.
## Smartphone
## Smartphone
Als Smartphone für die Messungen kommt ein OnePlus 7t mit Android-Betriebssystem in der Version 11 zum Einsatz. Für die Anwendungsentwicklung wird die \ac{ide} Android Studio verwendet. Als Programmiersprache wurde Kotlin gewählt und die Smartphone Anwendung als Bluetooth-Scanner umgesetzt. Über die Benutzeroberfläche, zu sehen in Abbildung \ref{fig:appfrontend}, müssen 4 Eingabefelder vor dem Versuchsstart durch den Anwender ausgefüllt werden. Der Test Name dient dazu, die Testdaten bei der Auswertung zu identifizieren. In den weiteren drei Feldern wird die, für den Versuch gemessene Distanz zwischen Smartphone und dem jeweiligen Beacon notiert. Sollte ein oder mehrere Beacon nicht im Einsatz sein, so muss hier eine 0 eingetragen werden. Über den Start/Stop-Button am unteren Bildschirmrand der Anwendung wird die Aufzeichnung gestartet. Nach dem Start können die Empfangenen Daten im oberen Bildschirmbereich zur Funktionsüberprüfung eingesehen werden. Diese Daten Aktualisieren sich automatisch mit jedem empfangenen Advertising-Paket.
Als Smartphone für die Messungen kommt ein OnePlus 7t mit Android-Betriebssystem in der Version 11 zum Einsatz. Für die Anwendungsentwicklung wird die \ac{ide} Android Studio verwendet. Als Programmiersprache wurde Kotlin gewählt und die Smartphone Anwendung als Bluetooth-Scanner umgesetzt. Über die Benutzeroberfläche, zu sehen in Abbildung \ref{fig:appfrontend}, müssen 4 Eingabefelder vor dem Versuchsstart durch den Anwender ausgefüllt werden. Der Test Name dient dazu, die Testdaten bei der Auswertung zu identifizieren, er dient auch als Dateiname für die gespeicherten Daten. In den weiteren drei Feldern wird die, für den durchgeführten Versuch, real gemessene Entfernung zwischen Smartphone und dem jeweiligen Beacon notiert. Sollten ein oder mehrere Beacon im durchgeführten Versuch keine relevanz haben, so muss hier eine 0 eingetragen werden. Über den Start/Stop-Button am unteren Bildschirmrand der Anwendung wird die Aufzeichnung gestartet. Nach dem Start können die Empfangenen Daten im oberen Bildschirmbereich zur Funktionsüberprüfung eingesehen werden. Diese Daten Aktualisieren sich automatisch mit jedem empfangenen Advertising-Paket.
![Screenshot der Smartphone-Testanwendung: Bluetooth Advertising Logger. \label{fig:appfrontend}](../static/appfrontend.jpg){ height=600px }
![Screenshot der Smartphone-Testanwendung: Bluetooth Advertising Logger. \label{fig:appfrontend}](../static/appfrontend.jpg){ height=600px }
Beim Empfang eines Advertising-Pakets wird geprüft, ob das Paket von einem der Beacon versendet wurde. Trifft dies zu, so werden die Daten des Advertising-Pakets in einer Textdatei, mit dem Test Namen als Dateinamen, auf dem Smartphone abgelegt. Die Daten liegen dort \ac{csv}-Format vor, dabei sind die einzelnen Spalten mit Hilfe eines Kommas voneinander getrennt. In Tabelle \ref{tab:datastore} werden die Spalten aufgelistet und ihr Inhalt kurz erläutert.
Beim Empfang eines Advertising-Pakets wird geprüft, ob das Paket von einem der Beacon versendet wurde. Hierzu wird zunächst nach der \ac{uuid} gefiltert und anschließend nach den \ac{mac}-Adressen der drei Beacon. Ist das Paket von einem der Beacon, so werden die Daten des Advertising-Pakets in einer Textdatei, mit dem Test Namen als Dateinamen, auf dem Smartphone abgelegt. Die Daten werden im \ac{csv}-Format gespeichert, dabei sind die einzelnen Spalten mit Hilfe eines Kommas voneinander getrennt. In Tabelle \ref{tab:datastore} werden die Spalten aufgelistet und ihr Inhalt kurz erläutert.