ogn-python/ogn/gateway/process.py

67 wiersze
2.1 KiB
Python

import logging
from ogn.commands.dbutils import session
from ogn.model import AircraftBeacon, ReceiverBeacon, Location
from ogn.parser import parse, ParseError
from datetime import datetime, timedelta
logger = logging.getLogger(__name__)
def replace_lonlat_with_wkt(message):
location = Location(message['longitude'], message['latitude'])
message['location_wkt'] = location.to_wkt()
del message['latitude']
del message['longitude']
return message
def message_to_beacon(raw_message, reference_date):
beacon = None
if raw_message[0] != '#':
try:
message = parse(raw_message, reference_date)
if message['aprs_type'] == 'position':
message = replace_lonlat_with_wkt(message)
if message['beacon_type'] == 'aircraft_beacon':
beacon = AircraftBeacon(**message)
elif message['beacon_type'] == 'receiver_beacon':
beacon = ReceiverBeacon(**message)
else:
print("Whoops: what is this: {}".format(message))
except NotImplementedError as e:
logger.error('Received message: {}'.format(raw_message))
logger.error(e)
except ParseError as e:
logger.error('Received message: {}'.format(raw_message))
logger.error('Drop packet, {}'.format(e.message))
except TypeError as e:
logger.error('TypeError: {}'.format(raw_message))
return beacon
beacons = list()
last_commit = datetime.utcnow()
def process_beacon(raw_message, reference_date=None):
global beacons
global last_commit
beacon = message_to_beacon(raw_message, reference_date)
if beacon is not None:
beacons.append(beacon)
logger.debug('Received message: {}'.format(raw_message))
current_time = datetime.utcnow()
elapsed_time = current_time - last_commit
if elapsed_time >= timedelta(seconds=1):
session.bulk_save_objects(beacons)
session.commit()
logger.debug('Commited beacons')
beacons = list()
last_commit = current_time