淺談遠(yuǎn)程診斷技術(shù)在電控發(fā)動(dòng)機(jī)方面的應(yīng)用
int pascal far listen( socket s, int backlog );
參 數(shù): s:需要建立監(jiān)聽的socket;
backlog:最大連接個(gè)數(shù);
服務(wù)器端的socket調(diào)用完listen()后,如果此時(shí)客戶端調(diào)用connect()函數(shù)提出連接申請(qǐng)的話,server 端必須再調(diào)用accept() 函數(shù),這樣服務(wù)器端和客戶端才算正式完成通信程序的連接動(dòng)作。為了知道什么時(shí)候客戶端提出連接要求,從而服務(wù)器端的socket在恰當(dāng)?shù)臅r(shí)候調(diào)用accept()函數(shù)完成連接的建立,我們就要使用wsaasyncse-lect()函數(shù),讓系統(tǒng)主動(dòng)來通知我們有客戶端提出連接請(qǐng)求了。該函數(shù)調(diào)用成功返回0,否則返回socket_error。
int pascal far wsaasyncse-lect( socket s, hwnd hwnd,unsigned int wmsg, long levent );
參數(shù): s:socket 對(duì)象;
hwnd :接收消息的窗口句柄;
wmsg:傳給窗口的消息;
levent:被注冊(cè)的網(wǎng)絡(luò)事件,也即是應(yīng)用程序向窗口發(fā)送消息的網(wǎng)路事件,該值為下列值fd_read、fd_write、fd_oob、fd_accept、fd_connect、fd_close的組合,各個(gè)值的具體含意為fd_read:希望在套接字s收到數(shù)據(jù)時(shí)收到消息;fd_write:希望在套接字s上可以發(fā)送數(shù)據(jù)時(shí)收到消息;fd_accept:希望在套接字s上收到連接請(qǐng)求時(shí)收到消息;fd_connect:希望在套接字s上連接成功時(shí)收到消息;fd_close:希望在套接字s上連接關(guān)閉時(shí)收到消息;fd_oob:希望在套接字s上收到帶外數(shù)據(jù)時(shí)收到消息。
具體應(yīng)用時(shí),wmsg應(yīng)是在應(yīng)用程序中定義的消息名稱,而消息結(jié)構(gòu)中的lparam則為以上各種網(wǎng)絡(luò)事件名稱。所以,可以在窗口處理自定義消息函數(shù)中使用以下結(jié)構(gòu)來響應(yīng)socket的不同事件:
switch(lparam)
{
case fd_read:
…
break;
case fd_write、
…
break;
…
}
電控單元(ECU)的通信協(xié)議主要就封裝在該消息響應(yīng)函數(shù)當(dāng)中。
(5)服務(wù)器端接受客戶端的連接請(qǐng)求
當(dāng)client提出連接請(qǐng)求時(shí),server 端hwnd視窗會(huì)收到winsock stack送來我們自定義的一個(gè)消息,這時(shí),我們可以分析lparam,然后調(diào)用相關(guān)的函數(shù)來處理此事件。為了使服務(wù)器端接受客戶端的連接請(qǐng)求,就要使用accept() 函數(shù),該函數(shù)新建一socket與客戶端的socket相通,原先監(jiān)聽之socket繼續(xù)進(jìn)入監(jiān)聽狀態(tài),等待他人的連接要求。該函數(shù)調(diào)用成功返回一個(gè)新產(chǎn)生的socket對(duì)象,否則返回invalid_socket。
socket pascal far accept( scoket s, struct sockaddr far *addr,int far *addrlen );
參數(shù):s:socket的識(shí)別碼;
addr:存放來連接的客戶端的地址;
addrlen:addr的長度
(6)結(jié)束 socket 連接
結(jié)束服務(wù)器和客戶端的通信連接是很簡(jiǎn)單的,這一過程可以由服務(wù)器或客戶機(jī)的任一端啟動(dòng),只要調(diào)用closesocket()就可以了,而要關(guān)閉server端監(jiān)聽狀態(tài)的socket,同樣也是利用此函數(shù)。另外,與程序啟動(dòng)時(shí)調(diào)用wsastartup()憨數(shù)相對(duì)應(yīng),程式結(jié)束前,需要調(diào)用 wsacleanup() 來通知winsock stack釋放socket所占用的資源。這兩個(gè)函數(shù)都是調(diào)用成功返回0,否則返回socket_error。
int pascal far closesocket( socket s );
參 數(shù):s:socket 的識(shí)別碼;
int pascal far wsacleanup( void );
參 數(shù): 無
3.系統(tǒng)實(shí)現(xiàn)與應(yīng)用
遠(yuǎn)程故障診斷系統(tǒng)要完成數(shù)據(jù)的傳輸需要建立一套完整的數(shù)據(jù)傳輸系統(tǒng)。系統(tǒng)中包括:DTU,電控單元(ECU)、移動(dòng)網(wǎng)絡(luò)、后臺(tái)中心。
3.1網(wǎng)絡(luò)拓?fù)鋱D:
圖2 網(wǎng)絡(luò)結(jié)構(gòu)
3.2系統(tǒng)實(shí)現(xiàn)方式
(1)終端設(shè)備,GPRS模塊(DTU)
首先通過AT命令對(duì)GPRS模塊進(jìn)行設(shè)置,設(shè)置要連接的中心IP和端口及其它必要性的設(shè)置,設(shè)置好之后電控單元(ECU)通過RS232接口和GPRS模塊相連,GPRS模塊上電之后根據(jù)事先設(shè)置好的中心IP和端口進(jìn)行連接,成功連接到服務(wù)中心后即可雙向傳輸數(shù)據(jù)。即可實(shí)現(xiàn)在線遠(yuǎn)程監(jiān)控電控單元(ECU)狀態(tài)與下載電控單元(ECU)程序。
評(píng)論