如何链接多部分AIS消息?

时间:2015-11-27 07:28:16

标签: ais

邮件格式为

!AIVDM,2,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0*5C

第二个字段(在本例中为2)指定AIS消息中的部分数量,第三个字段(在本例中为1)表示部分或片段序列。

如果消息没有按顺序到达,是否有一种连接消息片段的故障安全方法? [我知道有几个片段可以按随机顺序到达。]

4 个答案:

答案 0 :(得分:1)

消息部分必须遵循订单。如果它们不是连续的,则不应考虑该消息。IEC 61162文档是标准,定义NMEA句子的结构,包括AIS消息,表示多部分消息必须按顺序排列。如果您以随机顺序面对消息,则硬件故障,因为制造商必须遵守IEC 61162标准中定义的规则。

答案 1 :(得分:1)

AIS有效负载封装在NMEA消息格式中 - NMEA仅将其视为黑盒子 - 因此您不应期望NMEA解析器对编码的AIS内容敏感。

如果您绝望,可以尝试按照每个AIS有效负载消息类型的预期长度匹配多部分消息,但是您会遇到以下问题:

  1. 某些消息类型(例如,类型8:二进制广播消息)具有可变长度
  2. 在字节边界上对齐消息的约定并不总是遵循,因此即使是固定长度的消息也可以以不同的长度接收(例如,类型15)。
  3. 您在实践中可以做的最好的事情是假设如果两个消息具有不同的NMEA消息类型(例如,一个消息是AIVDM,另一个消息是SAVDM),则多部分消息可能仅交错到达。这是NMEA parsing library I wrote, under each_complete_message中采用的方法。

    您可以更进一步,使用消息部分的总数作为区分消息的方法,但实际上,3部分消息似乎非常罕见。

    TL; DR

    不,没有连接片段的失败安全方法。

答案 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