Python
March 11, 2024

Socket-сервер для GPS маяка

Простая реализация сокет-сервера на Python для перехвата данных от GPS маяка SinoTrack с последующей отправкой на сервер мониторинга Ruhavik, а также записью координат во временную базу данных Influx с последующей визуализацией данных в Grafana.

Такая схема используется для того, чтобы в Grafana выставить уведомление на различные события, например, низкий заряд батареи или когда маяк начал движение.

Сервер на Python

Запускать через Supervisor.

Supervisor - это простой менеджер процессов с открытым исходным кодом, написанный на Python, с помощью которого можно запускать нужное количество копий процесса и следить за их состоянием.

GitHub Gist: Socket-сервер на Python и Influx

https://gist.github.com/telnex/8aa003055062b4c5f142321fe6da31d6

Клиент

В нашем случае клиент нужен только для отладки, т.к. на практике в роли клиента будет наш SinoTrack маяк.

import socket

HOST = 'localhost'
PORT = 30200        
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'*HQ,7028702252,V1,182350,A,4740.7697,N,04950.0711,E,0.00,0,250324,fbfffbff,250,02,3039,23394,55#')
    data = s.recv(1024)
print('Received', repr(data))

Настройка маяка через СМС

Стандартные команды для настройки SinoTrack.

Команда: 804paswd IP PORT. 
Пример: 8040000 45.112.204.217 8090 
Ответ: SET OK

Настройка базы данных Influx

не актуально

На данном этапе InfluxDB версии 1.х уже должна быть установлена.

CREATE DATABASE GPS
USE DATABASE GPS
SHOW RETENTION POLICIES
CREATE RETENTION POLICY "Month" ON "GPS" DURATION 720h REPLICATION 1;
ALTER RETENTION POLICY "Month" ON "GPS" DEFAULT
Пример визуализации данных через Grafana
Пример запроса для плагина Map
Параметры плагина Map для отображения координат

Уведомление о начале движения

Плагин: Time series

Evaluate every 1m For 2m
WHEN last() OF query (A, 5m, now) IS ABOVE 1

Проблемы

Периодически возникали проблемы с недоступностью скрипта: не отвечал на запросы. Ошибок не было, порт также прослушивался. Искусственно воспроизвести ошибку не получалось. По этой причине код был переписан на Twisted. На данном фреймворке описанная проблема не наблюдалась.

Документация

  1. docs.python.org/3/library/socketserver.html
  2. https://flespi.com/protocols
  3. https://help.influxcloud.net/getting_started_cli/
  4. https://docs.twisted.org/en/stable/core/examples/index.html