Простой сервер GPS-данных
Соберите координаты GPS с устройств (смартфон, GPS-трекер), сохраните их в базе данных SQLite и отобразите на карте (OSM или Google).
- Данные принимаются от устройства либо через HTTPS (PHP), либо через пакет tcp/udp (сервер GO).
- Сохраненные треки можно загрузить в виде файла GPX.
- Простой интерфейс администратора для добавления и редактирования новых устройств.
Требования
- Веб-сервер (Apache или аналогичный), поддерживающий аутентификацию (для страницы администратора)
- PHP с установленным API SQLITE3 (например, пакет php-sqlite3) и сокетами (например, пакет php-sockets).
- Компилятор GO для моста TCP/UDP-HTTP (требуется только для коммерческих устройств слежения, таких как TK103 или GPS Logger, в режиме UDP). Требуется дополнительный пакет golang.org/x/crypto. Установите с помощью «Go Get golang.org/x/crypto».
- Java-скрипт GPXViewer от Юргена Беркемайера (папка
js/GM_utils/
)
Установка
- Использование Докера
- Скопируйте папку
docker
на свой сервер (переименуйте, например, в gps-server
) - Скопируйте папку
webapp
(и, если необходимо, tcp_udp_http_bridge
) в каталог gps-server
- Следуйте инструкциям в папке docker.
- Устанавливайте каждый компонент отдельно
- Скопируйте все файлы из папки веб-приложения в папку веб-пространства (предполагается, что это ./gpstracker/).
- Создайте соответствующую запись в конфигурации веб-сервера, чтобы разрешить веб-доступ и запуск PHP.
- Настройте файл .htaccess верхнего уровня (Apache) или ограничьте доступ в конфигурации Nginx (пример nginx.conf).
- Установите аутентификацию для интерфейса администратора
- В файле
auth/.htpasswd
включен один admin
пользователя с changeme
пароля. - Путь к файлу .htpasswd необходимо настроить в
admin/.htaccess
. Требуется абсолютный путь! - Обновите .htpasswd, добавив новых пользователей/пароли. Лучше всего использовать командную строку
htpasswd /path-to-htpasswd-file/.htpasswd myusername mypassword
или онлайн-генератор
- Редактировать скрипты/config.php: настроить настройки
- Определите часовой пояс, какую карту использовать, формат даты/времени.
- Укажите промежуток времени без движения, который будет распознан как пауза.
- Укажите время без движения для начала нового трека
- Включить или отключить запуск GO-сервера tcp/udp Bridge
- Получите javascript GPXViewer с
https://www.j-berkemeier.de/GPXViewer/
и скопируйте папку GM_Utils в gpstracker/js/
- Для использования карт Google требуется ключ API. Найдите
google maps api key application
- Отредактируйте файл
./js/GM_Utils/GPX2GM_Defs.js
, раскомментируйте строку, содержащую JB.GPX2GM.GM_Api_key
, и добавьте ключ API в качестве значения.
- TCP/UDP-HTTP-мост
- включить/отключить в скриптах/config.php
- скомпилировать код с помощью GO в tcp_udp_http_bridge (перейти к сборке)
- скопировать исполняемый файл в каталог exe в веб-пространстве
- соответствующим образом отрегулируйте config.php (имя и путь к исполняемому файлу)
- вызвать интерфейс администратора, чтобы запустить сервер
- добавьте запись crontab для проверки раз в час, работает ли сервер (требуется «wget»)
1 * * * * /usr/bin/wget -O /dev/null -o /dev/null https://servername/gpstracker?checkserver=SECRETKEY >/dev/null 2>&1
- Файл базы данных будет создан автоматически.
Введите устройства слежения
- откройте страницу https://servername/gpstracker/admin и заполните форму
Просмотр данных
- открыть страницу https://servername/gpstracker?id=ID-of-device
- необязательный параметр для выбора временного интервала: dt= в минутах (м), часах (ч), днях (д) или годах (г), например «10д» для 10 дней.
Устройства слежения
- Любое приложение отслеживания, совместимое с OpenGTS или Traccar, будет работать.
- Примеры: GPS Logger для Android, клиент Traccar...
- GPS-регистратор для Android
- Откройте настройки -> Подробности журнала -> «Войти на сервер OpenGTS», чтобы активировать отслеживание в реальном времени.
- сервер: "<имя_сервера.com>"
- порт: 443
- метод связи: HTTPS
- путь к серверу: /gpstracker
- идентификатор устройства: идентификатор, который вы ввели в интерфейсе администратора.
- проверьте связь, нажав «проверить сертификат SSL»
- Альтернативный метод связи UDP: используйте номер порта, указанный в config.php (по умолчанию 20202) -> требует запуска сервера.
- Если стоимость мобильной передачи данных является проблемой, UDP — лучший выбор, поскольку объем данных минимален.
- Настройки->производительность
- выберите интервал (например, 20 секунд)
- держите GPS включенным между исправлениями: имеет смысл на короткий промежуток времени, но требует больше заряда батареи
- установить расстояние между точками данных: не отправлять данные, если расстояние ниже определенного предела (например, 10 м)
- активируйте «остановить запись, если движение не обнаружено»
- Клиентское приложение Owntracks
- Приложение отправляет данные о местоположении на сервер MQTT (может быть зашифровано). Тема:
owntracks/<username>
например owntracks/gps
- Код моста, который извлекает данные с сервера MQTT и отправляет их на простой сервер данных GPS, доступен в разделе
mqtt-bridge
- Пример также включает сервер MQTT.
- Это чистая реализация докера
- Как
- Настройте файл
docker-compose.yml
в соответствии с вашими настройками или установите соответствующие переменные среды (сервер, пароли, секреты...) - Создайте контейнер
docker-compose build
кода моста. - Запустите контейнеры
docker-compose up -d
- Установите имя пользователя и пароль:
sudo docker exec gps-mqtt sh -c "mosquitto_passwd -b mosquitto/config/password.txt <username> <password>"
- Коммерческие устройства обычно отправляют координаты GPS через TCP/UDP. Для этого требуется, чтобы сервер работал
- установите TCP/IP-сервер и порт в config.php
- настроить сервер и порт в устройстве слежения (обычно это делается через SMS. Как это сделать, посмотрите в инструкции)
- сервер необходимо скомпилировать и поместить в каталог ./exe/
- скопируйте
devices.config
в каталог ./exe/. Содержит регулярные выражения для разных форматов (например, OpenGTS, TK103).- Можно добавить больше устройств
- Запустите сервер с опцией -verbose, чтобы изучить формат и добавить соответствующие регулярные выражения в
devices.config
- Сервер запускается автоматически при открытии интерфейса администратора.
- Для этого необходимо, чтобы PHP мог запускать сервер с помощью вызова exec().
- Если это невозможно, сервер необходимо запустить вручную или с помощью задания cron.
Конфигурация карты
- карта и треки включены в Java-скрипт GPX Viewer Юргена Беркемайера (https://www.j-berkemeier.de/GPXViewer/)
- внешним видом и поведением можно управлять, добавляя дополнительные параметры (перечисленные на веб-странице выше) в шаблон html в
html/gpxviewer_html.template
- карта по умолчанию выбирается в config.php (OpenStreet-Map (OSM,OSMDE), Google-Map (Karte))
- для использования карт Google требуется ключ API. Ключ необходимо ввести в скрипт
js/GM_utils/GPX2GM_Defs.js
TCP/UDP-сервер
Код GO открывает порт и принимает соединения через TCP и UDP. Сервер просто переваривает пакет и (обычно) не отвечает. Полученные данные сопоставляются с регулярными выражениями известных форматов устройств (./exe/devices.config). Если совпадение найдено и идентификатор устройства известен, данные GPS преобразуются в формат, ожидаемый кодом PHP, и передаются через HTTP-соединение на сервер (например, localhost/gpstracker/index.php). Местоположение GPS затем сохраняется в базе данных. Параметры для передачи на сервер:
-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
Пример звонка
nohup tcp_udp_http_bridge -port 20202 -httpserver localhost -urlpath /gpstracker/index.php -key 123456
Шифрование данных UDP
Сервер tcp/udp может обрабатывать пакеты, зашифрованные AES. Для этого требуется общесерверный PSK в ./exe/encrypt_psk.config
. В настоящее время это реализовано только в моей частной версии GPS-регистратора для Android.
Информация о форматах данных GPS
Большинство устройств предоставляют данные в виде записи NMEA GPRMC (см. 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
Широта и долгота задаются в градусах и минутах (ддмм.мммм), сохраняются на сервере в градусах. Скорость указывается в узлах и сохраняется на сервере в м/сек.
Часто используется сокращенная запись GPRMC (без магнитного отклонения) с дополнительными идентификаторами типа устройства, идентифицируемого устройства. Идентифицированным часто является номер IMEI устройства. Поскольку GPRMC не хватает высоты и точности/точности, иногда это добавляется. Контрольная сумма рассчитывается путем XOR всех символов (кодов ASCII) между $ и *.
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
Формат TCP/UDP
GPS-логгер для Android (формат OpenGTS)
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20
username/deviceid/GPRMC-RECORD
GPS-регистратор для Android с добавленной высотой
uabcde/Y0xXyY/$GPRMC,180725,A,5637.37477,N,1211.26495,E,0.000000,0.000000,021017,,*20,alt=100.5
Коммерческие устройства (TCP/UDP)
Существуют разные форматы. Обычно за коротким заголовком из 2-3 символов следует IMEI/идентификационный номер устройства, 2-значный статус и более или менее полная запись GPRMC (без заголовка $GPRMC). В конце могут быть добавлены некоторые биты состояния. Большинство устройств дополнительно отправляют сообщение Heartbeart, имеющее другой формат. Некоторые устройства требуют входа в систему, чтобы начать связь. Этот протокол включен в конфигурацию сервера и устройства, но в настоящее время не протестирован. В настоящее время в файл devices.config включено только устройство TK103B H02.
Пример сообщения о местоположении GPS через UDP
*HQ,7893267561,V1,050316,A,2212.8745,N,11346.6574,E,14.28,028,220902,FFFFFFFF#
HQ — это идентификатор производителя, за которым следует идентификационный номер и тип сообщения «V1». В записи GPRMC отсутствуют заголовок $GPRMC, магнитное отклонение и контрольная сумма. В конце сообщения приводится информация о состоянии.