gpt4 book ai didi

python - 构建 AIS 消息解码器

转载 作者:太空狗 更新时间:2023-10-30 01:21:58 24 4
gpt4 key购买 nike

我曾经使用 theis 包 (Python) 解码 AIS 消息 https://github.com/schwehr/noaadata/tree/master/ais直到我开始获得一种新的消息格式。您可能知道,AIS 消息主要有两种类型。一部分(一条消息)或两部分(多条消息)。 Message#5 总是分为两部分。示例:

!AIVDM,2,1,1,A,55?MbV02;H;s<HtKR20EHE:address@hidden@Dn2222222216L961O5Gf0NSQEp6ClRp8,0*1C
!AIVDM,2,2,1,A,88888888880,2*25

我曾经使用以下代码段很好地对此进行解码:

   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])

--

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

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

!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

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

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

   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 应该包含两个字符串而不是一个。我得到的错误是在这些行中:

if nmeastring.count('!SAVDM')==2 and len(nmeamsg)==13: 
aismsg = nmeamsg[5]+nmeamsg[11]

len(nmeamsg) 始终为 8(第二行),nmeastring.count('!SAVDM') 始终为 1

我希望我解释清楚了,这样有人可以让我知道我在这里遗漏了什么。

更新

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

for line in file:
i=i+1

try:
doais(line)

message#5 应该作为两行传递。关于如何实现它的任何想法?

更新

我是通过稍微修改代码做到的:

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)

最佳答案

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

我通常将解码分为两次通过。首先加入多线消息。我将此称为规范化 (ais_normalize.py)。您在此步骤中遇到了几个问题。首先,两个组件行在第二个字符串的右侧具有不同的时间戳。根据 USCG 旧元数据标准,最后一个很重要。所以我的代码将假定这两行不相关。其次,您没有所需的站点 ID 字段。

在 SAVDM 中,您从哪里获取 SA?什么设备(NMEA 词汇中的“说话者”)正在接收这些消息?

关于python - 构建 AIS 消息解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27579708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com