Servidor de dados GPS simples
Colete a posição GPS de dispositivos (smartphone, rastreador GPS), armazene em um banco de dados SQLite e permita a exibição em um mapa (OSM ou Google).
- Os dados são recebidos do dispositivo via HTTPS (PHP) ou um pacote tcp/udp (servidor GO)
- As trilhas armazenadas podem ser baixadas como um arquivo GPX
- Interface de administração simples para adicionar e editar novos dispositivos
Requisitos
- Servidor Web (Apache ou similar), que suporta autenticação (para a página de administração)
- PHP com API SQLITE3 (por exemplo, pacote php-sqlite3) e soquetes (por exemplo, pacote php-sockets) instalados
- Compilador GO para ponte TCP/UDP-HTTP (necessário apenas para dispositivos de rastreamento comerciais como TK103 ou GPS Logger no modo UDP). O pacote extra golang.org/x/crypto é necessário. Instale com "go get golang.org/x/crypto"
- java script GPXViewer por Jürgen Berkemeier (pasta
js/GM_utils/
)
Instalação
- Usando Docker
- Copie a pasta
docker
para o seu servidor (renomeie, por exemplo, para gps-server
) - Copie a pasta
webapp
(e se necessário tcp_udp_http_bridge
) para o diretório gps-server
- Siga as instruções na pasta docker
- Instale cada componente separadamente
- Copie todos os arquivos da pasta webapp para a pasta do espaço web (a seguir ./gptracker/ é assumido)
- Crie a entrada correspondente na configuração do servidor web para permitir o acesso web e a execução do php
- Ajuste o arquivo .htaccess de nível superior (Apache) ou limite o acesso na configuração do Nginx (exemplo nginx.conf)
- Defina a autenticação para a interface administrativa
- No arquivo
auth/.htpasswd
está incluído um único usuário admin
com a senha changeme
- O caminho para o arquivo .htpasswd deve ser ajustado em
admin/.htaccess
. O caminho absoluto é obrigatório! - Atualize .htpasswd com novos usuários/senhas. Melhor usar a linha de comando
htpasswd /path-to-htpasswd-file/.htpasswd myusername mypassword
ou um gerador online
- Edite scripts/config.php: ajuste as configurações
- Definir fuso horário, qual mapa usar, formato de data/hora
- Especifique o intervalo de tempo sem movimento a ser reconhecido como uma pausa
- Especifique o tempo sem movimento para iniciar uma nova trilha
- Habilitar ou desabilitar o início do servidor GO da ponte tcp/udp
- Obtenha o javascript GPXViewer em
https://www.j-berkemeier.de/GPXViewer/
e copie a pasta GM_Utils para gpstracker/js/
- Para usar o Google Maps, é necessária uma chave de API, pesquise
google maps api key application
- Edite o arquivo
./js/GM_Utils/GPX2GM_Defs.js
e remova o comentário da linha que contém JB.GPX2GM.GM_Api_key
e adicione a chave API como valor
- Ponte TCP/UDP-HTTP
- ativar/desativar em scripts/config.php
- compilar código com GO em tcp_udp_http_bridge (go build)
- copie o executável para o diretório exe no espaço web
- ajuste config.php de acordo (nome e caminho do/para o executável)
- chame a interface administrativa para iniciar o servidor
- adicione uma entrada crontab para verificar uma vez por hora, se o servidor está em execução (requer "wget")
1 * * * * /usr/bin/wget -O /dev/null -o /dev/null https://servername/gpstracker?checkserver=SECRETKEY >/dev/null 2>&1
- O arquivo do banco de dados será criado automaticamente
Insira dispositivos de rastreamento
- abra a página https://servername/gptracker/admin e preencha o formulário
Ver dados
- abra a página https://servername/gptracker?id=ID-of-device
- parâmetro opcional para selecionar o intervalo de tempo: dt= em min(m), horas(h), dias(d) ou anos(y), por exemplo, "10d" para 10 dias
Dispositivos de rastreamento
- Qualquer APP de rastreamento compatível com OpenGTS ou Traccar funcionará
- Exemplos: GPS Logger para Android, Traccar Client ...
- Registrador GPS para Android
- Abra configurações -> Detalhes de registro -> "Log no servidor OpenGTS" para ativar o rastreamento em tempo real
- servidor: "<nomeservidor.com>"
- porta: 443
- método de comunicação: HTTPS
- caminho do servidor: /gptracker
- ID do dispositivo: o ID que você inseriu na interface de administração
- teste a comunicação clicando em "verificar certificado SSL"
- Método de comunicação alternativo UDP: use o número da porta fornecido em config.php (padrão 20202) -> requer que o servidor seja executado
- Se o custo da transmissão de dados móveis for um problema, o UDP é a melhor escolha, já que a quantidade de dados é mínima
- Configurações->desempenho
- selecione o intervalo (por exemplo, 20 segundos)
- manter o GPS ativado entre as correções: faz sentido por um curto intervalo, mas precisa de mais bateria
- definir distância entre pontos de dados: não enviar dados, quando a distância estiver abaixo de um certo limite (por exemplo, 10m)
- ativar "parar gravação, se nenhum movimento for detectado"
- APP cliente Owntracks
- O aplicativo envia os dados de posição para um servidor MQTT (pode ser criptografado). Tópico:
owntracks/<username>
por exemplo, owntracks/gps
- Um código bridge, que extrai os dados do servidor MQTT e os envia para o Simple GPS Data Server, está disponível em
mqtt-bridge
- O exemplo também inclui o servidor MQTT
- Esta é uma implementação pura do docker
- Como fazer
- Ajuste o arquivo
docker-compose.yml
à sua configuração ou defina as variáveis de ambiente correspondentes (servidor, senhas, segredos...) - Construa o contêiner do código de ponte
docker-compose build
- Inicie os contêineres
docker-compose up -d
- Defina o nome de usuário e a senha:
sudo docker exec gps-mqtt sh -c "mosquitto_passwd -b mosquitto/config/password.txt <username> <password>"
- Dispositivos comerciais geralmente enviam a posição GPS via tcp/udp. Isso requer que o servidor execute
- defina o servidor TCP/IP e a porta em config.php
- configurar o servidor e a porta no dispositivo de rastreamento (geralmente feito via SMS. Verifique no manual como fazer isso)
- o servidor deve ser compilado e colocado no diretório ./exe/
- copie
devices.config
para o diretório ./exe/. Contém expressões regulares para diferentes formatos (por exemplo, OpenGTS, TK103)- Mais dispositivos podem ser adicionados
- Execute o servidor com a opção -verbose para estudar o formato e adicionar expressões regulares correspondentes a
devices.config
- o servidor é iniciado automaticamente quando a interface administrativa é aberta.
- Isto requer que o PHP tenha permissão para iniciar o servidor através de uma chamada "exec()".
- Se isso não for possível, o servidor deverá ser iniciado manualmente ou por meio de um cron job.
Configuração do mapa
- o mapa e as trilhas são incluídos pelo java script GPX Viewer de Jürgen Berkemeier (https://www.j-berkemeier.de/GPXViewer/)
- a aparência e o comportamento podem ser controlados adicionando parâmetros opcionais (listados na página da web acima) ao modelo html em
html/gpxviewer_html.template
- o mapa padrão é selecionado em config.php (OpenStreet-Map (OSM,OSMDE) , Google-Map (Karte))
- para usar o Google Maps, é necessária uma chave API. A chave deve ser inserida no script
js/GM_utils/GPX2GM_Defs.js
Servidor TCP/UDP
O código GO abre uma porta e aceita conexões via TCP e UDP. O servidor apenas digere o pacote e (geralmente) não responde. Os dados recebidos são correspondidos por expressões regulares de formatos de dispositivos conhecidos (./exe/devices.config). Se uma correspondência for encontrada e o ID do dispositivo for conhecido, os dados GPS são convertidos para o formato esperado pelo código PHP e passados através de uma conexão HTTP para o servidor (por exemplo, localhost/gptracker/index.php). A localização GPS é então armazenada no banco de dados. Parâmetros a serem passados ao 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
Chamada de exemplo
nohup tcp_udp_http_bridge -port 20202 -httpserver localhost -urlpath /gpstracker/index.php -key 123456
Criptografia de dados UDP
O servidor tcp/udp pode lidar com pacotes criptografados AES. Isso requer um PSK para todo o servidor em ./exe/encrypt_psk.config
. Atualmente isso só está implementado na minha versão privada do registrador GPS para Android.
Informações sobre formatos de dados GPS
A maioria dos dispositivos fornece os dados como um 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
A latitude e a longitude são fornecidas em graus e minutos (ddmm.mmmm), armazenadas pelo servidor em graus. Velocidade dada em nós e armazenada pelo servidor em m/s.
Muitas vezes é usado um registro GPRMC reduzido (sem desvio magnético), com identificadores adicionais para o tipo de dispositivo, dispositivo identificado. O identificado geralmente é o número IMEI do dispositivo. Como o GPRMC carece de altitude e precisão/exatidão, isso às vezes é adicionado. A soma de verificação é calculada por um XOR de todos os caracteres (códigos ASCII) entre $ e *
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 com altitude anexada
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20,alt=100.5
Dispositivos comerciais (TCP/UDP)
Existem diferentes formatos. Normalmente, um cabeçalho curto de 2 a 3 caracteres é seguido pelo número de identificação IMEI/dispositivo do dispositivo, status de 2 caracteres e um registro GPRMC mais ou menos completo (sem cabeçalho $GPRMC). Alguns bits de status podem ser adicionados no final. A maioria dos dispositivos envia além disso uma mensagem de coração, que possui um formato diferente. Alguns dispositivos requerem um login para iniciar a comunicação. Este protocolo está incluído na configuração do servidor e do dispositivo, mas atualmente não foi testado. Atualmente apenas um dispositivo TK103B H02 está incluído em devices.config.
Exemplo de mensagem de localização GPS via UDP
*HQ,7893267561,V1,050316,A,2212.8745,N,11346.6574,E,14.28,028,220902,FFFFFFFF#
HQ é o ID do fabricante, seguido de um número de identificação e do tipo de mensagem “V1”. O registro GPRMC não contém o cabeçalho $GPRMC, o desvio magnético e a soma de verificação. No final da mensagem, são fornecidas informações de status.