1

消息格式为

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

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

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

4

4 回答 4

1

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

于 2016-02-10T11:17:34.097 回答
1

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

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

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

您在实践中可以做的最好的事情是假设多部分消息可能仅在两条消息具有不同的 NMEA 消息类型时才交错到达(例如,一条消息是AIVDM,而另一条消息是SAVDM)。这是我在 NMEA 解析库中采用的方法,位于each_complete_message.

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

TL;博士

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

于 2016-02-22T23:03:39.183 回答
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
于 2018-08-01T16:01:58.813 回答
0

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

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

于 2016-07-18T09:45:41.093 回答