|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
<strong>0 引言</strong>
飞行仿真系统是现代航空科研、教学、试验等不可缺少的技术设备。在飞行性能研究、飞行品质评估和飞行训练等方面都具有很高的经济价值和军事价值。正常情况下,飞行仿真系统采用分布式计算技术,整个系统由多台计算机组成,各计算机之间的数据传输需要采用数据通信技术来完成。数据通信技术需要采用网络协议,目前互联网采用的协议是IPv4协议。
IPv4是互联网协议(Internet Protocol,IP)的第四版,它定义的IP数据通信方式有单播、全网广播和组播。单播是指两个IP地址间进行的数据通信;全网广播是指在IP子网内向所有网内IP地址以广播的方式发送数据包,所有子网内的IP站都能收到全网广播;组播是当某一个人向一组人发送数据时,他不必将数据向每一个人发送,只须将数据发送到一个特定的预约组地址,所有加入该组的人均可以收到这份数据。
为了让网络中的多个主机可以同时接受到相同的数据包,如果采用单播的方式,那么源主机必须分别发送相同的数据包。对于一台主机来说,同时不停的发送相同的数据包来说也是一个很大的负担。如果采用采用广播方式,则数据包传送到局域网内每个主机上,不管这个主机是否对数据包感兴趣,这样做就会造成了带宽的浪费和主机的资源浪费。如果采用组播的方式,源主机可以只需要发送一个数据包就可以到达每个需要接受的主机上,这中间还要取决于路由器对组员和组关系的维护和选择。组播有一套对组员和组之间关系维护的机制,可以明确的知道在某个子网中,是否有主机对这类组播数据包感兴趣,如果没有就不会把数据包进行转发,并会通知上游路由器不要再转发这类数据包到下游路由器上。InternetNIC关于IP地址的规定中,IP地址共分为A-E共5类, D类地址即为组播地址,范围为224.0.0.0-239.255.255.255。D类地址是动态分配和恢复的瞬态地址。每一个组播组对应于动态分配的一个D类地址;当组播组结束组播时,相对应的D类地址将被回收,用于以后的组播。
根据以上所述,运用组播技术,对发送者而言,数据只需发送一次就可以发送到所有接收者,所以,组播技术对于接收者来说,都是同时接收到相同的数据,这使得对计算机接收数据的同步性得到很好的控制,缩短了发送的时间周期,从而大大减轻了发送者的负担和网络的负载,节省了大量资源。
<strong>1 飞行仿真系统的组成及通信机制</strong>
一个典型的飞行仿真系统包括:飞行系统、火控系统、音响系统、运动系统、教员台系统、导航系统、仪表系统、操纵系统、多台视景计算机等,如图1所示。其中飞行系统控制整个飞行仿真系统,是整个系统的核心;仪表系统是显示飞机坐舱内各个仪表盘,通过仪表盘来显示飞机飞行的状态;操纵系统是控制飞机飞行的姿态;多台视景计算机显示的是飞机在同一位置时的不同角度。
<ignore_js_op>
2010-3-30 20:55:11 上传
<strong>下载附件</strong> (4.33 KB)
</ignore_js_op>
图1 飞行仿真系统的通信结构(实线表示网络)
根据图1所示,可以看出整个系统的数据传输过程。如果用单播通信方式,那么飞行系统计算机会重复发送相同的数据给多台视景计算机,增加了发送的时间周期,这样就会导致飞行系统计算机的工作任务的重复和网络资源的浪费,并且单播在发送数据时有先有后,因此五台视景显示计算机不是同时收到飞行系统计算机的数据,这样就会导致多台视景计算机帧与帧之间不同步,这不符合实时显示的要求。如果采用广播通信方式,则操纵系统计算机也会收到控制计算机的数据,而事实上是操纵系统计算机用不到飞行系统计算机的信息,这样会导致网络资源的浪费。如果采用组播的通信方式,飞行仿真系统中所有的计算机同在一个组播组中,这样飞行系统计算机发送一次数据,则有关计算机都会同时接收到相同的数据,多台视景计算机可以实时的显示飞机飞行的姿态,不会存在帧与帧之间不同步的问题。所以综合以上分析,我们在实验系统中采用组播技术来实现网络通信。
<strong>2 组播技术的实现</strong>
本节是介绍在VC6.0平台上如何用winsock实现组播通信编程的方法。
2.1 用winsock实现组播的方法
本系统采用VC6.0为开发工具。对于网络编程而言,需要用到多线程技术。在VC6.0开发环境中,开启一个线程用到AfxBeginThread()函数,AfxBeginThread(RecvThread, &m_mysock);其中RecvThread()函数是线程函数,主要是用来接收和发送数据的;m_mysock是自己封装的一个类CMySocket的对象,这个类封装所有有关组播通信的信息,如:线程函数中接收的数据存入该类的变量中。
对于Socket编程,首先要对sockaddr_in结构体进行初始化,就是把组播地址和端口号分别赋值给sockaddr_in中的s_addr和sin_port,具体实现如下代码:
Local.sin_addr.s_addr =inet_addr(“234.0.0.0”);
Local.sin_family = AF_INET;
Local.sin_port= htons( 2007 );
其中Local是sockaddr_in结构变量,组播地址为:234.0.0.0,端口号:2007。
然后是对套接字的初始化了,定义SOCKET的变量为sock,
sock = socket (AF_INET,SOCK_DGRAM,0);其中SOCK_DGRAM表示为采用UDP协议(SOCK_STREAM表示为TCP协议)。
初始化之后用bind()函数将套接字与IP地址和端口号绑定起来,bind (sock,(sockaddr*)&( Local),sizeof(Local));
其中sock与Local定义同上。
组播技术用setsockopt()函数的套接字功能选项来进行设置, setsockopt()函数有关组播技术的选项见下表:
<ignore_js_op>
2010-3-30 20:55:10 上传
<strong>下载附件</strong> (5.01 KB)
</ignore_js_op>
表1setsockopt()组播选项说明
发送数据用到sendto()函数,用这个函数向组播地址发送数据,sendto(sock,buffer,sizeof(buffer),0,(sockaddr*)&Local,sizeof(Local));
其中buffer所存放的就是所要发送的数据。这里介绍一下buffer中存放数据的形式,buffer是一个字符数组,它的前四位放的是本机的计算机名字;5到8位存放的是命令,这个命令是指要让接收方做什么事情;从9位以后全部都是数据,这些数据就是让接收方利用这些数据完成各自的任务。这个主要是因为发送方发送数据到组播地址后,所有的接收方都会到网组播地址上取数据,对于每个接收方,有可能接收的数据对于自己是无用的,所以在发送数据时,数据头加上前面所讲的1到8位的识别信息,接收方可以根据这些信息来获取对自己有用的数据。接收数据用到recvfrom()函数,这个函数是接收网络上的数据的,recvfrom(sock,recvBuff,1024,0,(sockaddr*)&clientsock,&sizeof(clientsock));recvBuff是字符数组,把接收过来的数据存放到这个数组中。然后,我们要对这个数据进行解析,也就是前面所讲的发送时所加的数据包头的信息。接收到数据以后,先对数据包的前四位进行判别,判别是从哪个计算机上发送来的信息。再对5到8位进行判别,判别是什么信息,也就是什么命令。根据数据包前8位的信息,如果是本机将要用到的数据,则对数据包前8位以后的数据进行提取;否则,对接收来的数据舍弃不用。
2.2 数据传输的有效性
在前面讲过组播的主要缺点是没有纠错机制,发生丢包错包后难以弥补。也就是说在数据传输过程中无法保证接收的数据与发送的数据一致,这样可导致实时仿真不同步,以至多台视景计算机不能实时观察飞机飞行的不同的角度,为了解决这个问题,采取两种方案予以弥补。
2.2.1采用时间等待
时间等方法是运用select()函数。select()函数用法是如果程序要检查套接字上在设定的时间范围内(timeout =5ms)是否有数据到来,则首先需要把套接字句柄加入可读性监视集合中,然后调用select()函数。如果没有数据到来,则再等下一个5ms,一直等到网络上有数据为止。select()函数具体实现如下代码:
if(select(NULL,NULL,&fds,NULL,&timeout)==-1)
exit(-1);
else if(select(NULL,NULL,&fds,NULL,&timeout)==0)
continue;
else if(FD_ISSET(sock,& fds))
但是这个方法也有一定的弊端,就是如果所有的视景计算机中某几台视景计算机在接收数据的过程中等待的时间长,那么所有的视景机一定不会同时获得相同数据,这样就会导致多台视景计算机视景不同步。
2.2.2 发送副本方法
在发送端发送数据时,同时要发送这个数据的一个或多个副本,在接收端接收数据时,如果发现接收的数据不正确,则到其它副本取数据,这样会弥补接收数据的不可靠性。
<strong>3 结束语
</strong>
由于组播技术采用的是UDP协议,UDP协议的主要特点是数据传输速度快,所以在飞行仿真系统中数据传输速度问题可以得到解决。在飞行仿真系统中,视景显示是该系统中的重点。如果多台视景机不同步显示,则会造成观察者无法对飞机飞行进行有效的控制,继而对整个系统无法控制。组播技术是只发送一次数据,同在一个组播地址内的计算机都会接收到这些数据,根据图1中所示,飞行系统计算机向视景计算机发送数据之后,视景计算机会同时接收到相同的数据,这样,视景计算机就会根据接收到的数据来做飞机飞行相应的动作。所以,利用组播技术,可以使视景计算机显示同步的问题得到解决。在飞行仿真系统中通过利用select()函数和发送副本的方式,可以使弥补数据在传输过程中的可靠性。利用以上的方法,在飞行仿真系统中,数据传输的速度、视景计算机的同步性和数据传输的可靠性都得到了很好的验证。
作者:高玉宝 |
|