c't 21/2021
S. 162
Praxis
LoRaWAN-GNSS-Tracker mit Traccar verknüpfen

Positionsübersetzer

LoRaWAN-GPS-Tracker mit Traccar verbinden

GPS-Tracker gibts auch für die IoT-Funktechnik LoRaWAN. Doch wie erzeugt man aus dem stetigen Datenstrom eine schicke Karte? Die Tracker-Serversoftware „Traccar“ bietet genau das und lässt sich mit etwas PHP-Magie auch mit dem The Things Network und anderen LoRaWANs verheiraten.

Von Andrijan Möcker

Wertsachen, Haustiere, Fahrzeuge, Taschen oder auch Menschen: GNSS-Tracker (umgangssprachlich GPS-Tracker), also Geräte, die mithilfe von Satellitennavigationssatellitensystemen wie GPS oder Galileo ihre Position ermitteln und per Mobilfunk versenden, eignen sich für allerhand Verfolgungsaufgaben.

Neben Trackern, die Ihre Daten über kommerzielle Mobilfunknetze wie GSM und LTE versenden, gibt es auch welche für den offenen IoT-Netzstandard LoRaWAN (868 MHz, lizenzfrei) der etwa beim kostenfrei nutzbaren The Things Network (TTN) oder privat aufgebauten IoT-Netzen für Anwendungen mit niedriger Bandbreite eingesetzt wird. Sofern der Einsatzbereich der Tracker ein beschränktes Gebiet ist und geeignete Standorte für LoRaWAN-Basisstationen verfügbar sind, kann sich LoRaWAN schnell bezahlt machen – insbesondere, wenn viele Tracker im Einsatz sind.

Zur Darstellung und Auswertung der Daten eignet sich die quelloffene und kostenfreie GNSS-Tracker-Serversoftware „Traccar“ besonders gut. Sie bringt etwa Benachrichtigungen, Live-Routenverfolgung, eine Benutzerverwaltung, mit der Tracker zwischen Benutzern geteilt werden können und vieles weitere mit. Eigentlich ist die Software nur für Tracker-Protokolle gedacht, die von LTE- oder GSM-Trackern verwendet werden. Es gibt jedoch ein Web-Interface und mit etwas PHP-Magie kann man die Pakete aus dem The Things Network kompatibel machen.

Mittlerweile gibt es eine Vielzahl von GNSS-Trackern mit LoRaWAN; die meisten davon zu akzeptablen zweistelligen Preisen wie den RAK 7200 für rund 50 Euro. Hersteller und Modell spielen beim Einsatz mit Traccar keine Rolle.

Voraussetzungen

Wenn Sie noch keine Erfahrungen mit LoRaWAN und dem The Things Network haben, finden Sie Grundlagenartikel dazu c’t 10/2019 [1] und c’t 14/21 [2]. Letzterer behandelt auch die Einrichtung von Geräten. Der folgende Artikel geht davon aus, dass Sie schon einen GNSS-Tracker mit einem Dekoder im TTN eingerichtet haben. Der Dekoder sollte mindestens den Längen- und den Breitengrad (Longitude/Latitude) der Position ausgeben.

Das Konzept eignet sich für alle Betriebssysteme, die von Traccar und Apache 2 unterstützt werden. Wir beschränken uns in diesem Praxisartikel auf den Mini-Computer Raspberry Pi. Er ist als Mini-Server im privaten Bereich sehr beliebt, relativ günstig und zudem energiesparend. Schon ein Raspberry Pi 2 mit aktueller Software bietet genug Rechenleistung und Speicher. Sämtliche Schritte der Installation erledigen Sie per SSH. Daher: Etwas Erfahrung mit dem Raspberry Pi beziehungsweise einem Linux-System sollten Sie schon haben.

Die Datenübertragung zwischen The Things Network und Traccar erfolgt über die Webhook-Integration, einem HTTP(S)-Client, von The Things Network (TTN, v3) beziehungsweise des TTN-Stack – eine Serversoftware des TTN zur Installation privater LoRaWANs. Auch andere LoRaWAN-Server wie Chirpstack funktionieren, brauchen jedoch unter Umständen Anpassungen, auf die dieser Artikel nicht eingeht.

Die Webhook-Integration ist simpel: Das The Things Network ruft eine voreingestellte Webadresse per POST-Request auf, sobald ein oder mehrere Ereignisse eingetreten sind, etwa ein Join Request oder ein neues Paket, das ein LoRaWAN-Gerät gesendet hat. Die Nutzlast sowie Metadaten zum Ereignis – beispielsweise das übermittelnde Gateway und die Signalstärke – packt der LoRaWAN-Server als JSON-Objekt in die Anfrage. Voraussetzung dafür ist jedoch, dass die eingetragene Webadresse aus dem Internet erreichbar ist. Sie benötigen also eine öffentliche IPv4- oder IPv6-Adresse. Fehlt beides, haben wir eine alternative Lösung im Absatz Node-Red-Alternative aufgeschrieben, siehe unten.

Weil IP-Adressen an Privatanschlüssen in der Regel dynamisch sind, legen Sie zuerst einen DynDNS-Hostnamen für Ihren Anschluss an und bei IPv6 auch für Ihren Server (Raspi). Halten Sie diese stets erreichbar. Wie das mit der Fritzbox geht, lesen Sie in c’t 11/2020 ab Seite 24 [3]. Wenn Sie keine Fritzbox besitzen und Ihr Router den erwähnten Anbieter dynv6 beziehungsweise individuelle Update-URLs nicht unterstützt, liefert der Anbieter ein Update-Skript, das Sie auch auf dem Raspberry Pi ausführen können: ct.de/yd7h.

Außerdem brauchen Sie Zugang zur Weboberfläche Ihres Routers, um Portfreigaben anzulegen.

Traccar-Installation

Die Entwickler haben die Traccar-Installation größtenteils automatisiert: Öffnen Sie die Konsole auf dem Raspberry Pi beziehungsweise verbinden Sie sich per SSH von einem beliebigen System aus. Öffnen Sie dann die Releases-Seite von Traccar auf GitHub, um sich den Download-Link der aktuellen Version zu kopieren. Sie finden sie verlinkt über ct.de/yd7h. Kopieren Sie den Link für die ARM-Variante per Rechtsklick: traccar-linux-arm-<version>.zip. Mit dem Befehl wget <Downloadlink> laden Sie die ZIP-Datei auf den Raspberry Pi.

Entpacken Sie sie mit unzip <Datei>. Damit Sie den Dateinamen nicht von Hand eintippen müssen, können Sie auch unzip tr eingeben und dann die Tabulator-Taste drücken. Sofern keine andere Datei in dem Ordner liegt, die mit „tr“ beginnt, vervollständigt Linux die Eingabe automatisch.

Um die Installation zu starten, führen Sie die entpackte .run-Datei mit Superuser-Rechten aus. Den Namen entnehmen Sie der Unzip-Ausgabe (inflating: ...). Zum Redaktionsschluss hieß diese Datei „traccar.run“:

sudo ./traccar.run 

Die Installationsroutine läuft automatisch ab und legt gleichzeitig einen Serviceeintrag an, sodass Traccar beim Hochfahren gestartet wird.

Von Haus aus läuft Traccar auf Port 8082. Diese Einstellung können Sie – etwa weil es eine Überschneidung mit einem anderen Server gibt – nach abgeschlossener Installation in der Konfigurationsdatei unter <entry key='web.port'>8082</entry> ändern:

sudo nano /opt/traccar/default.xml 

Mit Strg+O speichern Sie die Datei; Strg+X schließt nano. Danach starten Sie das System neu, um die Installation abzuschließen: sudo reboot.

Nach dem Neustart erreichen Sie das Web-Interface per Browser auf Port 8082 (oder Ihrer gewählten Portnummer): http://<Pi-IP-Adresse>:8082. Benutzername und Kennwort lauten „admin“.

Um die Weboberfläche gegen unberechtigte Logins abzusichern, klicken Sie auf das Zahnrad oben rechts und öffnen das Menü „Benutzerkonto“. Benennen Sie es um und tragen Sie ein sicheres Passwort ein. Mit dem Haken unten rechts bestätigen Sie die Einstellungen.

Damit Sie direkt erkennen können, ob Daten bei Traccar ankommen, tragen Sie Ihre GNSS-Tracker in die Liste ein. Eine bestehende Verbindung ist nicht nötig; sobald Tracking-Daten mit der passenden Kennung eingehen, ordnet Traccar diese dem jeweiligen Eintrag zu. Klicken Sie oben links auf das Plus, vergeben Sie einen Namen und setzen Sie die Kennung auf die in der TTN-Anwendung vergebene ID, beispielsweise „tmotion-cttest“. Wenn Sie nicht korrekt ist, funktioniert die Zuordnung der Daten nicht.

Apache-Installation

Da Traccar keinen direkten Weg kennt, um JSON-Daten per HTTP(S) entgegenzunehmen, muss man sich beim OsmAnd-Protokoll bedienen. Der Webserver Apache2 dient mit etwas PHP als Konverter und übernimmt auch die Authentifizierung, damit nicht jeder Dahergelaufene Ihre schöne Karte mit Trackerdaten verziert, die gar nicht zum Netzwerk gehören.

Die Installation und Konfiguration des Servers erledigen Sie wieder über die Kommandozeile. Stellen Sie mit sudo apt update && sudo apt upgrade sicher, dass installierte Pakete sowie die Paketlisten aktuell sind. Dann starten Sie die Installation mit

sudo apt install apache2 php libapache2-mod-php

Nach der Installation rufen Sie http://<Pi-IP-Adresse> auf; Erscheint die Apache Default Page, läuft der Server. Wenn nicht, starten Sie den Dienst manuell: sudo service apache2 start.

Damit Ihr Webserver ein gültiges TLS-Zertifikat erhält, installieren Sie den Certbot für Let’s Encrypt – ein Dienst für kostenfreie TLS-Zertifikate:

sudo apt install certbot python-certbot-apache

Die SSL-Unterstützung von Apache2 aktivieren Sie mit sudo a2enmod ssl. Den empfohlenen Neustart des Dienstes können Sie auslassen, weil die Konfigurationsdatei noch fehlt.

Wechseln Sie in den Root-Modus, um Konfigurationsdateien und Ordner anlegen zu können, ohne ständig sudo tippen zu müssen: sudo -i. Anschließend erstellen Sie einen Ordner für das PHP-Skript: mkdir /var/www/traccarconv und setzen die Berechtigungen so, dass andere Benutzer (also der Webserver), die Dateien zwar lesen, aber nicht bearbeiten können: chmod 755 /var/www/traccarconv.

Jetzt ist die Konfigurationsdatei für Apache an der Reihe: Öffnen Sie den Ordner mit den Host-Konfigurationen mit cd /etc/apache2/sites-available und öffnen Sie einen Texteditor für die neue Konfiguration traccarconv.conf, beispielsweise mit nano traccarconv.conf. Eine passende Konfiguration finden Sie über ct.de/yd7h. Kopieren Sie den Inhalt in den Editor und ändern Sie den ServerName auf den für Ihren Raspberry eingerichteten DynDNS-Hostname. Dann aktivieren Sie die Konfiguration mit a2ensite traccarconv, verzichten aber erneut auf den Service-Neustart; der kommt gleich automatisch.

Um ein gültiges TLS-Zertifikat zu erhalten, starten Sie den Certbot. Er ruft nicht nur das Zertifikat ab, sondern passt auch die Konfigurationsdatei auf die korrekten Zertifikatspfade an und startet den Dienst neu. Damit das klappt, müssen Sie die Ports 80 und 443 auf Ihrem Router für den Raspberry mindestens für eines der beiden IP-Protokolle (v4/v6) freigeben. Starten Sie den Certbot mit certbot --apache und folgen Sie dem Assistenten. Bejahen Sie die Frage, ob die Weiterleitung von HTTP zu HTTPS aktiviert werden soll.

Da TLS-Zertifikate von Let’s Encrypt eine relativ kurze Gültigkeit haben, muss der Certbot sie regelmäßig erneuern. Das erledigen Sie mit einer Zeile in der Cron-Tabelle: crontab -e.

15 3 * * * certbot renew--noninteractive

startet den Certbot jede Nacht um 3:15 Uhr zur Kontrolle und automatischen Aktualisierung der Zertifikate.

Ein passend installiertes LoRaWAN-Gateway, wie hier das Lorix One im Zylindergehäuse auf einem Berg im Harz, kann ein großes Gebiet abdecken. Hat der Standort geringe laufende Kosten, ist der Betrieb der GNSS-Tracker über LoRaWAN möglicherweise deutlich günstiger als über kommerzielle Mobilfunknetze.

Authentifizierung

Das Einspielen manipulierter Daten ist zwar schon dadurch erschwert, dass der Angreifer die korrekte Device-ID aus der TTN-Konsole kennen muss, eine zusätzliche Sicherheitsebene kann aber nicht schaden. Wir beschränken uns in diesem Beispiel auf einfache HTTP-Basic-Authentifizierung. Apache beherrscht allerdings noch weitere Verfahren, die Sie der Dokumentation entnehmen können.

Die vorgegebene Konfigurationsdatei ist so konfiguriert, dass Apache2 einen gültigen Login verlangt. Die entsprechende Datei traccarconvauth muss in /etc/apache2 liegen. Mit dem Tool „htpasswd“ können Sie sie erstellen und gleichzeitig den Benutzer anlegen:

htpasswd -c /etc/apache2/traccarconvauth thethingsnetwork 

wobei thethingsnetwork der Benutzername ist, den Sie beliebig anpassen können. Vergeben Sie ein sicheres, individuelles Passwort. Die Apache-Einrichtung ist damit abgeschlossen.

PHP-Magie

Das Übersetzerskript nimmt die JSON-Daten entgegen, pflückt sie auseinander, enkodiert sie im OsmAnd-Protokoll in eine URL und setzt dann die Anfrage ab, die die Daten an Traccar überträgt. Das Skript finden Sie über ct.de/yd7h. Legen Sie es mit nano /var/www/traccarconv/converter.php im Webverzeichnis an und kopieren Sie den Code hinein.

Das Skript ergibt beim Blick auf das Uplink-Message-Beispiel (ct.de/yd7h) schnell Sinn – selbst wenn man sich nicht mit Programmcode auskennt. Kurz und knapp: Der eingehende JSON-String wird in ein Objekt konvertiert und kann dann über die Keys, also die einzelnen Bezeichnungen der Variablen, verwendet werden; beispielsweise $ttnpacket["uplink_message"]["decoded_payload"]["latitude"] für den Breitengrad. Damit das Skript übersichtlich bleibt, schreiben wir die Werte in kürzere Variablen, die dann in der URL aufgerufen werden. Die Anfrage erfolgt an Port 5055, da Traccar die jeweiligen Protokolle anhand des Ports identifiziert.

Traccar stellt GPS-Tracker übersichtlich auf einer Karte dar und hat umfangreiche Zusatzfunktionen. Es versteht außer der LoRaWAN-Übersetzung auch noch allerhand weitere Protokolle, sodass mehrere Geräte unterschiedlicher Klassen ohne sichtbaren Unterschied verknüpft werden können.

Der Code stellt nur ein Grundgerüst dar, das Sie erweitern oder beschneiden können. Da sich das OsmAnd-Protokoll um beliebige Variablen erweitern lässt, haben wir aus Neugierde die Signalstärke und das empfangene Gateway mit aufgenommen. Aus der eigentlichen Nutzlast entnimmt das Skript nur Längen- und Breitengrad. Liefert Ihr Tracker beispielsweise eine Höhenangabe in der Nutzlast (altitude), erweitern Sie den mittleren Teil des Skripts um $altitude=$ttnpacket["uplink_message"]["decoded_payload"]["altitude"] und ergänzen den Wert in der URL mit &altitude=$altitude. Gleichermaßen verfahren Sie, wenn Ihr Tracker etwa sats oder battery auswirft und Sie die Werte in Traccar nutzen möchten. Welche Werte Ihr Tracker liefert, können Sie entweder dem Dekoder-Skript entnehmen oder einem Paket in der Live-Data-Anzeige in der The Things Network Console. Wenn Sie etwas auslassen möchten, entfernen Sie einfach &variable=$variable in der URL. Speichern Sie die Datei und setzen Sie die Berechtigungen: chmod 755 /var/www/traccarconv/converter.php. Anschließend ist der Konverter einsatzbereit.

Rufen Sie Ihren Server im Browser auf (https://<DynDNS-Hostname>) auf und testen Sie, ob Sie mit den zuvor konfigurierten Zugangsdaten eine erfolgreiche (HTTP 200) Antwort erhalten. Ein normaler Browser zeigt dann nur ein weißes Fenster, aber auch keine Fehlermeldung.

Unterhalb der Geräteliste zeigt Traccar alle übergebenen Parameter an. Da das OsmAnd-Protokoll eigene Parameter zulässt, können Sie auch Metadaten der Position – beispielsweise die LoRaWAN-Empfangssignalstärke – an Traccar übergeben.

TTN-Webhook

Um den Webhook einzurichten, öffnen Sie die Anwendung Ihrer Tracker in der The- Things-Network-Konsole und rufen das Untermenü „Integrations/Webhooks“ auf. Dort richten Sie über „Add webhook“ einen neuen „Custom webhook“ ein. Vergeben Sie eine beliebige „Webhook ID“ und setzen Sie das Format auf „JSON“.

Die „Base URL“ lautet https://<Benutzername>:<Kennwort>@<Domain>, beispielsweise https://ttnosmand:wevEliBI6znAihfqJQygGcbLgIUT63Ya@osmandendpoint.cttest.dynv6.net. Dann muss nur noch der Haken bei „Uplink message“ gesetzt werden – das Feld „path/to/webhook“ bleibt frei. Mit „Save changes“ wird der Webhook aktiviert.

Sobald die Apache-Konfiguration abgeschlossen und das Skript online ist, richtet man nur noch den Webhook in TTN ein. Anfassen muss man die Konstruktion danach nicht mehr: Alle Tracker werden direkt mit ihrer ID durchgereicht; kommt ein neuer hinzu, trägt man ihn einfach in Traccar ein.

Node-Red-Alternative

Sind keine eingehenden Verbindungen an Ihrem Internetanschluss möglich, können Sie auch eine Verbindung zum MQTT-Dienst des TTN aufbauen. Wie das geht, lesen Sie im LoRaWAN-Einsteigerartikel [2] am Beispiel von Node Red. Ein MQTT-Client in beliebigen anderen Programmiersprachen funktioniert jedoch auch.

Läuft der PHP-Konverter, muss man die Tracker nur noch mit ihrer ID (Kennung) in Traccar anlegen, damit sie auf der Karte erscheinen.

Einen Node-Red-Flow, der die URL für OsmAnd encodiert, finden Sie wie beschrieben über ct.de/yd7h. Hängen Sie das MQTT-Node an das JSON-Node und übernehmen Sie den Flow, um die Datenweitergabe zu starten. Um alle Geräte aus der Anwendung zu übertragen, setzen Sie im MQTT-Topic die Wildcard + , also beispielsweise statt v3/ttntracker-cttest@ttn/devices/tmotion-amo/up dann v3/ttntracker-cttest@ttn/devices/+/up.

Datenstart

Sobald der Webhook aktiviert ist, können Sie einen Tracker aus der Anwendung einschalten und in Traccar die eingehenden Daten beobachten. Der Eintrag des Trackers sollte grün erscheinen, ebenso die Daten im Feld unter der Liste, wenn Sie ihn anklicken.

Andernfalls prüfen Sie in der TTN-Konsole, ob der Tracker tatsächlich Daten sendet. Wenn ja, kontrollieren Sie in Traccar, ob die Kennung korrekt ist, indem Sie den Tracker in der Geräteliste anklicken und oberhalb den Stift zum Editieren des Eintrags wählen. ID und Name sind besonders leicht zu verwechseln. Gleichen Sie den Eintrag mit der „End devices“-Liste in der TTN-Konsole ab. War das nicht der Fehler, kontrollieren Sie die Zugangsdaten im Webhook sowie die Portfreigaben in Ihrem Router.

Sobald Sie alle Fehler behoben haben, steht dem Einsatz nichts mehr im Weg. Traccar ist ein mächtiges Werkzeug, dessen Funktionsumfang diesen Artikel sprengen würde. Über ct.de/yd7h finden Sie einen Link zur Dokumentation. Darin finden Sie Hinweise zum Einrichten von Geofences, also virtuellen Zäunen, bei deren Übertreten Traccar eine Nachricht an Sie versenden kann, Routenverfolgung, Datenexport für andere Dienste und viele weitere Funktionen. (amo@ct.de)

Konfigurationsdateien, Dokumentationen und weiteres: ct.de/yd7h

Kommentieren