以下是一条原始AIS数据:
!AIVDM,1,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0*5C
数据由多个字段组成,字段之间用逗号隔开,每个字段的含义如下:
字段1 -- !AIVDM:数据包标志。前两个字母是设备标志,“AI”是船载标志,“BS”是基站标志,后三个字母是信息标志,VDM表示封装的是他船信息,VDO表示封装的是本船信息。所以AIVDM 数据包是来自其他船舶的报告,AIVDO 数据包是来自您自己的船舶的报告。
字段2 -- 1:当前消息中的累计片段数。每条报文的有效载荷大小是受限制的,因此有时需要将消息拆分成多个片段,该字段表示最大片段数。该例中是1。
字段3 -- 1:指本条报文处于哪个片段。该例中是1。
字段4 -- '':是多片段消息的连续ID,ID的值域是[0,9]。该例是空字符串,代表只有一个片段。
字段5 -- B:无线电信道代码。AIS 使用两个 VHF 无线电频道的复式高边:A 为 161.975Mhz (87B):B 频道为 162.025Mhz (88B)。
字段6 -- 177KQJ5000G?tO`K>RA1wUbN0TKH:数据的有效载荷,或者说是数据包,也就是我们最关心的,需要进行解码。
字段7 -- 05C:这个字段分成两个部分,号前面的数字,代表将数据有效载荷填充到 6 位边界所需的填充位数,范围从 0 到 5 不等。*号后面的数字是校验码,是 NMEA 0183 数据完整性检查。
举个例子:下面是一个多片段句子的示例,此例中,一条消息被分成了两条报文。
其中带有一个无提示消息 ID 字段。
!AIVDM,2,1,3,B,55P5TL01VIaAL@7WKO@mBplU@<PDhh000000001S;AJ::4A80?4i@E53,0*3E !AIVDM,2,2,3,B,1@0000000000000,2*55
需要解码的数据在原始AIS数据的字段6中,字段6所含信息就是报文的实质性内容,它一共有27种类型。那么先列出有哪27种类型:
01 位置报告A类
02 位置报告A类(已分配时间表)
03 位置报告A类(对审讯的回应)
04 基站报告
05 静态和航程相关数据
06 二进制地址的消息
07 二进制确认
08 二进制广播消息
09 标准SAR飞机位置报告
10 UTC和日期查询
11 UTC和日期响应
12 已解决的安全相关消息
13 安全相关确认
14 安全相关广播消息
15 审讯
16 分配模式命令
17 DGNSS二进制广播消息
18 标准B级CS位置报告
19 扩展的B类设备位置报告
20 数据链接管理
21 助航报告
22 渠道管理
23 组分配命令
24 静态数据报告
25 单插槽二进制消息
26 具有通信状态的多插槽二进制消息
27 远程应用的位置报告
每一条报文解码后因为类型的不同,所以解码出的格式或者说内容也会不同。对每种类型的数据解码后会有哪些内容,现在开始讲解。解码后的数据都是英文的,为了在使用中方便对照,不译成中文。
每种类型的数据含有不同的字段,以下面表格呈现,表头的含义如下:
Field:该字段在编码中所在位置;
Len:该字段在编码中所占长度;
Description:对于该字段的描述;
Member:解码后该字段的名称
注:A类设备能够接收和发送简短的安全相关信息,包括重要的航海和气象警报;B类设备只能接收简短的安全相关消息。
在部分字段中,比如MMSI、Rate of Turn、Position Accuracy、Longitude等,如果给出取值便可以知道其含义。但是如Message Type、Navigation Status等枚举型数据,则需要进一步对取值做说明。Message Type在前文中已经展示,取值是0~27。
Navigation Status 取值:
python解码后的数据是一个字典形式,1、2、3类型后的数据样例:
注:
1、数据已脱敏;
2、样本集中无类型2的数据,未展示;
3、Member栏是空值的,比如Spare,解码后则不会有这个字段;
4、后面各个类型的数据不一一展示,每个类型字典的key不一样,和表格中的字段是保持一致的。
{'type': 1, 'repeat': 0, 'mmsi': '000000001', 'status': <NavigationStatus.UnderWayUsingEngine: 0>, 'turn': 0, 'speed': 9.0, 'accuracy': 1, 'lon': 109.78566833333333, 'lat': 32.51417166666667, 'course': 318.40000000000003, 'heading': 312, 'second': 44, 'maneuver': <ManeuverIndicator.NotAvailable: 0>, 'raim': 0, 'radio': 2260}
{'type': 3, 'repeat': 0, 'mmsi': '000000002', 'status': <NavigationStatus.Undefined: 15>, 'turn': -128, 'speed': 2.3, 'accuracy': 0, 'lon': 110.837715, 'lat': 30.110753333333335, 'course': 63.6, 'heading': 511, 'second': 43, 'maneuver': <ManeuverIndicator.NotAvailable: 0>, 'raim': 1, 'radio': 0}
Maneuver Indicator 取值:
固定位置基站将使用此消息来定期报告位置和时间。
Type of EPFD 取值:
Ship Type 取值:
带有未指定二进制有效载荷的寻址的点对点消息。
类型7消息是发给先前类型6消息的发件人的回执。
类型8消息是具有未指定二进制有效负载的广播消息。
搜救飞机的跟踪信息。
向AIS基站请求UTC /日期信息。
与类型4相同,对查询返回响应。
消息类型13是发给先前类型12消息的发件人的回执。结构与类型7二进制确认相同。
基站使用消息类型15来向一个或两个其他AIS收发器查询指定类型的状态消息。
消息类型16由具有控制权限的基站用来配置来自下级站的AIS信息消息的调度,以每10分钟间隔的频率或通过指定应在其上发送这些消息的TDMA时隙偏移来配置。
消息类型17用于广播GPS的差分校正。
对于使用B类发射机的船只,其报告要比1-3类型的报告少。省略导航状态和转弯速率。字段的编码方式与通用导航块相同。
对于使用B类变送器的船只,其报告要比18类型稍微详细一些。省略导航状态和转弯速率。字段的编码方式与通用导航块和5类型消息中的相同。
该消息用于在AIS基站网络内预分配TDMA时隙。它不包含导航信息,除非您正在实施或研究AIS基站网络,否则不太可能有用。
辅助工具(如浮标和灯塔)发出的标识和位置信息。
Aid Type 取值:
主管部门(AIS网络控制基站)广播此消息,以设置AIS覆盖区域的VHF参数。
该消息旨在由主管机构(AIS网络控制基站)广播,以设置AIS覆盖区域中所有移动台的操作参数。
Tx/Rx Mode 取值:
Station Type 取值:
Report Interval 取值:
对于使用B类设备的船舶而言,相当于5类型消息。也用于将MMSI与A类或B类设备上的名称相关联。
类型24消息可以是A或B部分格式;根据该标准,A部分和B部分预计将以相邻对的方式进行广播。在现实中,它们可能由于各种聚合方法中的怪异现象被其他句子分隔开,甚至与不同的Type 24对交错排列;解码器必须对此进行处理。 B型格式的某些字段的解释会根据B型MMSI字段的范围而变化。
该消息主要用于对配备AIS A类的船只进行远程检测(通常是通过卫星)。