This commit is contained in:
commit 844652c756
5 changed files with 145 additions and 0 deletions

3
config.py Normal file
View file

@ -0,0 +1,3 @@
GNSS_PORT = '/dev/ttyAMA0' # UART порт GNSS модуля
GNSS_BAUD = 9600
GNSS_TIMEOUT = 1

58
gnss_core.py Normal file
View file

@ -0,0 +1,58 @@
import serial
import pynmea2
import time
from .gnss_utils import current_utc_time
class GNSSModule:
"""
Основной класс для работы с GNSS на Raspberry Pi.
Поддерживает GPS, GLONASS, BeiDou через NMEA-формат.
"""
def __init__(self, port='/dev/ttyAMA0', baudrate=9600, timeout=1):
self.port = port
self.baudrate = baudrate
self.timeout = timeout
self.serial_conn = None
self.last_position = None
def connect(self):
"""Подключение к GNSS модулю"""
try:
self.serial_conn = serial.Serial(
port=self.port,
baudrate=self.baudrate,
timeout=self.timeout
)
print(f"GNSS подключен на {self.port} @ {self.baudrate} бод")
except Exception as e:
print(f"Ошибка подключения GNSS: {e}")
raise e
def read_position(self):
"""
Считывает NMEA строку, парсит координаты.
Возвращает словарь с lat, lon, alt, timestamp
"""
if self.serial_conn is None or not self.serial_conn.is_open:
raise ConnectionError("GNSS модуль не подключен")
try:
line = self.serial_conn.readline().decode('ascii', errors='replace')
if line.startswith('$G'):
msg = pynmea2.parse(line)
if isinstance(msg, pynmea2.GGA):
self.last_position = {
'lat': msg.latitude,
'lon': msg.longitude,
'alt': msg.altitude,
'timestamp': current_utc_time()
}
return self.last_position
except pynmea2.ParseError:
pass
return None
def close(self):
if self.serial_conn and self.serial_conn.is_open:
self.serial_conn.close()
print("GNSS соединение закрыто")

5
gnss_utils.py Normal file
View file

@ -0,0 +1,5 @@
from datetime import datetime, timezone
def current_utc_time():
"""Возвращает текущее UTC-время, для синхронизации с RTC"""
return datetime.now(timezone.utc).isoformat()

60
poetry.lock generated Normal file
View file

@ -0,0 +1,60 @@
# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand.
[[package]]
name = "pynmea2"
version = "1.19.0"
description = "Python library for the NMEA 0183 protcol"
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "pynmea2-1.19.0-py3-none-any.whl", hash = "sha256:5138558b4fb5daa587b2c17de99eb43df0297039de1c98010c996624abfb00eb"},
{file = "pynmea2-1.19.0.tar.gz", hash = "sha256:1daa79b93279f887d1c235e5cc5c79e32644564138ce46989ab0f4a2fc970d7c"},
]
[[package]]
name = "pyserial"
version = "3.5"
description = "Python Serial Port Extension"
optional = false
python-versions = "*"
groups = ["main"]
files = [
{file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"},
{file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"},
]
[package.extras]
cp2110 = ["hidapi"]
[[package]]
name = "python-dateutil"
version = "2.9.0.post0"
description = "Extensions to the standard Python datetime module"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
groups = ["main"]
files = [
{file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
{file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
]
[package.dependencies]
six = ">=1.5"
[[package]]
name = "six"
version = "1.17.0"
description = "Python 2 and 3 compatibility utilities"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
groups = ["main"]
files = [
{file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
{file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
]
[metadata]
lock-version = "2.1"
python-versions = ">=3.13"
content-hash = "17f37c7813d145c3fdc878cf826ad205336172cfa15e2f59a0b82a304374da2a"

19
pyproject.toml Normal file
View file

@ -0,0 +1,19 @@
[project]
name = "gnss"
version = "0.0.1"
description = ""
authors = [
{name = "s.galanskiy",email = "s.galanskiy@gossys.dev"}
]
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"pyserial (>=3.5,<4.0)",
"pynmea2 (>=1.19.0,<2.0.0)",
"python-dateutil (>=2.9.0.post0,<3.0.0)"
]
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"