1、SOFTWARE2022软 件第 43 卷 第 12 期2022 年Vol.43,No.12作者简介:董艳荣(1973),女,硕士,高级工程师,从事电子产品设计开发工作。基于 VC+实现 AIS 上位机软件设计董艳荣(天津七一二通信广播股份有限公司,天津 300462)摘要:本文首先介绍了 AIS 上位机软件工作原理,其次对 AIS 报文信息进行介绍模拟,继而对 AIS 主机与显示终端的串口通信实现进行说明,最后给出 AIS 主要报文解析的代码。以为 AIS 系统的设计应用人员和学习 VC+软件的人员提供参考。关键词:VC+;AIS 上位机软件;设计中图分类号:TP311.52文献标识码:AD
2、OI:10.3969/j.issn.1003-6970.2022.12.024本文著录格式:董艳荣.基于VC+实现AIS上位机软件设计J.软件,2022,43(12):095-099Realization of AIS Host Computer Software Design Based on VC+DONG Yanrong(Tianjin 712 Communication and Broadcasting Co.,Ltd.,Tianjin 300462)【Abstract】:ThispaperfirstintroducestheworkingprincipleofAISuppercomp
3、utersoftware,thenintroducesandsimulatestheAISmessageinformation,thenexplainstherealizationofserialcommunicationbetweenAIShostanddisplayterminal,andfinallygivesthecodeofAISmainmessageanalysis.ItprovidesreferenceforthedesignandapplicationpersonnelofAISsystemandthosewhostudyVC+software.【Key words】:VC+;
4、AISuppercomputersoftware;designAIS 系统是指船舶自动识别系统(AutomaticIden-tificationSystem)。语音报警终端是系统的一部分,设备完全按照 AIS 标准1,2设计,发送的报文信息兼容现有 AIS 系统。AIS 基本功能是:将本船和他船的精确船位、航向、航速(矢量线)、转向速度和最近船舶会遇距离等动态信息和船名、呼号、船型、船长与船宽等静态信息通过 VHF 自动、定时播发,在 VHF 覆盖范围内(20海里)装备 AIS 设备的船舶,可自动接收到这些信息。1 工作原理AIS 语音报警终端具有导航、距离报警、紧急报警、出/入港设置、报警音
5、量设置等功能,报警终端与主机连接示意图和上位机测试软件连接示意图如图 1 所示。本文将按照上述功能利用 C+语言3进行上位机软件设计,模拟 AIS 主机与终端进行通信,用以测试报警终端的性能。主机和语音报警终端之间通信协议采用PC机语音报警终端串口语音报警终端AIS主机GPS天线VHF天线串口图 1 报警终端与主机连接示意图和上位机测试软件连接示意图Fig.1 Schematic diagram of connection between alarm terminal and host computer and schematic diagram of connection between t
6、est software of upper computer设计研究与应用96软 件第 43 卷 第 12 期SOFTWARERS422,波特率为 38400bps。2 报文信息这里涉及到的报文信息包括 AIS 广播信息和 GPS信息。AIS 广播信息分类两种,即 VDM 和 VDO。其中,VDM 是本船收到的其他船舶的信息,而 VDO 是船舶自身的广播信息。VDM 消息和 VDO 消息的格式完全相同;GPS 信息。NMEA-0183 协议是 GPS 接收机应当遵守的标准协议,也是目前 GPS 接收机上使用最广泛的协议,大多数常见的 GPS 接收机、GPS 数据处理软件、导航软件都遵守或者至少
7、兼容这个协议。常用的只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL 等。主要报文语句说明:(1)主机与终端接口:所有报文的最后都有标志位作为帧尾(2)终端到主机的数据格式,终端发往主机的报文只有两条:$DUAIQ,010*55查询 MMSI 号码$DUAIQ,SSD*20查询船名(3)主机到终端的数据格式:报文按类型分为 5 类:PSRT(本船的 MMSI)格式:$PSRT,010,NNNNNNNNN*hhN=9 位阿拉伯数字的 MMSI 号码(000000000=未设定)hh=异或校验和AISSD(本船船名)格式:$AISSD,A-A,B-B,C,D,
8、E,F,G,H*hhAA:呼号,7 个字符,=未设定BB:船名,20 个字符,不足用 补齐,(20 个)表示未设定hh:异或校验和GPRMC(本船信息)格 式:$GPRMC,*hh 定位时 UTC 时间 hhmmss格式,我国使用的是东八区的时间,需要将时间加 8 小时;状态 A=定位 V=导航 经度 ddmm.mmm格式 经度方向 N或 S 纬度 dddmm.mmmm 纬度方向 E 或 W 速率 方位角(二维方向指向,相当于二维罗盘)当前 UTC 日期 ddmmyy格式,要注意时间加8 小时后日期的进位问题 太阳方位 太阳方向(4)AIVDM(接收到的他船信息):格式:!AIVDM,a,b,
9、c,d,e-e,f*hhe-e:按照协议 NEMA0183 和协议 ITU-RM.1371压缩的暗码,是一段字符串。e-e 字符串的首字符是消息 ID 号:1,2,3 号消息包含他船(CLASS-A)MMSI 号码和经纬度信息,可判距离报警和是否为紧急报警船只。5 号消息包含他船(CLASS-A)MMSI 号码和船名,当收齐 3 号和 5 号报文的时候,判断完毕,即可进行和保存紧急报警信息。14 号消息是紧急报警信息,同时会收到报警船只的 MMSI 号码。18 号消息包含他船(CLASS-B)MMSI 号码和经纬度信息,可判断是否为紧急报警船只。24 号消息包含他船(CLASS-B)MMSI
10、号码和船名,当收齐 18 号和 24 号报文的时候,判断完毕,即可保存紧急报警信息。(5)AIVDO(本船信息):格式:!AIVDO,a,b,c,d,e-e,f*hhe-e 部分的具体含义与 AIVDM 类型的报文相同。3 串行通信接口设计在使用WINDOWS系统的PC机VC+环境4中,串行通信使用CSerialPortEx类5,它支持多线程处理,功能强大,方便实现。CSerialPortEx类是在RemonSpekreijse设计的 CSerialPort 类基础上设计的,并增加了对二进制数据传输和块读写方式的支持和其他功能函数。if(!m_Port.InitPort(this,1,3840
11、0,N,8,1);MessageBox(COM%d 被占用或没有该 COM 口,请改用其他 COM 口!);m_Port.StartMonitoring();m_Port.WriteToPort(TransSelfMessage(m_mmsi,1);m_Port.WriteToPort(TransSelfMessage(m_name,2);m_Port.WriteToPort(TransSelfMessage(m_time_location,3);4 报文解析实现(1)本船信息解析:97董艳荣:基于 VC+实现 AIS 上位机软件设计/按照协议将信息变化成可以识别的码,m:消息内容;n:消息类
12、别 1:PSRT,2:AISSD./其中 1、2、3、5 是发送的本船的相关信息,只有 4 发送的是从无线接收设备接收来的他船信息/6 是终端发给主机查询本船的 MMSI 号码和船名CStringCSimuAISView:TransSelfMessage(CStringm_Message,UINTn)CStringm_temp=,m_AIVDM_message=,m_nowtime=;CStringm_1,m_date,m_time,verify_result=;CTimenowtime;switch(n)casePSRT:/MMSI,本船用m_temp+=$PSRT,010,;m_temp+
13、=m_Message;verify_result=VerifyResult(m_temp);m_temp+=*;m_temp+=verify_result;break;caseAISSD:/船名?本船用m_temp+=$AISSD,;m_temp+=0703007;/Callsign7bitm_temp+=,;while(m_Message.GetLength()+m_temp;m_temp+=0l5T5V0l5T5V220;m_temp+=,0;verify_result=VerifyResult(m_temp);m_temp+=*;m_temp+=verify_result;break;c
14、aseDUAIQ:/该条不用译码,只是接收报文break;default:break;m_temp+=rn;returnm_temp;98软 件第 43 卷 第 12 期SOFTWARE(2)1-3 号报文解析:voidCSimuAISView:Trans1to3Message(CStringmmsi_str,doubleJD,doubleJF,doubleJM,doubleWD,doubleWF,doubleWM)CStringm_output=;m_output=00000100+m_output;/1 号报文+00m_output+=MMSIMessageToBin(mmsi_str).
15、Mid(2,30);m_output+=1010;/4bit航行状态m_output+=00000000;/8bit转向率m_output+=0000000001;/SOGm_output+=0;/positionaccuracyCStringm_long=LONGMessageToBin(JD,JF,JM);m_output+=m_long;CStringm_lat=latMessageToBin(WD,WF,WM);m_output+=m_lat;m_output+=101000101100;m_output+=010011101110010000000000000010001001110
16、0;CStringm_an=BinaryToAn(m_output);m_an=!AIVDM,1,1,A,+m_an;m_an+=,0;CStringverify_result=VerifyResult(m_an);m_an+=*;m_an+=verify_result;m_an+=rn;m_Port.WriteToPort(m_an);(3)5 号报文解析:voidCSimuAISView:Trans5Message(CStringmmsi_str,CStringm_shipname)CStringm_mmsi=MMSIMessageToBin(mmsi_str).Mid(2,30);CStringm_30=ShipNameMessageToBin(m_shipname);CStringm_output=m_mmsi+00+000000011101110100110010110010+010000110011001010000100110101100000100000+m_30;CStringm_last=010001100011001100001100110101000000100