Я написал скрипт, который получает информацию от модуля GPS и отправляет ее на InfluxDB
. Я использую предложения GPGGA
и GPRMC
NMEA, чтобы получить следующие значения:
- Широта
- Долгота
- Высота
- Скорость над землей
Я использую pynmea2
для разбора предложений NMEA. Поскольку я читаю с последовательного порта, я использую NMEAStreamReader()
код
while True:
if com is None:
try:
# set the serial port
try:
# read the information (NMEA sentence)
except Exception as e:
logger.error(e)
pass
try:
# for sentence obtained from reader
for msg in reader.next(data):
measurements = {} # create a measurement dict
dat = pynmea2.parse(str(msg).strip('\r\n')) # parse the sentence
if not (dat.latitude == 0.0 and dat.longitude == 0.0):
# If Latitude and Longitude are not 0.0
if isinstance(dat, pynmea2.GGA): # if GPGGA
# Store Latitude Longitude Altitude in `measurements`
measurements['lat'] = dat.latitude
# measurements['lat_dir'] = dat.lat_dir
measurements['lon'] = dat.longitude
# measurements['lon_dir'] = dat.lon_dir
measurements['alt'] = dat.altitude
if isinstance(dat, pynmea2.RMC):
# if sentence is RMC store latitude, longitude, speed over ground
measurements['lat'] = dat.latitude
# measurements['lat_dir'] = dat.lat_dir
measurements['lon'] = dat.longitude
# measurements['lon_dir'] = dat.lon_dir
measurements['spd_over_grnd'] = dat.spd_over_grnd
# print(measurements)
client.write_points([{
'measurement': 'gps',
'tags': {
'type': 'gps-adafruit',
},
'time': datetime.datetime.utcnow().isoformat('T') + 'Z',
'fields': measurements
}])
else:
print('Location Values not available yet. Not writing to DB')
except Exception as e:
logger.error(e)
pass
проблема
Если доступно предложение GGA
, запись в БД будет lat, long, alt
. Если предложение RMC
доступно, запись в БД будет lat, long, spd_over_ground
(высота не доступна в этом предложении)
Я хочу, чтобы measurements
диктовал следующее:
{
'lat': 23.034, <- from GGA
'lon': 4.3455, <- from GGA
'alt': '2.45', <- from GGA
'spd_over_grnd': 2.2 <- from RMC
}
Проблема в том, что предложения NMEA прекращаются на \r\n
Мне нужно дождаться следующего анализа, и до этого мой measurements
уже сохранен в БД.
Репозиторий
gpsinflux