【问题标题】:How do you link multipart AIS messages?如何链接多部分 AIS 消息?
【发布时间】:2015-11-27 07:28:15
【问题描述】:

消息格式是

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

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

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

【问题讨论】:

    标签: ais


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      如果您不顾一切,您可以尝试通过每个 AIS 有效负载消息类型的预期长度来匹配多部分消息,但您会遇到以下问题:

      1. 某些消息类型(例如类型 8:二进制广播消息)具有可变长度
      2. 在字节边界上对齐消息的约定并不总是遵循,因此即使是固定长度的消息也可以接收不同长度的消息(例如类型 15)。

      您在实践中可以做的最好的事情是假设多部分消息只有在两条消息具有不同的 NMEA 消息类型时才能交错到达(例如,一条消息是 AIVDM,另一条是 SAVDM)。这是NMEA parsing library I wrote, under each_complete_message 中采用的方法。

      您可以更进一步,使用消息部分的总数来区分消息,但在实践中,由 3 部分组成的消息似乎极为罕见。

      TL;DR

      不,没有链接片段的故障安全方法。

      【讨论】:

        【解决方案3】:

        也许你可以检查一下为什么第三个字段是空的,是否可以激活。

        ShineMicro 通过以下方式使用它: !AIVDM,X1,X2,X3,A,S--S,X4*CRC 在哪里 X1 - 传输 1 条 AIS 消息所需的句子(部分)总数 X2 - 句号(1 到 9) X3 - 顺序消息标识符 (0-9),按顺序分配并为每个新的多句消息递增

        【讨论】:

          【解决方案4】:

          如果您使用 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-02-19
            • 2019-10-13
            • 2012-02-04
            • 1970-01-01
            • 1970-01-01
            • 2017-12-22
            • 2013-05-20
            相关资源
            最近更新 更多