邮件格式为
!AIVDM,2,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0*5C
第二个字段(在本例中为2
)指定AIS消息中的部分数量,第三个字段(在本例中为1
)表示部分或片段序列。
如果消息没有按顺序到达,是否有一种连接消息片段的故障安全方法? [我知道有几个片段可以按随机顺序到达。]
答案 0 :(得分:1)
消息部分必须遵循订单。如果它们不是连续的,则不应考虑该消息。IEC 61162
文档是标准,定义NMEA
句子的结构,包括AIS
消息,表示多部分消息必须按顺序排列。如果您以随机顺序面对消息,则硬件故障,因为制造商必须遵守IEC 61162
标准中定义的规则。
答案 1 :(得分:1)
AIS有效负载封装在NMEA消息格式中 - NMEA仅将其视为黑盒子 - 因此您不应期望NMEA解析器对编码的AIS内容敏感。
如果您绝望,可以尝试按照每个AIS有效负载消息类型的预期长度匹配多部分消息,但是您会遇到以下问题:
您在实践中可以做的最好的事情是假设如果两个消息具有不同的NMEA消息类型(例如,一个消息是AIVDM
,另一个消息是SAVDM
),则多部分消息可能仅交错到达。这是NMEA parsing library I wrote, under each_complete_message
中采用的方法。
您可以更进一步,使用消息部分的总数作为区分消息的方法,但实际上,3部分消息似乎非常罕见。
不,没有连接片段的失败安全方法。
答案 2 :(得分:0)
也许您可以检查第三个字段为空的原因以及是否可以激活它。
ShineMicro以下列方式使用它: !AIVDM,X1,X2,X3,A,S - S,X4 * CRC 哪里 X1 - 发送1个AIS消息所需的句子(部分)总数 X2 - 句号(1到9) X3 - 顺序消息标识符(0-9),按顺序分配并针对每个新的多句子消息递增
答案 3 :(得分:0)
如果使用的是Python,则可以使用libais库:https://github.com/schwehr/libais/。 NmeaQueue
使用FIFO队列并为您完成工作。
只需将所有消息(无论顺序如何)放入队列中,如果队列长度为正数,则调用pop
方法。它处理单部分和多部分消息。
import ais
q = ais.nmea_queue.NmeaQueue()
for msg in msg_generator: # can be a list for instance
q.put(msg)
if q.qsize():
d = q.get().get('decoded', None)
print