Servidor de datos GPS simple
Recopile la posición GPS de los dispositivos (teléfono inteligente, rastreador GPS), guárdela en una base de datos SQLite y permita mostrarla en un mapa (OSM o Google).
- Los datos se reciben desde el dispositivo a través de HTTPS (PHP) o un paquete tcp/udp (servidor GO)
- Las pistas almacenadas se pueden descargar como un archivo GPX
- Interfaz de administración sencilla para agregar y editar nuevos dispositivos
Requisitos
- Servidor web (Apache o similar), que admite autenticación (para la página de administración)
- PHP con API SQLITE3 (por ejemplo, paquete php-sqlite3) y sockets (por ejemplo, paquete php-sockets) instalados
- Compilador GO para puente TCP/UDP-HTTP (solo necesario para dispositivos de seguimiento comerciales como TK103 o GPS Logger en modo UDP). Se requiere el paquete adicional golang.org/x/crypto. Instalar con "ir a buscar golang.org/x/crypto"
- script java GPXViewer de Jürgen Berkemeier (carpeta
js/GM_utils/
)
Instalación
- Usando ventana acoplable
- Copie la carpeta
docker
a su servidor (cambie el nombre, por ejemplo, a gps-server
) - Copie la carpeta
webapp
(y si es necesario tcp_udp_http_bridge
) en el directorio gps-server
- Siga las instrucciones en la carpeta acoplable.
- Instale cada componente por separado
- Copie todos los archivos en la carpeta de la aplicación web a la carpeta del espacio web (en lo siguiente se supone ./gpstracker/)
- Cree la entrada correspondiente en la configuración del servidor web para permitir el acceso web y la ejecución de php
- Ajuste el archivo .htaccess de nivel superior (Apache) o limite el acceso en la configuración de Nginx (ejemplo nginx.conf)
- Establecer la autenticación para la interfaz de administración
- En el archivo
auth/.htpasswd
se incluye un único usuario admin
con el changeme
de contraseña. - La ruta al archivo .htpasswd debe ajustarse en
admin/.htaccess
. ¡Se requiere el camino absoluto! - Actualice .htpasswd con nuevos usuarios/contraseñas. Mejor usa la línea de comando
htpasswd /path-to-htpasswd-file/.htpasswd myusername mypassword
o un generador en línea
- Editar scripts/config.php: ajustar la configuración
- Definir zona horaria, qué mapa usar, formato de fecha/hora
- Especifique el lapso de tiempo sin movimiento que se reconocerá como pausa
- Especificar el tiempo sin movimiento para iniciar una nueva pista
- Habilitar o deshabilitar el inicio del servidor GO del puente tcp/udp
- Obtenga el javascript GPXViewer de
https://www.j-berkemeier.de/GPXViewer/
y copie la carpeta GM_Utils a gpstracker/js/
- Para utilizar Google Maps, se requiere una clave API. Busque
google maps api key application
- Edite el archivo
./js/GM_Utils/GPX2GM_Defs.js
y descomente la línea que contiene JB.GPX2GM.GM_Api_key
y agregue la clave API como valor
- Puente TCP/UDP-HTTP
- habilitar/deshabilitar en scripts/config.php
- compilar código con GO en tcp_udp_http_bridge (ir a compilar)
- copiar el ejecutable al directorio exe en el espacio web
- ajuste config.php en consecuencia (nombre y ruta del/al ejecutable)
- llame a la interfaz de administración para iniciar el servidor
- agregue una entrada crontab para verificar una vez por hora si el servidor se está ejecutando (requiere "wget")
1 * * * * /usr/bin/wget -O /dev/null -o /dev/null https://servername/gpstracker?checkserver=SECRETKEY >/dev/null 2>&1
- El archivo de base de datos se creará automáticamente.
Introduzca los dispositivos de seguimiento
- abra la página https://servername/gpstracker/admin y complete el formulario
Ver datos
- abra la página https://servername/gpstracker?id=ID-of-device
- Parámetro opcional para seleccionar el lapso de tiempo: dt= en min(m), horas(h), días(d) o años(y), por ejemplo, "10d" para 10 días
Dispositivos de seguimiento
- Cualquier aplicación de seguimiento compatible con OpenGTS o Traccar funcionará
- Ejemplos: GPS Logger para Android, Traccar Client...
- Registrador GPS para Android
- Abra configuración -> Detalles de registro -> "Iniciar sesión en el servidor OpenGTS" para activar el seguimiento en tiempo real
- servidor: "<nombredeservidor.com>"
- puerto: 443
- método de comunicación: HTTPS
- ruta del servidor: /gpstracker
- ID del dispositivo: la ID que ingresó en la interfaz de administración
- Pruebe la comunicación haciendo clic en "verificar certificado SSL"
- Método de comunicación alternativo UDP: use el número de puerto proporcionado en config.php (predeterminado 20202) -> requiere que el servidor se ejecute
- Si el coste de la transmisión de datos móviles es un problema, UDP es la mejor opción, ya que la cantidad de datos es mínima
- Configuración->rendimiento
- seleccione el intervalo (por ejemplo, 20 segundos)
- mantener el GPS activado entre arreglos: tiene sentido durante un intervalo corto, pero necesita más batería
- establecer la distancia entre puntos de datos: no enviar datos, cuando la distancia está por debajo de un cierto límite (por ejemplo, 10 m)
- activar "detener grabación, si no se detecta movimiento"
- Aplicación cliente Owntracks
- La aplicación envía los datos de posición a un servidor MQTT (puede cifrarse). Tema:
owntracks/<username>
, por ejemplo, owntracks/gps
- Un código de puente, que extrae los datos del servidor MQTT y los envía al servidor de datos GPS simple, está disponible en
mqtt-bridge
- El ejemplo también incluye el servidor MQTT.
- Esta es una implementación pura de Docker.
- Cómo
- Ajuste el archivo
docker-compose.yml
a su configuración o establezca las variables de entorno correspondientes (servidor, contraseñas, secretos...) - Construya el contenedor del código puente
docker-compose build
- Inicie los contenedores
docker-compose up -d
- Establezca el nombre de usuario y la contraseña:
sudo docker exec gps-mqtt sh -c "mosquitto_passwd -b mosquitto/config/password.txt <username> <password>"
- Los dispositivos comerciales suelen enviar la posición GPS vía tcp/udp. Esto requiere que el servidor se ejecute.
- configurar el servidor TCP/IP y el puerto en config.php
- configurar el servidor y el puerto en el dispositivo de seguimiento (generalmente se hace a través de SMS. Consulte el manual sobre cómo hacerlo)
- El servidor debe compilarse y colocarse en el directorio ./exe/.
- copie
devices.config
al directorio ./exe/. Contiene expresiones regulares para diferentes formatos (por ejemplo, OpenGTS, TK103)- Se pueden agregar más dispositivos
- Ejecute el servidor con la opción -verbose para estudiar el formato y agregar las expresiones regulares correspondientes a
devices.config
- El servidor se inicia automáticamente cuando se abre la interfaz de administración.
- Esto requiere que PHP tenga permiso para iniciar el servidor mediante una llamada "exec()".
- Si esto no es posible, el servidor debe iniciarse manualmente o mediante una tarea cron.
Configuración del mapa
- el mapa y las rutas están incluidos en el script java GPX Viewer de Jürgen Berkemeier (https://www.j-berkemeier.de/GPXViewer/)
- la apariencia y el comportamiento se pueden controlar agregando parámetros opcionales (enumerados en la página web anterior) en la plantilla html en
html/gpxviewer_html.template
- el mapa predeterminado se selecciona en config.php (OpenStreet-Map (OSM,OSMDE), Google-Map (Karte))
- Para utilizar Google Maps, se requiere una clave API. La clave debe ingresarse en el script
js/GM_utils/GPX2GM_Defs.js
Servidor TCP/UDP
El código GO abre un puerto y acepta conexiones vía TCP y UDP. El servidor simplemente digiere el paquete y (normalmente) no responde. Los datos recibidos coinciden con expresiones regulares de formatos de dispositivos conocidos (./exe/devices.config). Si se encuentra una coincidencia y se conoce el ID del dispositivo, los datos del GPS se convierten al formato esperado por el código PHP y se pasan a través de una conexión HTTP al servidor (por ejemplo, localhost/gpstracker/index.php). Luego, la ubicación GPS se almacena en la base de datos. Parámetros a pasar al servidor:
-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
llamada de ejemplo
nohup tcp_udp_http_bridge -port 20202 -httpserver localhost -urlpath /gpstracker/index.php -key 123456
Cifrado de datos UDP
El servidor tcp/udp puede manejar paquetes cifrados AES. Esto requiere un PSK para todo el servidor en ./exe/encrypt_psk.config
. Actualmente esto sólo está implementado en mi versión privada del registrador GPS para Android.
Información sobre formatos de datos GPS
La mayoría de los dispositivos proporcionan los datos como un registro NMEA GPRMC (consulte 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 latitud y la longitud se dan en grados y minutos (ddmm.mmmm), y el servidor los almacena en grados. Velocidad dada en nudos y almacenada por el servidor en m/seg.
A menudo se utiliza un registro GPRMC reducido (sin desviación magnética), con identificadores adicionales para el tipo de dispositivo, dispositivo identificado. El identificado suele ser el número IMEI del dispositivo. Dado que a GPRMC le falta altitud y precisión/exactitud, a veces se agrega esto. La suma de verificación se calcula mediante un XOR de todos los caracteres (códigos ASCII) entre $ y *
formato 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
Formato TCP/UDP
Registrador GPS para Android (formato OpenGTS)
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20
username/deviceid/GPRMC-RECORD
Registrador GPS para Android con altitud adjunta
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20,alt=100.5
Dispositivos comerciales (TCP/UDP)
Existen diferentes formatos. Por lo general, un encabezado corto de 2 a 3 caracteres va seguido del IMEI/número de identificación del dispositivo, el estado de 2 caracteres y un registro GPRMC más o menos completo (sin encabezado $GPRMC). Es posible que se agreguen algunos bits de estado al final. La mayoría de los dispositivos envían además un mensaje de corazón, que tiene un formato diferente. Algunos dispositivos requieren iniciar sesión para iniciar la comunicación. Este protocolo está incluido en la configuración del servidor y del dispositivo, pero actualmente no se ha probado. Actualmente, solo se incluye un dispositivo TK103B H02 en devices.config.
Ejemplo de mensaje de ubicación GPS vía UDP
*HQ,7893267561,V1,050316,A,2212.8745,N,11346.6574,E,14.28,028,220902,FFFFFFFF#
HQ es el ID del fabricante, seguido de un número de identificación y el tipo de mensaje "V1". Al registro GPRMC le falta el encabezado $GPRMC, la desviación magnética y la suma de verificación. Al final del mensaje, se proporciona información de estado.