,湖北武汉(430063)E-mail:imylym@126.com摘要:本文利用VC6.0软件设计工具,远程接收船舶信息,并根据对应接口对其进行解析,然后在电子海图开发平台上模拟船舶并进行模拟。关键词:socket;船舶信息;电子海图1.引言随着航海信息化的进一步发展,为了提高制定航行决策的准确性,把船舶信息存储到数据库并融入到电子海图显示与信息系统((ElectronicChartDisplayandInformationSystem,ECDIS)中,可把船舶信息带到可视化的空间当中,使一堆枯燥的数据变成了直观的图形。计算机极大地加强了对信息处理的能力,必将能够给船舶航行提供更加丰富及科学的航行决策依据。另一方面实现电子海图的网络化,共享重要数据库信息,更能节约资源。在服务器端不仅可以及时显示船舶信息,并通过建立数据库及时存储接收到的船位信息,还可以实时向客户端发送船位信息;而客户端不仅可以实时显示船位信息,而通过远程访问服务器端的数据库实现对船舶过去信息的查询和回放。2.电子海图简介ECDIS作为一个、智能化、矢量海图系统,将来发展还将与未来先进的航海电子系统相结合,提供全自动导航技术的可能性。可以预见,未来电子海图显示与信息系统有潜能成为全自动航行船舶一个核心界面载体。ECDIS可以应用于航海、船舶交通管理(VTS)、港口管理、船舶调度、污染管理、搜救指挥、航标管理、渔业、引水、海洋测绘、海洋工程等方面,对航运具有非常重要的影响。从ECDIS的发展历程不难看到,从综合导航系统的图形显示终端,到具有航路点设计、航迹记录、报警设置等辅助决策功能,并拥有信息咨询模块,电子海图系统的功能不断完善,其信息处理能力不断增强。随着电子海图系统日益广泛的使用,人们已经越来越清醒地认识到ECDIS作为信息系统这一事实及其重要意义[2]。3.通信数据接口和船舶信息的数据结构1)数据接口的数据结构发送端按照接口协议发送数据,数据内容和实际的船只发送的数据相关,如果船只发送的数据内容有误码,那我们接收的数据也是不正确的。数据接口的格式如表1。表1数据接口格式名称包头命令船号有效字节年月日时分秒经度纬度速度方向校验和包尾位置1239101418222630343842465052字节数1161444444444421;如下://通信数据接口协议typedefstruct{charSOI;//数据包头=0x7echarCmdCode;//命令字,0x11:船舶动态数据;0x12:船舶静态数据charShipID[6];//船舶ID号charSize;//有效数据字节数uniontagDATAData;//数据内容WORDCheckSum;//数据校验和(CmdCode+ShipID+Size+Data)charEOI;//数据包尾=0x0d}VHFDATA;2)船舶信息数据结构船舶信息包括动态船舶信息如时间、经纬度、速度、方向和船舶号。而静态船舶信息包括船舶名称,出发港,到达港等。我们不仅定义了船舶动态数据结构DYNCDATA;和船舶静态数据结构STATICDATA,还定义了时间数据结构DateTime。typedefstructDateTime{DWORDdwYear;//年DWORDdwMonth;//月DWORDdwDay;//日DWORDdwHour;//时DWORDdwMinute;//分DWORDdwSecond;//秒}DateTime;//船舶动态数据typedefstruct{DateTimeFTime;//数据接收时间floatFLong;//经度floatFLat;//纬度floatFSpeed;//速度floatFDirect;//方向//intSourceID;}DYNCDATA;//船舶静态数据typedefstruct{charShipName[20];//船只名称charFromPort[6];//出发港[6];//到达港}STATICDATA;4.船舶信息接收4.1设置好连接网络本文接收到的船舶岸站管理中心提供的远程船舶数据具有保密性,不是Internet上共享的,所以在异地时就必须获得船舶信息提供方的许可后,得到其用户名和地址以及船舶数据接口,再使用专线进行连接。如果是在网络上共享的船舶数据信息,其处理方法类似,直接接收。4.2建立套节字SOCKET监听接收信息[1]1)服务方通信模块服务方有两个CSocket的子类:CListenSocket和CClientSocket。前者用于监听网络连接的请求CSocket类,后者是建立对应不同客户的套接字,与客户方进行数据通信的CSocket类。当客户方的连接请求来时,服务方就可以建立对应此客户的CClientSocket类,然后用此类的成员函数Send(Buffer,length)进行数据通信。其中Buffer是指向发送数据缓冲区的指针,length是发送数据的长度,函数返回值是实际发送数据的字节数。2)客户方通信模块客户方包含一个CClientSocket类。这个类和服务方的CClientSocket类是一样的。客户方比服务方缺少了监听的CSocket类。当数据链路建立好时,客户方就可以和服务方进行数据交换,接受数据时可以用此类的成员函数Receive(Buffer,length)来接受。其中Buffer是指向接收数据缓冲区的指针,length是接收数据缓冲区的长度,函数返回值是实际接收数据的字节数。3)服务器端与客户端的通信模式服务器端与客户端的通信模式有面向连接的套接字的系统调用(TCP连接和面向无连接协议的套接字(UDP连接,本文采用的是UDP连接,面向连接的应用程序流程图如图1。,我们是先建立一个soket对象,然后连接到服务器端,接收信息,存储到缓冲中,再一帧帧接收和处理。部分代码如下:charbuff[1024];intbufflen=1024;intnLen=CSocket::Receive(buff,bufflen);m_pParentWnd-PostMessage(WM_UPDATEMSG,(WPARAM)buff,(LPARAM)nLen);4.3接收到的船舶信息的处理根据接收到的数据,分析数据内存,如果数据内存为空就不处理直接返回,如果有信息继续执行,然后再判断数据头是否为通信数据接口规定的信息DATA_SOI,如果不是则说明数据是错误的就不需要处理了,如果是的就开始处理船舶信息,再判断数据是动态信息还是静态信息,如果是动态信息先获得船舶编号,计算船舶的编号,拷贝从第二个字节开始的6个字节,就是船舶编号了,再判断有效字节数是否正确,第8个字节是实际数据长度,比较一下看是否正确,如果正确说明数据是正确的,计算数据的校验码,然后从第一个字节到nLength-1,nLength指动态信息的长度,然后与报文中校验码比较,如果正确说明报文是完整的,最后校验报文结束码是否正确,如果正确说明整个报文是正确的,则可以获得动态报文的实际数据了,动态报文实际数据是从第9个字节开始的,我们就可以依次得到船舶的时间、经纬度、速度和方向。依照同样的方法获得船舶的静态信息船舶名称、出发港和达到港。部分代码如下:if(pszSentence==NULL)return-1;if(pszSentence[0]!=DATA_SOI)//判断数据头return-1;//首先判断数据内存是不是空指针,如果空就不处理直接返回了//然后判断内存第一个字节是什么字符,如果是协议规定的开头字符就继续,如果是动态报文if(pszSentence[1]==DATA_DYNC)//船舶动态数据{memcpy(szShipID,pszSentence+2,6);//获得船舶编号nID=atoi(szShipID);//计算船舶的编号,拷贝从第二个字节开始的6个字节,就是船舶编号了if(pszSentence[8]!=sizeof(DYNCDATA))//有效字节数是否正确return-1;//第8个字节是实际数据长度,比较一下看是否正确//如果正确说明数据是正确的,计算数据的校验码nLength=sizeof(DYNCDATA)+9;for(inti=1;inLength;i++)wCheckSum+=pszSentence[i];//从第一个字节到nLength-1,然后与报文中校验码比较,如果正确说明报文是完成的memcpy(&wValue,pszSentence+nLength,sizeof(WORD));//if(wCheckSum!=wValue)//数据校验码出现错误//return-1;nLength+=sizeof(WORD);if(pszSentence[nLength]!=DATA_EOI)return-1;//最后校验报文结束码是否正确,如果正确说明整个报文是正确的//这些工作完成了,现在是要获得动态报文的实际数据了//动态报文实际数据是从第9个字节开始的4.4船舶模拟定位根据接收到的船舶信息,把船的经纬度换算为屏幕坐标,再屏幕上调用VC的windows的函数就可以画船舶了,我们以船舶的经纬度坐标为船舶中心,以船舶的方向为方向,以一个三角形代表一个船舶,在其对应的经纬度位置模拟出船舶,实现接收数据,处理数据,并在电子海图中进行显示。画图函数部分代码如下。CPenpen(PS_SOLID,1,RGB(0,0,255));CPen*pOldPen=pDC-SelectObject(&pen);pDC-Polyline(pts,SYMBOL_POINTS_COUNT);pDC-SelectObject(pOldPen);例如在接收到的船舶名称为桃花渡1号的船舶,在其对应的经纬度以一个三角形进行显示,并在三角形旁边显示其对应的船舶名称。最后实现如图2。,远程接收、解析、处理、模拟,以及实时显示船舶信息的方法和过程。对于接收到的船舶信息数据,我们还可以继续进行更为有用的处理,如把接收到的信息存入数据库,以便在其它时间进行回放,查看当时的船舶的运行位置。参考文献[1]郭立新,彭认灿,刘艳春.面S-57电子海图显示与信息系统的研制开发.航海技术.2004.3.[2]小鹰,WindowsSocket网络编程(二)——套节字编程原理.,WuHan,Hubei(430063)AbstractThistexttalkedaboutreceivingtheshipinformationremotelyandparsingitwiththesoftdesigntoolofVC6.0,andthensimulatedtheshipintheelectronicchartplatform.Keywords:socket,shipinformation,electronicchart