首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建AIS消息解码器

构建AIS消息解码器
EN

Stack Overflow用户
提问于 2014-12-20 11:23:42
回答 2查看 6.9K关注 0票数 5

我过去常常用https://github.com/schwehr/noaadata/tree/master/ais来解码AIS消息,直到我开始获得新的消息格式。您可能知道,AIS消息主要有两种类型。一个部分(一个消息)或两个部分(多个消息)。Message#5总是由两部分组成。示例:

代码语言:javascript
复制
!AIVDM,2,1,1,A,55?MbV02;H;s<HtKR20EHE:address@hidden@Dn2222222216L961O5Gf0NSQEp6ClRp8,0*1C
!AIVDM,2,2,1,A,88888888880,2*25

我曾经用下面的代码来很好地解码这个代码:

代码语言:javascript
复制
   nmeamsg = fields.split(',')
   if nmeamsg[0] != '!AIVDM': 
    return
   total = eval(nmeamsg[1])
   part = eval(nmeamsg[2])
   aismsg = nmeamsg[5]
   nmeastring = string.join(nmeamsg[0:-1],',')


   bv = binary.ais6tobitvec(aismsg)
   msgnum = int(bv[0:6])

--

代码语言:javascript
复制
elif (total>1):
     # Multi Slot Messages: 5,6,8,12,14,17,19,20?,21,24,26
     global multimsg
     if total==2:
       if msgnum==5:
         if nmeastring.count('!AIVDM')==2 and len(nmeamsg)==13: # make sure there are two parts concatenated together
           aismsg = nmeamsg[5]+nmeamsg[11]
           bv = binary.ais6tobitvec(aismsg)    

           msg5 = ais_msg_5.decode(bv)
           print "message5 :",msg5
           return msg5

现在我得到了一种新的信息格式:

代码语言:javascript
复制
!SAVDM,2,1,7,A,55@0hd01sq`pQ3W?O81L5@E:1=0U8U@000000016000006H0004m8523k@Dp,0*2A,1410825672
!SAVDM,2,2,7,A,4hC`2U@C`40,2*76,1410825672,1410825673

请注意。最后一个索引处的数字是时代格式的时间。

我试图调整我的代码来解码这种新格式。我成功地用一个部分解码了消息。我的问题是多消息类型。

代码语言:javascript
复制
   nmeamsg = fields.split(',')
   if nmeamsg[0] != '!AIVDM' and nmeamsg[0] != '!SAVDM': 
    return
   total = eval(nmeamsg[1])
   part = eval(nmeamsg[2])
   aismsg = nmeamsg[5]
   nmeastring = string.join(nmeamsg[0:-1],',')
   dbtimestring = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(nmeamsg[7])))

   bv = binary.ais6tobitvec(aismsg)
   msgnum = int(bv[0:6])

解码器不能把这两条线作为一条线。所以解码失败,因为message#5应该包含两个字符串,而不是一个字符串。我得到的错误出现在以下几行:

代码语言:javascript
复制
if nmeastring.count('!SAVDM')==2 and len(nmeamsg)==13: 
aismsg = nmeamsg[5]+nmeamsg[11]

其中len(nmeamsg)总是8(第二行),nmeastring.count('!SAVDM')总是1

我希望我能解释清楚,这样就能让我知道我在这里错过了什么。

更新

好吧我想我找到了原因。我将消息逐行地从文件传递到脚本:

代码语言:javascript
复制
for line in file:
    i=i+1

    try:
        doais(line)

其中message#5应该作为两行传递。你知道我该怎么做吗?

更新

我对代码做了一些修改:

代码语言:javascript
复制
for line in file:
    i=i+1

try:
        nmeamsg = line.split(',')
        aismsg = nmeamsg[5]
        bv = binary.ais6tobitvec(aismsg)
        msgnum = int(bv[0:6])
        print msgnum
        if nmeamsg[0] != '!AIVDM' and nmeamsg[0] != '!SAVDM': 
         print "wrong format"
        total = eval(nmeamsg[1])
        if total == 1:
         dbtimestring = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(nmeamsg[8])))
         doais(line,msgnum,dbtimestring,aismsg)
        if total == 2: #Multi-line messages
         lines= line+file.next()
         nmeamsg = lines.split(',')
         dbtimestring = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(float(nmeamsg[15])))
         aismsg = nmeamsg[5]+nmeamsg[12]
         doais(lines,msgnum,dbtimestring,aismsg)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-20 18:38:50

请注意,noaadata是我以前的研究代码。libais是我的生产库,它用于NOAA的ERMA和WhaleAlert。

我通常把解码变成一个两次通过的过程。首先连接多行消息.我将其称为规范化(ais_normalize.py)。您在这一步中有几个问题。首先,两个组件行在第二个字符串的右边有不同的时间戳。按照USCG的旧元数据标准,最后一个很重要。因此,我的代码将假设这两行不相关。第二,您没有所需的站点id字段。

你从哪里得到的SA在SAVDM?什么设备( NMEA语音中的“交谈者”)正在接收这些信息?

票数 3
EN

Stack Overflow用户

发布于 2015-12-02 17:26:22

如果您使用Ruby,我可以推荐我编写的NMEA和AIS译码器红宝石可在github上查阅。这是基于catb.org的非官方AIS规范,这是由库尔特的一个同事维护。

它处理多部分消息的组合,从流中读取,并支持大量的NMEA和AIS消息。目前正在对AIS消息6和8的50个二进制子类型进行解码。

要处理您发布的非标准行:

代码语言:javascript
复制
!SAVDM,2,1,7,A,55@0hd01sq`pQ3W?O81L5@E:1=0U8U@000000016000006H0004m8523k@Dp,0*2A,1410825672
!SAVDM,2,2,7,A,4hC`2U@C`40,2*76,1410825672,1410825673

有必要添加一个新的解析规则,在校验和之后接受字段,但除此之外,它应该顺利进行。换句话说,您将复制这里的解析器行

代码语言:javascript
复制
    | BANG DATA CSUM  { result = NMEAPlus::AISMessageFactory.create(val[0], val[1], val[2]) }

并且有这样的东西

代码语言:javascript
复制
    | BANG DATA CSUM COMMA DATA { result = NMEAPlus::AISMessageFactory.create(val[0], val[1], val[2], val[4]) }

你怎么处理那些额外的时间戳?看起来它们几乎是被任何软件添加到日志记录中,而不是作为实际消息的一部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27579708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档