Часть 1: Установка GPSD, получение GPS координат и сохранение их в БД SQLite3.

На мини-ПК Orange PI PC2 установлен Armbian.

Приёмник GPS/GLONASS USB подключен в USB. Для получения координат с приёмника используется сервис GPSD.

Установка GPSD на Armbian достаточно проста:

apt install gpsd gpsd-clients

Чтобы GPSD нормально работал, нужно выполнить ещё несколько команд:

systemctl stop gpsd
systemctl stop gpsd.socket
systemctl disable gpsd.socket
systemctl start gpsd

Для проверки работы GPSD можно запустить клиента — cgps. Как только GPS подключится к достаточному кол-ву спутников, так в клиенте станут отображаться текущие координаты. Я заметил, что в моём случае можно считать, что координаты верные когда speed не равно нулю.

Для сохранения данных в БД SQLite3 используется такой скрипт (назовём его gpsLog.py):

import os
import datetime
import sqlite3
from gps import *
from time import *
import time
import threading

#seting the global variable
gpsd = None 
gpsp = None
fixTime = False
dbName = ""
# Здесь будут храниться файлы базы данных SQLite3.
gpsdata = r'/var/gpsdata'
tableName = "track"
#---

class GpsPoller(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
    global gpsd #bring it in scope
    gpsd = gps(mode=WATCH_ENABLE) #starting the stream of info
    self.current_value = None
    self.running = True #setting the thread running to true

  def run(self):
    global gpsd
    while gpsp.running:
      gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer

def setCorrectTime(correctTime):
  date_obj = datetime.datetime.strptime(str(correctTime), '%Y-%m-%dT%H:%M:%S.%fZ')
  command = 'date -u -s "'+date_obj.strftime('%Y-%m-%d %H:%M:%S')+'"'
  os.system(command)

def generateDBName():
  global dbName
  dbName = gpsdata + r'/' + datetime.datetime.now().strftime("%Y%m%d%H%M%S") + r'.db'

def createDB():
  conn = sqlite3.connect(dbName)
  cur = conn.cursor()
  cur.execute("""CREATE TABLE IF NOT EXISTS """ + tableName + """ (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    longitude TEXT NOT NULL,
    latitude TEXT NOT NULL,
    altitude REAL NOT NULL,
    speed REAL NOT NULL,
    epv TEXT NOT NULL,
    eps TEXT NOT NULL,
    upload INT DEFAULT 0,
    data TEXT DEFAULT (DATE('now','localtime')),
    vremya TEXT DEFAULT (TIME('now','localtime')));
  """)
  conn.commit()
  cur = ""
  conn.close()

def writeGPSPos(curAlt, curLat, curLon, curSpeed, curEpv, curEps):
  conn = sqlite3.connect(dbName)
  cur = conn.cursor()

  query = "INSERT INTO "+tableName+" (longitude, latitude, altitude, speed, epv, eps) VALUES('"+curLon+"','"+curLat+"',"+curAlt+","+curSpeed+",'" + curEpv + "','" + curEps + "');"
  cur.execute(query)
  conn.commit()
  cur = ""
  conn.close()

def getGPSData():
  global fixTime
  global gpsp
  gpsp = GpsPoller()
  gpsp.start()
  while gpsd.fix.mode < 2:
    time.sleep(2)
  data = gpsd.fix.time
  alt = gpsd.fix.altitude
  lat = gpsd.fix.latitude
  lon = gpsd.fix.longitude
  speed = gpsd.fix.speed
  epv = gpsd.fix.epv
  eps = gpsd.fix.eps
  if not fixTime:
    setCorrectTime(data) 
    generateDBName()
    createDB()
    fixTime = True
  writeGPSPos(str(alt), str(lat), str(lon), str(speed), str(epv), str(eps))
  gpsp.running = False
  gpsp.join()
  gpsp = None

### MAIN PROGRAM
if __name__ == '__main__':
  try:
    while True:
      getGPSData() 
      gpsd.close()
      time.sleep(2) #set to whatever
  except (KeyboardInterrupt, SystemExit): #when you press ctrl+c
    print("\nKilling Thread...")
    print("Done.\nExiting.")

Скрипт получения данных с GPSD был найден на просторах интернета. Я использовал его почти без изменений. По сути лишь добавил сохранение данных в базу SQLite3.

Директорию /var/gpsdata , куда будут сохраняться файлы базы данных SQLite3, нужно создать вручную.

Для автозапуска скрипта создаём сервис /etc/systemd/system/gpslog.service:

[Unit]
Description=GPS Log
After=multi-user.target
[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/python3 /root/gpsLog.py
[Install]
WantedBy=multi-user.target

Регистрируем сервис в системе:

systemctl daemon-reload
systemctl enable gpslog.service

Запуск сервиса:

systemctl start gpslog.service

Остановка сервиса:

systemctl stop gpslog.service

Сервис написан, запущен. Если всё нормально, то в директории /var/gpsdata должны появиться файлы с координатами.

Запись опубликована в рубрике gps, linux. Добавьте в закладки постоянную ссылку.

Добавить комментарий