APP下载

嵌入式模块接口性能测试系统的网络通信技术

2010-06-05董渊科

电子设计工程 2010年9期
关键词:网络通信命令数据包

李 玮,董渊科

(1.西北工业大学 软件与微电子学院,陕西 西安 710072;2.西北工业大学 航海学院,陕西 西安 710072)

随着ETX、SPT2C、ATPPC等嵌入式模块的规模化生产,设计技术的成熟,对这些模块的验收测试、仿真与其交联的模块、验证其功能、性能及接口的工作也越来越频繁。现代自动测试系统是由多个分系统组成的,每个分系统由通用系统或专用系统实现,并承担一部分相对独立的测控任务,各分系统之间通过信息交换实现并行与协同工作,共同实现整个自动测试系统的功能[1]。提出一种采用客户机/服务器模式的测试系统。该系统让每个客户机负责在本地对嵌入式模块的接口进行测试,而服务器负责各项测试命令的发送以及结果的接收和显示,这样可使测试部分和控制部分分离,便于模块化设计,提高整个测试系统的运行效率。

1 测试系统网络通信系统设计

1.1 通信流程

测试系统分为测试平台和控制平台2部分,控制平台相当于服务器,负责测试命令的发送。测试平台用于对嵌入式模块接口进行本地测试,它启动后必须连接到控制平台获得测试的相关信息后方可进行测试。对于测试平台的主体部分,测试人员可以根据被测对象使用不同的语言和方式进行设计,可以不局限于使用与控制平台相同的语言,这也是采用C/S模式的优势。测试台-控制台通信流程如图1所示。

在各模块交联测试中,测试的命令与结果数据量一般都很小,往往测试平台反馈给控制平台的结果只有正常/异常,或者一些简略的异常信息,但是也有一些测试平台需要将一些大容量的文件信息发送给控制平台进行存储并显示,在此,以小数据量的通信来设计网络传输中的数据包格式。

1.2 关键技术

测试系统的网络通信是基于TCP/IP协议的。选用TCP/IP协议是因为它在基本的IP数据包上增加了可靠性和流量控制,其流式套接字定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输[2]。

1.2.1 通信协议

测试系统通过发送一定格式的数据包来实现网络通信。一次发送和接收命令信息的缓冲区大小为1 024字节,一次通信过程(发送/接收)只能包含一个命令或结果。具体协议的格式为:状态字段+数据长度字段+命令字段+数据字段。信息结构格式见表1。

表1 命令信息结构表Tab.1 Structure of command packet

在此还需注意的是,控制平台和测试平台在开发过程中可能是用不同的开发环境或不同的编程语言,由此而产生相同的数据类型可能所占的字节数不同,双方需要约定数据包中各字段的数据存放方式与所代表的数据类型。同时可以根据具体调试台系统的需要设计不同的命令字段和状态字段编码。

1.2.2 CAsyncSocket特性分析

CAsyncSocket提供全面的由事件驱动的Socket通信能力,应用程序要响应Windows Socket激发的事件,就要创建自己派生的Socket子类捕获和响应事件[3]。由于CAsyncSocket是虚拟了一个消息池,借助它来完成各部分的消息循环,所有的操作必须在一个线程里完成才可以,其本身是异步的,已经设置了类似于多线程的机制。因此在使用CAsyncSocket实现网络通信时,不需要使用多线程技术,只要将CAsyncSocket与MFC的消息响应机制进行有效地结合,就可以提高网络通信的处理效率。

2 测试系统网络通信控制平台应用实现

为了说明问题,建立一个会话程序的例子,控制平台和测试平台分别独立编程。因为在工程中控制平台除了进行网络通信可能还负担有别的功能,所以本例中控制平台被建立为单文档MFC应用程序ServerProject,使用向导生成,选择支持WinSock;测试平台被建立为基于对话框的MFC应用程序ClientProject,使用向导生成,选择支持 WinSock。在控制平台和测试平台都自定义派生于CAsyncSocket类的CMySocket类。

从软件设计一致性的角度,关于socket的全部处理都使用MFC消息响应机制,所以在控制平台和测试平台都需要构造以下4类消息[4]:

1)WM_MY_INITSOCKET 消息,初始化 Socket;

2)WM_MY_MESSAGE消息,发送 Socket数据;

3)WM_MY_RECEIVE消息,接收来自Socket的数据;

4)WM_MY_CLOSE消息,接收Socket连接断开的事件。

以上消息分别对应于 OnMyInitial (),OnMyMessage(),OnMyReceive(),OnMyClose()等函数。

在实际工程中,控制平台的应用程序往往会有多个对话框,网络通信的结果也需要在多个对话框中传递,经过实验,在ServerProjectView类中生成并调用CMySocket类的对象是一种可靠的方法。

2.1 控制平台ServerProjectView类的实现

在ServerProjectView类中需要一个新的消息WM_MY_ACCEPT,用于处理Socket的OnAccept函数[5],它所对应的函数为OnMyAccept()。在ServerProjectView.cpp中声明全局变量m_listenSocket用于控制平台监听连接请求,m_connectSocket用于处理连接Socket。ServerProjectView类的工作过程如下:

1)应用程序启动时,响应WM_MY_INITSOCKET消息,在OnMyInitial()函数中初始化全局变量,调用Create函数将端口号与控制平台本地IP地址绑定于m_listenSocket变量,调用Listen()函数,使m_listenSocket变量处于监听状态;

2)测试平台启动并发起连接请求后,响应WM_MY_ACCEPT消息,完成Socket连接;

3)测试人员根据相关界面进行操作,确定要发送的测试命令后,响应WM_MY_MESSAGE消息,调用Send函数将这些测试命令数据包发送给测试平台;

4)Socket接收到测试结果后,响应WM_MY_RECEIVE消息,解析所得数据获得结果。

2.2 控制平台CMySocket类的实现

在CMySocket类中需要声明常量MAX_MSG_PACKET为1 024,还需要声明如下变量:

1)BYTE m_nBuffer[MAX_MSG_PACKET+1];//m_nBuffer为类的数据缓冲区

2)UINT m_nLength;//m_nLength为缓冲区大小值

3)CView*pView;//视类指针

CMySocket类的工作过程如下:

1)函数 bool CMySocket::GetView()获取应用程序视类指针,并赋值给pView;

2)函数 void CMySocket::OnAccept(int nErrorCode)接收到连接请求,处理FD_ACCEPT事件,通过视类指针发送WM_MY_ACCEPT消息;

3)函数 void CMySocket::OnReceive(int nErrorCode)处理FD_READ事件,通过视类指针发送WM_MY_RECEIVE消息,将数据缓冲区接收到的数据发送给ServerProjectView类。

3 测试系统网络通信测试平台应用实现

测试平台为一个基于对话框的应用程序ClientProject,在ClientProjectDlg类中生成并调用CMySocket类的对象。

3.1 测试平台ClientProjectDlg类的实现

在ClientProjectDlg中声明全局变量m_clientSocket用于与控制平台进行网络通信。ClientProjectDlg类的工作过程如下:

1)应用程序启动时,响应WM_MY_INITSOCKET消息,在OnMyInitial()函数中初始化全局变量,调用Create函数,无需指定端口号,但必须指定控制平台的IP地址serverIP,因为Create函数中触发了FD_CONNECT事件,m_clientSocket会自动向控制平台发起连接请求;

2)Socket接收到测试命令后,响应 WM_MY_RECEIVE消息,解析所得数据获得命令;

3)执行完成测试命令并得到测试结果后,根据协议将数据构造测试结果数据包,响应WM_MY_MESSAGE消息,调用Send函数将这些测试结果数据包发送给控制平台。

3.2 测试平台CMySocket类的实现

在CMySocket类中需要声明常量MAX_MSG_PACKET为1 024,需要声明如下变量:

1)YTE m_nBuffer[MAX_MSG_PACKET+1];//m_nBuffer 为类的数据缓冲区

2)INT m_nLength;//m_nLength为缓冲区大小值

3)ClientProjectDlg*pMyDialog;//对话框类指针

CMySocket类的工作过程如下:

1)函数 bool CMySocket::GetDlg()获取应用程序对话框类指针,并赋值给pMyDialog;

2)函数 void CMySocket::OnReceive(int nErrorCode)处理FD_READ事件,通过视类指针发送WM_MY_RECEIVE消息,将数据缓冲区接收到的数据发送给ClientProjectDlg类。

4 系统运行效果及分析

作为基于网络通信的测试系统,应具有最大的可扩展性和高稳定性[6]。由于TCP/IP协议采用3次握手建立连接,提供可靠的数据流服务,可以保证其基础上所搭建的测试系统的高稳定性。在项目测试实验过程中,网络通信达到无误码率,满足嵌入式模块接口测试对结果准确性的需求。

该网络通信技术应用于地图嵌入式模块测试及语音嵌入式模块测试。其中前者需要进行命令通信,而后者既需要传输命令,又需要传输大批量的语音文件。此时专用通信协议表现出良好的可移植性,通过对命令信息结构的数据字段的扩展,实现语音文件的可靠和高速传输。

在设计过程中,异常处理是影响系统稳定性的关键。当网络电缆被拔出、测试台程序或控制台程序被强制关闭时,需要及时被发现并处理。因此,在控制台设置定时器,周期查询连接是否正常,结合WM_MY_CLOSE消息的接收情况,对异常情况进行有效识别并处理。

5 结 论

提出了一种针对嵌入式模块接口性能测试系统的网络通信方式,使用了Visual C++6.0 MFC平台,主要运用了MFC封装的CAsyncSocket类的相关特性,并将之与MFC具有的消息响应机制结合,通过引入自定义的通信协议,达到快速稳定的通信效果。所有代码均来源于自动化测试软件的实际工程中,在Visual C++6.0平台下调试通过。

[1]张元,韩燮.网络化测试系统中问件的研究与设计[J].计算机工程与设计,2009,30(22):5279-5283.ZHANG Yuan,HAN Xie.Research and design of middleware in network test system[J].Computer Engineering and Design,2009,30(22):5279-5283.

[2]李峰,陈向益.TCP/IP—协议分析与应用编程[M].北京:人民邮电出版社,2008.

[3]李文天,董祥军,张洁.用MFC CAsyncSocket类实现计算机间的通信[J].山东轻工业学院学报,2001,15(1):21-25.LI Wen-tian,DONG Xiang-jun,ZHANG Jie.Realizing the computer communication by using MFC CAsyncSocket class[J].Journal of Shandong Institute of Light Industry,2001,15(1):21-25.

[4]曾小立.基于TCP/IP的数据远程传输的实现[J].三峡大学学报:自然科学版,2002(24):432-433.ZENG Xiao-li.The implementation of the data-transmission based on TCP/IP[J].Jounal of China Three Gorges University:Natural Science,2002(24):432-433.

[5]罗瑜,胡荣强.远程监控系统中网络通信的研究与实现[D].武汉:武汉理工大学,2006.

[6]王瑞斌,李凤崎,施玉勋,等.基于IOCP机制的网络游戏服务器通信层的实现[J].计算机工程与应用,2009,45(7):75-78 WANG Rui-bin,LI Feng-qi,SHI Yu-xun,et al.Realization of IOCP-based net layer of online games server[J].Computer Engineering and Applications,2009,45(7):75-78.

猜你喜欢

网络通信命令数据包
只听主人的命令
基于Jpcap的网络数据包的监听与分析
基于网络通信的智能照明系统设计
SmartSniff
网络通信中信息隐藏技术的应用
移防命令下达后
基于网络通信的校园智能音箱设计
谈计算机网络通信常见问题及技术发展
这是人民的命令
移动IPV6在改进数据包发送路径模型下性能分析