浅谈远程诊断技术在电控发动机方面的应用
int pascal far listen( socket s, int backlog );
参 数: s:需要建立监听的socket;
backlog:最大连接个数;
服务器端的socket调用完listen()后,如果此时客户端调用connect()函数提出连接申请的话,server 端必须再调用accept() 函数,这样服务器端和客户端才算正式完成通信程序的连接动作。为了知道什么时候客户端提出连接要求,从而服务器端的socket在恰当的时候调用accept()函数完成连接的建立,我们就要使用wsaasyncse-lect()函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0,否则返回socket_error。
int pascal far wsaasyncse-lect( socket s, hwnd hwnd,unsigned int wmsg, long levent );
参数: s:socket 对象;
hwnd :接收消息的窗口句柄;
wmsg:传给窗口的消息;
levent:被注册的网络事件,也即是应用程序向窗口发送消息的网路事件,该值为下列值fd_read、fd_write、fd_oob、fd_accept、fd_connect、fd_close的组合,各个值的具体含意为fd_read:希望在套接字s收到数据时收到消息;fd_write:希望在套接字s上可以发送数据时收到消息;fd_accept:希望在套接字s上收到连接请求时收到消息;fd_connect:希望在套接字s上连接成功时收到消息;fd_close:希望在套接字s上连接关闭时收到消息;fd_oob:希望在套接字s上收到带外数据时收到消息。
具体应用时,wmsg应是在应用程序中定义的消息名称,而消息结构中的lparam则为以上各种网络事件名称。所以,可以在窗口处理自定义消息函数中使用以下结构来响应socket的不同事件:
switch(lparam)
{
case fd_read:
…
break;
case fd_write、
…
break;
…
}
电控单元(ECU)的通信协议主要就封装在该消息响应函数当中。
(5)服务器端接受客户端的连接请求
当client提出连接请求时,server 端hwnd视窗会收到winsock stack送来我们自定义的一个消息,这时,我们可以分析lparam,然后调用相关的函数来处理此事件。为了使服务器端接受客户端的连接请求,就要使用accept() 函数,该函数新建一socket与客户端的socket相通,原先监听之socket继续进入监听状态,等待他人的连接要求。该函数调用成功返回一个新产生的socket对象,否则返回invalid_socket。
socket pascal far accept( scoket s, struct sockaddr far *addr,int far *addrlen );
参数:s:socket的识别码;
addr:存放来连接的客户端的地址;
addrlen:addr的长度
(6)结束 socket 连接
结束服务器和客户端的通信连接是很简单的,这一过程可以由服务器或客户机的任一端启动,只要调用closesocket()就可以了,而要关闭server端监听状态的socket,同样也是利用此函数。另外,与程序启动时调用wsastartup()憨数相对应,程式结束前,需要调用 wsacleanup() 来通知winsock stack释放socket所占用的资源。这两个函数都是调用成功返回0,否则返回socket_error。
int pascal far closesocket( socket s );
参 数:s:socket 的识别码;
int pascal far wsacleanup( void );
参 数: 无
3.系统实现与应用
远程故障诊断系统要完成数据的传输需要建立一套完整的数据传输系统。系统中包括:DTU,电控单元(ECU)、移动网络、后台中心。
3.1网络拓扑图:
图2 网络结构
3.2系统实现方式
(1)终端设备,GPRS模块(DTU)
首先通过AT命令对GPRS模块进行设置,设置要连接的中心IP和端口及其它必要性的设置,设置好之后电控单元(ECU)通过RS232接口和GPRS模块相连,GPRS模块上电之后根据事先设置好的中心IP和端口进行连接,成功连接到服务中心后即可双向传输数据。即可实现在线远程监控电控单元(ECU)状态与下载电控单元(ECU)程序。
评论