Einfacher GPS-Datenserver
Erfassen Sie die GPS-Position von Geräten (Smartphone, GPS-Tracker), speichern Sie sie in einer SQLite-Datenbank und ermöglichen Sie die Anzeige auf einer Karte (OSM oder Google).
- Daten werden vom Gerät entweder über HTTPS (PHP) oder ein TCP/UDP-Paket (GO-Server) empfangen.
- Gespeicherte Tracks können als GPX-Datei heruntergeladen werden
- Einfache Admin-Oberfläche zum Hinzufügen und Bearbeiten neuer Geräte
Anforderungen
- Webserver (Apache oder ähnlich), der die Authentifizierung unterstützt (für die Admin-Seite)
- PHP mit installierter SQLITE3-API (z. B. php-sqlite3-Paket) und Sockets (z. B. Paket php-sockets).
- GO-Compiler für TCP/UDP-HTTP-Brücke (wird nur für kommerzielle Ortungsgeräte wie TK103 oder GPS Logger im UDP-Modus benötigt). Zusätzliches Paket golang.org/x/crypto ist erforderlich. Installieren Sie mit „go get golang.org/x/crypto“
- Java-Skript GPXViewer von Jürgen Berkemeier (Ordner
js/GM_utils/
)
Installation
- Mit Docker
- Kopieren Sie den Ordner
docker
auf Ihren Server (benennen Sie ihn beispielsweise in gps-server
um). - Kopieren Sie den Ordner
webapp
(und ggf. tcp_udp_http_bridge
) in das gps-server
Verzeichnis - Folgen Sie den Anweisungen im Docker-Ordner
- Installieren Sie jede Komponente separat
- Kopieren Sie alle Dateien im Webapp-Ordner in den Webspace-Ordner (im Folgenden wird ./gpstracker/ angenommen)
- Erstellen Sie einen entsprechenden Eintrag in der Webserver-Konfiguration, um den Webzugriff und die Ausführung von PHP zu ermöglichen
- Passen Sie die .htaccess-Datei der obersten Ebene (Apache) an oder beschränken Sie den Zugriff in der Nginx-Konfiguration (Beispiel nginx.conf).
- Legen Sie die Authentifizierung für die Admin-Schnittstelle fest
- In der Datei
auth/.htpasswd
ist ein einzelner Benutzer admin
mit dem Passwort changeme
enthalten - Der Pfad zur .htpasswd-Datei muss in
admin/.htaccess
angepasst werden. Der absolute Pfad ist erforderlich! - Aktualisieren Sie .htpasswd mit neuen Benutzern/Passwörtern. Benutzen Sie am besten die Kommandozeile
htpasswd /path-to-htpasswd-file/.htpasswd myusername mypassword
oder ein Online-Generator
- Bearbeiten Sie scripts/config.php: Passen Sie die Einstellungen an
- Definieren Sie die Zeitzone, die zu verwendende Karte und das Datums-/Uhrzeitformat
- Geben Sie die Zeitspanne ohne Bewegung an, die als Pause erkannt werden soll
- Geben Sie die Zeit ohne Bewegung an, um einen neuen Titel zu starten
- Aktivieren oder deaktivieren Sie den Start des TCP/UDP-Bridge-GO-Servers
- Holen Sie sich den Javascript GPXViewer von
https://www.j-berkemeier.de/GPXViewer/
und kopieren Sie den Ordner GM_Utils nach gpstracker/js/
- Um Google Maps nutzen zu können, ist ein API-Schlüssel erforderlich. Suchen Sie nach
google maps api key application
- Bearbeiten Sie die Datei
./js/GM_Utils/GPX2GM_Defs.js
kommentieren Sie die Zeile mit JB.GPX2GM.GM_Api_key
aus und fügen Sie den API-Schlüssel als Wert hinzu
- TCP/UDP-HTTP-Bridge
- aktivieren/deaktivieren in scripts/config.php
- Code mit GO in tcp_udp_http_bridge kompilieren (go build)
- Kopieren Sie die ausführbare Datei in das exe-Verzeichnis auf dem Webspace
- config.php entsprechend anpassen (Name und Pfad der/zur ausführbaren Datei)
- Rufen Sie die Admin-Schnittstelle auf, um den Server zu starten
- Fügen Sie einen Crontab-Eintrag hinzu, um einmal pro Stunde zu prüfen, ob der Server läuft (erfordert „wget“)
1 * * * * /usr/bin/wget -O /dev/null -o /dev/null https://servername/gpstracker?checkserver=SECRETKEY >/dev/null 2>&1
- Die Datenbankdatei wird automatisch erstellt
Geben Sie Ortungsgeräte ein
- Öffnen Sie die Seite https://servername/gpstracker/admin und füllen Sie das Formular aus
Daten anzeigen
- Öffnen Sie die Seite https://servername/gpstracker?id=ID-of-device
- optionaler Parameter zur Auswahl der Zeitspanne: dt= in Min(m), Stunden(h), Tagen(d) oder Jahren(y), zB „10d“ für 10 Tage
Ortungsgeräte
- Jede OpenGTS- oder Traccar-kompatible Tracking-App funktioniert
- Beispiele: GPS-Logger für Android, Traccar-Client ...
- GPS-Logger für Android
- Öffnen Sie Einstellungen -> Protokollierungsdetails -> „Auf OpenGTS-Server protokollieren“, um das Echtzeit-Tracking zu aktivieren
- Server: „<servername.com>“
- Port: 443
- Kommunikationsmethode: HTTPS
- Serverpfad: /gpstracker
- Geräte-ID: die ID, die Sie in der Admin-Oberfläche eingegeben haben
- Testen Sie die Kommunikation, indem Sie auf „SSL-Zertifikat prüfen“ klicken.
- Alternative Kommunikationsmethode UDP: Verwenden Sie die in config.php angegebene Portnummer (Standard 20202) -> erfordert die Ausführung des Servers
- Wenn die Kosten für die mobile Datenübertragung eine Rolle spielen, ist UDP die beste Wahl, da die Datenmenge minimal ist
- Einstellungen->Leistung
- Intervall auswählen (z. B. 20 Sek.)
- Lassen Sie das GPS zwischen den Fixes aktiviert: macht für kurze Zeit Sinn, benötigt aber mehr Akku
- Abstand zwischen Datenpunkten festlegen: Keine Daten senden, wenn der Abstand einen bestimmten Grenzwert unterschreitet (z. B. 10 m)
- Aktivieren Sie „Aufzeichnung stoppen, wenn keine Bewegung erkannt wird“
- Owntracks-Client-APP
- Die App sendet die Positionsdaten an einen MQTT-Server (kann verschlüsselt werden). Thema:
owntracks/<username>
zB owntracks/gps
- Unter
mqtt-bridge
steht ein Bridge-Code zur Verfügung, der die Daten vom MQTT-Server extrahiert und an den Simple GPS Data Server sendet - Das Beispiel beinhaltet auch den MQTT-Server
- Dies ist eine reine Docker-Implementierung
- Wie
- Passen Sie die Datei
docker-compose.yml
an Ihr Setup an oder setzen Sie die entsprechenden Umgebungsvariablen (Server, Passwörter, Geheimnisse ...) - Erstellen Sie den Container des Bridge-Code-
docker-compose build
- Starten Sie den Container
docker-compose up -d
- Legen Sie den Benutzernamen und das Passwort fest:
sudo docker exec gps-mqtt sh -c "mosquitto_passwd -b mosquitto/config/password.txt <username> <password>"
- Kommerzielle Geräte senden die GPS-Position meist per TCP/UDP. Dafür muss der Server laufen
- Stellen Sie den TCP/IP-Server und den Port in config.php ein
- Konfigurieren Sie den Server und den Port im Tracking-Gerät (normalerweise per SMS. Lesen Sie im Handbuch nach, wie das geht)
- Der Server muss kompiliert und im Verzeichnis ./exe/ abgelegt werden
- Kopieren Sie
devices.config
in das Verzeichnis ./exe/. Dieses enthält reguläre Ausdrücke für verschiedene Formate (z. B. OpenGTS, TK103)- Weitere Geräte können hinzugefügt werden
- Führen Sie den Server mit der Option -verbose aus, um das Format zu untersuchen und entsprechende reguläre Ausdrücke zu
devices.config
hinzuzufügen
- Der Server wird automatisch gestartet, wenn die Admin-Oberfläche geöffnet wird.
- Voraussetzung dafür ist, dass PHP den Server über einen „exec()“-Aufruf starten darf.
- Sollte dies nicht möglich sein, muss der Server manuell oder über einen Cronjob gestartet werden.
Konfiguration der Karte
- Die Karte und Tracks werden durch das Java-Skript GPX Viewer von Jürgen Berkemeier (https://www.j-berkemeier.de/GPXViewer/) eingebunden.
- Aussehen und Verhalten können durch Hinzufügen optionaler Parameter (auf der obigen Webseite aufgeführt) zur HTML-Vorlage in
html/gpxviewer_html.template
gesteuert werden - die Standardkarte wird in config.php ausgewählt (OpenStreet-Map (OSM,OSMDE) , Google-Map (Karte))
- Um Google Maps nutzen zu können, ist ein API-Schlüssel erforderlich. Der Schlüssel muss in das Skript
js/GM_utils/GPX2GM_Defs.js
eingegeben werden
TCP/UDP-Server
Der GO-Code öffnet einen Port und akzeptiert Verbindungen über TCP und UDP. Der Server verarbeitet das Paket nur und antwortet (normalerweise) nicht. Die empfangenen Daten werden durch reguläre Ausdrücke bekannter Geräteformate (./exe/devices.config) abgeglichen. Wenn eine Übereinstimmung gefunden wird und die Geräte-ID bekannt ist, werden die GPS-Daten in das vom PHP-Code erwartete Format konvertiert und über eine HTTP-Verbindung an den Server übergeben (z. B. localhost/gpstracker/index.php). Der GPS-Standort wird dann in der Datenbank gespeichert. An den Server zu übergebende Parameter:
-port <portnumber>
-httpserver <server name - e.g. localhost>
-urlpath <path on server>
-key <secret key in order to check the status of the server - used by PHP>
-verbose - print raw messages, which allows to determine the format send by the device
Beispielanruf
nohup tcp_udp_http_bridge -port 20202 -httpserver localhost -urlpath /gpstracker/index.php -key 123456
Verschlüsselung von UDP-Daten
Der TCP/UDP-Server kann AES-verschlüsselte Pakete verarbeiten. Dies erfordert einen serverweiten PSK in ./exe/encrypt_psk.config
. Derzeit ist dies nur in meiner privaten Version des GPS-Loggers für Android implementiert.
Informationen zu GPS-Datenformaten
Die meisten Geräte stellen die Daten als NMEA GPRMC-Datensatz zur Verfügung (siehe https://de.wikipedia.org/wiki/NMEA_0183)
$GPRMC,162614,A,5230.5900,N,01322.3900,E,10.0,90.0,131006,1.2,E,A*13
identifier, time, Active/Void, latitude, N/S, longitude, E/W, speed, angle, date, magnetic deviation, E/W, signal integrity, check sum
Breiten- und Längengrad werden in Grad und Minuten (ttmm.mmmm) angegeben und vom Server in Grad gespeichert. Geschwindigkeit wird in Knoten angegeben und vom Server in m/s gespeichert.
Häufig wird ein reduzierter GPRMC-Datensatz (keine magnetische Abweichung) mit zusätzlichen Kennungen für den Gerätetyp und das identifizierte Gerät verwendet. Bei der Identifizierung handelt es sich häufig um die IMEI-Nummer des Geräts. Da GPRMC die Höhe und die Präzision/Genauigkeit fehlen, wird dies manchmal hinzugefügt. Die Prüfsumme wird durch ein XOR aller Zeichen (ASCII-Codes) zwischen dem $ und dem * berechnet.
HTTP-Format
https://my-server.com?time=UTC&lat=LATITUDE&lon=LONGITUDE&alt=ALTITUDE&acc=ACCURACY&id=DEVICEID (lat and lon given in degree 0-180 and 0-360, respectively) or
https://my-server.com?id=DEVICEID&gprmc=<GPRMC-RECORD> or
TCP/UDP-Format
GPS-Logger für Android (OpenGTS-Format)
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20
username/deviceid/GPRMC-RECORD
GPS-Logger für Android mit angehängter Höhe
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20,alt=100.5
Kommerzielle Geräte (TCP/UDP)
Es gibt verschiedene Formate. Normalerweise folgt auf einen kurzen Header von 2-3 Zeichen die IMEI/Geräteidentifikationsnummer des Geräts, 2 Zeichen Status und ein mehr oder weniger vollständiger GPRMC-Datensatz (ohne $GPRMC-Header). Am Ende könnten einige Statusbits hinzugefügt werden. Die meisten Geräte senden zusätzlich eine Heartbeart-Nachricht, die ein anderes Format hat. Bei einigen Geräten ist eine Anmeldung erforderlich, um die Kommunikation zu starten. Dieses Protokoll ist in der Server- und Gerätekonfiguration enthalten, wird jedoch derzeit nicht getestet. Derzeit ist in der devices.config nur ein TK103B H02-Gerät enthalten.
Beispiel einer GPS-Standortnachricht über UDP
*HQ,7893267561,V1,050316,A,2212.8745,N,11346.6574,E,14.28,028,220902,FFFFFFFF#
HQ ist die Hersteller-ID, gefolgt von einer Identifikationsnummer und dem Nachrichtentyp „V1“. Im GPRMC-Datensatz fehlen der $GPRMC-Header, die magnetische Abweichung und die Prüfsumme. Am Ende der Nachricht werden Statusinformationen angegeben.