def test_multiline_message(self): # these messages caused issue #3 msg_1_part_0 = b'!AIVDM,2,1,1,A,538CQ>02A;h?D9QC800pu8@T>0P4l9E8L0000017Ah:;;5r50Ahm5;C0,0*07' msg_1_part_1 = b'!AIVDM,2,2,1,A,F@V@00000000000,2*35' assert NMEAMessage.assemble_from_iterable( messages=[NMEAMessage(msg_1_part_0), NMEAMessage(msg_1_part_1)]).decode().to_json() msg_2_part_0 = b'!AIVDM,2,1,9,A,538CQ>02A;h?D9QC800pu8@T>0P4l9E8L0000017Ah:;;5r50Ahm5;C0,0*0F' msg_2_part_1 = b'!AIVDM,2,2,9,A,F@V@00000000000,2*3D' assert NMEAMessage.assemble_from_iterable( messages=[NMEAMessage(msg_2_part_0), NMEAMessage(msg_2_part_1)]).decode().to_json()
def test_msg_type_21(self): msg = NMEAMessage.assemble_from_iterable(messages=[ NMEAMessage( b"!AIVDM,2,1,7,B,E4eHJhPR37q0000000000000000KUOSc=rq4h00000a,0*4A" ), NMEAMessage(b"!AIVDM,2,2,7,B,@20,4*54") ]).decode() assert msg['type'] == 21 assert msg['mmsi'] == "316021442" assert msg['aid_type'] == NavAid.REFERENCE_POINT assert msg['name'] == "DFO2" assert msg['accuracy'] == 1 assert round(msg['lat'], 2) == 48.65 assert round(msg['lon'], 2) == -123.43 assert not msg['to_bow'] assert not msg['to_stern'] assert not msg['to_port'] assert not msg['to_starboard'] assert msg['off_position'] assert msg['regional'] == 0 assert msg['raim'] assert msg['virtual_aid'] == 0 assert msg['assigned'] == 0 assert msg['name_extension'] == ""
def test_msg_type_17(self): msg = NMEAMessage.assemble_from_iterable(messages=[ NMEAMessage( b"!AIVDM,2,1,5,A,A02VqLPA4I6C07h5Ed1h<OrsuBTTwS?r:C?w`?la<gno1RTRwSP9:BcurA8a,0*3A" ), NMEAMessage(b"!AIVDM,2,2,5,A,:Oko02TSwu8<:Jbb,0*11") ]).decode() n = 0x7c0556c07031febbf52924fe33fa2933ffa0fd2932fdb7062922fe3809292afde9122929fcf7002923ffd20c29aaaa assert msg['type'] == 17 assert msg['repeat'] == 0 assert msg['mmsi'] == "002734450" assert msg['lon'] == 17478 assert msg['lat'] == 35992 assert msg['data'] == n msg = NMEAMessage( b"!AIVDM,1,1,,A,A0476BQ>J8`<h2JpH:4P0?j@2mTEw8`=DP1DEnqvj0,0*79" ).decode() assert msg['type'] == 17 assert msg['repeat'] == 0 assert msg['mmsi'] == "004310602" assert msg['lat'] == 20582 assert msg['lon'] == 80290 assert msg[ 'data'] == 14486955885545814640451754168044205828166539334830080
def _assemble_messages(self): queue = [] for line in self._iter_messages(): # Try to parse the message try: msg = NMEAMessage(line) except Exception as e: raise ValueError(f'Failed to parse line "{line}"') from e # Be gentle and just skip invalid messages if not msg.is_valid: continue if msg.is_single: yield msg # Assemble multiline messages elif msg.is_multi: queue.append(msg) if msg.index == msg.count: yield msg.assemble_from_iterable(queue) queue.clear() else: raise ValueError("Messages are out of order!")
def test_message_assembling(self): multi = NMEAMessage.assemble_from_iterable(messages=[ NMEAMessage(b"!AIVDM,2,1,4,A,55O0W7`00001L@gCWGA2uItLth@DqtL5@F22220j1h742t0Ht0000000,0*08"), NMEAMessage(b"!AIVDM,2,2,4,A,000000000000000,2*20") ]) assert not multi.is_single assert multi.is_multi assert multi.is_valid
def test_msg_type_5(self): msg = NMEAMessage.assemble_from_iterable(messages=[ NMEAMessage(b"!AIVDM,2,1,1,A,55?MbV02;H;s<HtKR20EHE:0@T4@Dn2222222216L961O5Gf0NSQEp6ClRp8,0*1C"), NMEAMessage(b"!AIVDM,2,2,1,A,88888888880,2*25") ]).decode() assert msg['callsign'] == "3FOF8" assert msg['shipname'] == "EVER DIADEM" assert msg['shiptype'] == ShipType.Cargo assert msg['to_bow'] == 225 assert msg['to_stern'] == 70 assert msg['to_port'] == 1 assert msg['to_starboard'] == 31 assert msg['draught'] == 12.2 assert msg['destination'] == "NEW YORK"
def test_msg_type(self): """ Test if msg type is correct """ nmea = NMEAMessage(b"!AIVDM,1,1,,B,15M67FC000G?ufbE`FepT@3n00Sa,0*5C") assert nmea.decode().msg_type == AISType.POS_CLASS_A1 nmea = NMEAMessage(b"!AIVDM,1,1,,B,15NG6V0P01G?cFhE`R2IU?wn28R>,0*05") assert nmea.decode().msg_type == AISType.POS_CLASS_A1 nmea = NMEAMessage.assemble_from_iterable(messages=[ NMEAMessage(b"!AIVDM,2,1,4,A,55O0W7`00001L@gCWGA2uItLth@DqtL5@F22220j1h742t0Ht0000000,0*08"), NMEAMessage(b"!AIVDM,2,2,4,A,000000000000000,2*20") ]) assert nmea.decode().msg_type == AISType.STATIC_AND_VOYAGE