def testTextData(self): # These lines should all pass straight through. src_lines = ( '', 'a', '123', # Not quite NMEA strings. '$GPZDA', '!AIVDM', '*FF', ) queue = nmea_queue.NmeaQueue() for line in src_lines: queue.put(line) self.assertEqual(queue.qsize(), len(src_lines)) for i in range(1, queue.qsize() + 1): msg = queue.get() self.assertEqual(msg['line_nums'], [i]) self.assertEqual(msg['line_type'], nmea.TEXT) self.assertEqual(msg['lines'], list(src_lines[i - 1:i])) self.assertEqual(msg, { 'line_nums': [6], 'line_type': 'TEXT', 'lines': ['*FF'] })
def testTagBlockLines(self): queue = nmea_queue.NmeaQueue() lines = [line for line in TAG_BLOCK.split('\n') if ',' in line] for line in lines: queue.put(line) self.assertEqual(queue.qsize(), 6) msgs = [] while not queue.empty(): msgs.append(queue.get()) # self.assertNotIn('decoded', msgs[0]) # TODO(schwehr): Check the ZDA message decoding. for msg_num in range(1, 5): self.assertIn('decoded', msgs[msg_num]) ids = [msg['decoded']['id'] for msg in msgs[1:] if 'decoded' in msg] self.assertEqual(ids, [11, 5, 5, 3, 27]) self.assertEqual( msgs[-1], { 'decoded': { 'cog': 131, 'gnss': True, 'id': 27, 'md5': '50898a3435865cf76f1b502b2821672b', 'mmsi': 577305000, 'nav_status': 5, 'position_accuracy': 1, 'raim': False, 'repeat_indicator': 0, 'sog': 0, 'spare': 0, 'x': -90.20666666666666, 'y': 29.145 }, 'line_nums': [9], 'line_type': 'TAGB', 'lines': [ '\\n:80677,s:b003669952,c:1428884269*2A' '\\!SAVDM,1,1,,B,K8VSqb9LdU28WP8<,0*17' ], 'matches': [{ 'dest': None, 'group': None, 'group_id': None, 'line_num': 80677, 'metadata': 'n:80677,s:b003669952,c:1428884269*2A', 'payload': '!SAVDM,1,1,,B,K8VSqb9LdU28WP8<,0*17', 'quality': None, 'rcvr': 'b003669952', 'rel_time': None, 'sentence_num': None, 'sentence_tot': None, 'tag_checksum': '2A', 'text': None, 'text_date': None, 'time': 1428884269 }], 'times': [1428884269] })
def testBareSingleLineData(self): queue = nmea_queue.NmeaQueue() lines = [line for line in BARE_NMEA.split('\n') if ',' in line] for line in lines: queue.put(line) self.assertEqual(queue.qsize(), 7) msgs = [] while not queue.empty(): msgs.append(queue.get()) self.assertEqual( msgs[0], { 'line_nums': [1], 'line_type': 'BARE', 'lines': ['$GPZDA,203003.00,12,07,2009,00,00,*47'] }) self.assertEqual( msgs[1], { 'decoded': { 'cog': 52.099998474121094, 'id': 2, 'md5': '99c8c2804fde0481e6143051930b66c4', 'mmsi': 218069000, 'nav_status': 0, 'position_accuracy': 0, 'raim': False, 'repeat_indicator': 0, 'rot': 0.0, 'rot_over_range': False, 'slot_number': 683, 'slot_timeout': 2, 'sog': 11.100000381469727, 'spare': 0, 'special_manoeuvre': 0, 'sync_state': 0, 'timestamp': 16, 'true_heading': 48, 'x': -118.227775, 'y': 31.24317 }, 'line_nums': [2], 'line_type': 'BARE', 'lines': ['!AIVDM,1,1,,B,23?up2001gGRju>Ap:;R2APP08:c,0*0E'], 'matches': [{ 'body': '23?up2001gGRju>Ap:;R2APP08:c', 'chan': 'B', 'checksum': '0E', 'fill_bits': 0, 'sen_num': 1, 'sen_tot': 1, 'seq_id': None, 'talker': 'AI', 'vdm_type': 'VDM', 'vdm': '!AIVDM,1,1,,B,23?up2001gGRju>Ap:;R2APP08:c,0*0E' }] })
def test_NmeaFile_against_queue(nmea): queue = nmea_queue.NmeaQueue() for line in nmea.splitlines(): queue.put(line) expected = [] msg = queue.GetOrNone() while msg: expected.append(msg) msg = queue.GetOrNone() with contextlib.closing(StringIO(nmea)) as f, ais.open(f) as src: actual = list(src) for e, a in zip(expected, actual): assert e == a
async def get_ais_data(sock, ais_data): stream = tornado.iostream.IOStream(sock) stream.connect() msg_queue = nmea_queue.NmeaQueue() while True: msg_bytes = await stream.read_until(b"\n") msg = msg_bytes.decode() if msg: msg_queue.put(msg) result = msg_queue.GetOrNone() if result and "decoded" in result: decoded = result["decoded"] mmsi = str(decoded["mmsi"]) if mmsi not in ais_data: ais_data[mmsi] = {} for key, value in decoded.items(): ais_data[mmsi][key] = value ais_data[mmsi]["last_seen"] = int(time.time())
def testMixedLines(self): queue = nmea_queue.NmeaQueue() lines = [line for line in MIXED.split('\n') if line.strip()] for line in lines: queue.put(line) self.assertEqual(queue.qsize(), 4) msgs = [] while not queue.empty(): msgs.append(queue.get()) for msg in msgs[:-1]: self.assertIn('decoded', msg) ids = [msg['decoded']['id'] for msg in msgs[:-1]] self.assertEqual(ids, [1, 4, 27]) line_types = [msg['line_type'] for msg in msgs] self.assertEqual(line_types, [nmea.USCG, nmea.BARE, nmea.TAGB, nmea.TEXT])
def __init__(self): self.counts = collections.Counter() self.queue = nmea_queue.NmeaQueue() self.time_range = TrackRange() self.time_delta_range = TrackRange()
def testUscgLines(self): queue = nmea_queue.NmeaQueue() lines = [line for line in USCG.split('\n') if ',' in line] for line in lines: queue.put(line) self.assertEqual(queue.qsize(), 4) msgs = [] while not queue.empty(): msgs.append(queue.get()) for msg in msgs: self.assertIn('decoded', msg) ids = [msg['decoded']['id'] for msg in msgs] self.assertEqual(ids, [1, 5, 3, 27]) self.assertEqual( msgs[3], { 'decoded': { 'cog': 131, 'gnss': True, 'id': 27, 'md5': '50898a3435865cf76f1b502b2821672b', 'mmsi': 577305000, 'nav_status': 5, 'position_accuracy': 1, 'raim': False, 'repeat_indicator': 0, 'sog': 0, 'spare': 0, 'x': -90.2066650390625, 'y': 29.145000457763672}, 'line_nums': [5], 'line_type': 'USCG', 'lines': ['!SAVDM,1,1,,B,K8VSqb9LdU28WP8<,0*17,rMySat,1429287258'], 'matches': [{ 'body': 'K8VSqb9LdU28WP8<', 'chan': 'B', 'checksum': '17', 'counter': None, 'fill_bits': 0, 'hour': None, 'minute': None, 'payload': '!SAVDM,1,1,,B,K8VSqb9LdU28WP8<,0*17', 'receiver_time': None, 'rssi': None, 'second': None, 'sen_num': 1, 'sen_tot': 1, 'seq_id': None, 'signal_strength': None, 'slot': None, 'station': 'rMySat', 'station_type': 'r', 'talker': 'SA', 'time': 1429287258, 'time_of_arrival': None, 'uscg_metadata': ',rMySat,1429287258', 'vdm': '!SAVDM,1,1,,B,K8VSqb9LdU28WP8<,0*17', 'vdm_type': 'VDM'}]})