На мини-ПК 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 должны появиться файлы с координатами.