Serveur de données GPS simple
Collectez la position GPS des appareils (smartphone, traceur GPS), stockez-la dans une base de données SQLite et permettez-la de l'afficher sur une carte (OSM ou Google).
- Les données sont reçues de l'appareil via HTTPS (PHP) ou un paquet TCP/UDP (serveur GO).
- Les pistes stockées peuvent être téléchargées sous forme de fichier GPX
- Interface d'administration simple pour ajouter et modifier de nouveaux appareils
Exigences
- Serveur Web (Apache ou similaire), qui prend en charge l'authentification (pour la page d'administration)
- PHP avec l'API SQLITE3 (par exemple le package php-sqlite3) et les sockets (par exemple le package php-sockets) installés
- Compilateur GO pour pont TCP/UDP-HTTP (nécessaire uniquement pour les appareils de suivi commerciaux comme TK103 ou GPS Logger en mode UDP). Le package supplémentaire golang.org/x/crypto est requis. Installez avec "allez chercher golang.org/x/crypto"
- script java GPXViewer par Jürgen Berkemeier (dossier
js/GM_utils/
)
Installation
- Utiliser Docker
- Copiez le dossier
docker
sur votre serveur (renommez par exemple en gps-server
) - Copiez le dossier
webapp
(et si besoin tcp_udp_http_bridge
) dans le répertoire gps-server
- Suivez les instructions dans le dossier docker
- Installez chaque composant séparément
- Copiez tous les fichiers du dossier webapp dans le dossier de l'espace Web (dans ce qui suit, ./gpstracker/ est supposé)
- Créez l'entrée correspondante dans la configuration du serveur Web pour permettre l'accès au Web et l'exécution de PHP.
- Ajustez le fichier .htaccess de niveau supérieur (Apache) ou limitez l'accès dans la configuration Nginx (exemple nginx.conf)
- Définir l'authentification pour l'interface d'administration
- Dans le fichier
auth/.htpasswd
un seul utilisateur admin
avec le mot de passe changeme
est inclus - Le chemin d'accès au fichier .htpasswd doit être ajusté dans
admin/.htaccess
. Le chemin absolu est obligatoire ! - Mettez à jour .htpasswd avec de nouveaux utilisateurs/mots de passe. Il est préférable d'utiliser la ligne de commande
htpasswd /path-to-htpasswd-file/.htpasswd myusername mypassword
ou un générateur en ligne
- Modifier les scripts/config.php : ajuster les paramètres
- Définir le fuseau horaire, la carte à utiliser, le format date/heure
- Spécifiez l'intervalle de temps sans mouvement pour être reconnu comme une pause
- Spécifiez l'heure sans mouvement pour démarrer une nouvelle piste
- Activer ou désactiver le démarrage du serveur GO tcp/udp bridge
- Obtenez le javascript GPXViewer sur
https://www.j-berkemeier.de/GPXViewer/
et copiez le dossier GM_Utils dans gpstracker/js/
- Pour utiliser Google Maps, une clé API est requise. Recherchez
google maps api key application
- Editez le fichier
./js/GM_Utils/GPX2GM_Defs.js
et décommentez la ligne contenant JB.GPX2GM.GM_Api_key
et ajoutez la clé API comme valeur
- Pont TCP/UDP-HTTP
- activer/désactiver dans scripts/config.php
- compiler le code avec GO dans tcp_udp_http_bridge (go build)
- copier l'exécutable dans le répertoire exe sur l'espace Web
- ajustez config.php en conséquence (nom et chemin de/vers l'exécutable)
- appeler l'interface d'administration pour démarrer le serveur
- ajoutez une entrée crontab pour vérifier une fois par heure si le serveur est en cours d'exécution (nécessite "wget")
1 * * * * /usr/bin/wget -O /dev/null -o /dev/null https://servername/gpstracker?checkserver=SECRETKEY >/dev/null 2>&1
- Le fichier de base de données sera créé automatiquement
Entrez les dispositifs de suivi
- ouvrez la page https://servername/gpstracker/admin et remplissez le formulaire
Afficher les données
- ouvrir la page https://servername/gpstracker?id=ID-of-device
- paramètre facultatif pour sélectionner l'intervalle de temps : dt= en min(m), heures(h), jours(j) ou années(y), par exemple "10j" pour 10 jours
Dispositifs de suivi
- Toute application de suivi compatible OpenGTS ou Traccar fonctionnera
- Exemples : GPS Logger pour Android, Traccar Client...
- Enregistreur GPS pour Android
- Ouvrez les paramètres -> Détails de journalisation -> "Connectez-vous au serveur OpenGTS" afin d'activer le suivi en temps réel
- serveur : "<nom du serveur.com>"
- port : 443
- méthode de communication : HTTPS
- chemin du serveur : /gpstracker
- ID de l'appareil : l'ID que vous avez entré dans l'interface d'administration
- testez la communication en cliquant sur "vérifier le certificat SSL"
- Méthode de communication alternative UDP : utilisez le numéro de port indiqué dans config.php (20202 par défaut) -> nécessite que le serveur s'exécute
- Si le coût de la transmission de données mobiles pose problème, UDP est le meilleur choix, car la quantité de données est minime.
- Paramètres->performances
- sélectionner l'intervalle (par exemple 20 secondes)
- garder le GPS activé entre les corrections : cela est logique pendant un court intervalle, mais nécessite plus de batterie
- définir la distance entre les points de données : n'envoyer aucune donnée lorsque la distance est inférieure à une certaine limite (par exemple 10 m)
- activer "arrêter l'enregistrement, si aucun mouvement n'est détecté"
- APPLICATION client Owntracks
- L'application envoie les données de position à un serveur MQTT (peut être cryptée). Sujet :
owntracks/<username>
par exemple owntracks/gps
- Un code de pont, qui extrait les données du serveur MQTT et les envoie au Simple GPS Data Server, est disponible sous
mqtt-bridge
- L'exemple inclut également le serveur MQTT
- Il s'agit d'une pure implémentation Docker
- Comment
- Ajustez le fichier
docker-compose.yml
à votre configuration ou définissez les variables d'environnement correspondantes (serveur, mots de passe, secrets...) - Construisez le conteneur de la
docker-compose build
du code de pont - Démarrez les conteneurs
docker-compose up -d
- Définissez le nom d'utilisateur et le mot de passe :
sudo docker exec gps-mqtt sh -c "mosquitto_passwd -b mosquitto/config/password.txt <username> <password>"
- Les appareils commerciaux envoient généralement la position GPS via TCP/UDP. Cela nécessite que le serveur s'exécute
- définir le serveur TCP/IP et le port dans config.php
- configurer le serveur et le port du dispositif de suivi (généralement effectué via SMS. Consultez le manuel pour savoir comment procéder)
- le serveur doit être compilé et placé dans le répertoire ./exe/
- copiez
devices.config
dans le répertoire ./exe/. Celui-ci contient des expressions régulières pour différents formats (par exemple OpenGTS, TK103)- Plus d'appareils peuvent être ajoutés
- Exécutez le serveur avec l'option -verbose pour étudier le format et ajouter les expressions régulières correspondantes à
devices.config
- Le serveur est automatiquement démarré lorsque l'interface d'administration est ouverte.
- Cela nécessite que PHP soit autorisé à démarrer le serveur via un appel "exec()".
- Si cela n'est pas possible, le serveur doit être démarré manuellement ou via une tâche cron.
Configuration de la carte
- la carte et les traces sont incluses par le script java GPX Viewer de Jürgen Berkemeier (https://www.j-berkemeier.de/GPXViewer/)
- l'apparence et le comportement peuvent être contrôlés en ajoutant des paramètres facultatifs (répertoriés sur la page Web ci-dessus) dans le modèle HTML dans
html/gpxviewer_html.template
- la carte par défaut est sélectionnée dans config.php (OpenStreet-Map (OSM,OSMDE) , Google-Map (Karte))
- pour utiliser Google Maps, une clé API est requise. La clé doit être saisie dans le script
js/GM_utils/GPX2GM_Defs.js
Serveur TCP/UDP
Le code GO ouvre un port et accepte les connexions via TCP et UDP. Le serveur digère simplement le paquet et ne répond (généralement) pas. Les données reçues correspondent à des expressions régulières de formats de périphérique connus (./exe/devices.config). Si une correspondance est trouvée et que l'ID de l'appareil est connu, les données GPS sont converties au format attendu par le code PHP et transmises via une connexion HTTP au serveur (par exemple localhost/gpstracker/index.php). La localisation GPS est ensuite stockée dans la base de données. Paramètres à transmettre au serveur :
-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
Exemple d'appel
nohup tcp_udp_http_bridge -port 20202 -httpserver localhost -urlpath /gpstracker/index.php -key 123456
Chiffrement des données UDP
Le serveur TCP/UDP peut gérer les paquets cryptés AES. Cela nécessite un PSK à l'échelle du serveur dans ./exe/encrypt_psk.config
. Actuellement, cela n'est implémenté que dans ma version privée de l'enregistreur GPS pour Android.
Informations sur les formats de données GPS
La plupart des appareils fournissent les données sous forme d'enregistrement NMEA GPRMC (voir 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
La latitude et la longitude sont données en degrés et minutes (jjmm.mmmm), stockées par le serveur en degrés. Vitesse donnée en nœuds et stockée par le serveur en m/sec.
Souvent, un enregistrement GPRMC réduit est utilisé (pas de déviation magnétique), avec des identifiants supplémentaires pour le type d'appareil, appareil identifié. L'identifié est souvent le numéro IMEI de l'appareil. Comme le GPRMC manque d'altitude et de précision/exactitude, cela est parfois ajouté. La somme de contrôle est calculée par un XOR de tous les caractères (codes ASCII) entre le $ et le *
Format HTTP
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
Format TCP/UDP
Enregistreur GPS pour Android (format OpenGTS)
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20
username/deviceid/GPRMC-RECORD
Enregistreur GPS pour Android avec altitude ajoutée
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20,alt=100.5
Appareils commerciaux (TCP/UDP)
Différents formats existent. Habituellement, un court en-tête de 2 à 3 caractères est suivi du numéro d'identification IMEI/de l'appareil, de l'état de 2 caractères et d'un enregistrement GPRMC plus ou moins complet (sans en-tête $GPRMC). Certains bits d'état peuvent être ajoutés à la fin. La plupart des appareils envoient en plus un message cardiaque, qui a un format différent. Certains appareils nécessitent une connexion pour démarrer la communication. Ce protocole est inclus dans la configuration du serveur et de l'appareil, mais n'est actuellement pas testé. Actuellement, seul un périphérique TK103B H02 est inclus dans devices.config.
Exemple de message de localisation GPS via UDP
*HQ,7893267561,V1,050316,A,2212.8745,N,11346.6574,E,14.28,028,220902,FFFFFFFF#
HQ est l'identifiant du fabricant, suivi d'un numéro d'identification et du type de message "V1". L'enregistrement GPRMC ne contient pas l'en-tête $GPRMC, l'écart magnétique et la somme de contrôle. A la fin du message, des informations d'état sont données.