馮凌杰,張 梅,范建豐
(華南理工大學精密電子制造裝備教育部工程研究中心自動化學院,廣州510640)
遠程監控是國內外研究的前沿熱門課題,基于Internet的遠程監控取得了巨大的發展,被廣泛應用于機器人遠程分布式控制、設備遠程故障診斷、遠程網絡實驗室等領域。
目前的數據采集和遠程監控系統中,通訊方式分為有線通訊和無線通訊。有線通信因其線路架設成本太高,位置固定不能移動,從而限制了在偏遠地區和移動環境下的應用。無線通信則克服了有線通信的缺點[1]。GPRS是一種基于GSM系統的無線分組交換技術。GPRS借用了移動的接入網和傳輸網,提供端到端、廣域的無線IP連接。所以,GPRS較其他通信鏈路具有五大優點:瞬間上網、永遠在線、快速傳輸、按量計費、自由切換。因此,GPRS通信方式廣泛的應用于各類遠程監控系統。
基于GPRS通信鏈路的實現方案:客戶端采用RAM7+一體化GPRS DTU實現數據的采集與收發,服務器端采用通信模塊與數據處理模塊相分離的實現方案。這種實現降低了系統的開發難度,提高了系統的實時性。整個遠程監控系統的構建如圖1所示。
目前,GPRS的通信鏈路主要有四種實現方案:
(1)中心采用ADSL等INTELNET公網連接,采用公網固定IP。監控點直接向中心發起連接,系統運行可靠穩定。
(2)中心采用主副GPRS-DTU,采用移動內網動態IP+移動DNS解析服務。此方案可以節約固定IP的費用,但某些移動公司不提供DNS解析服務,所以應用受到限制,并且此方案實時性和穩定性較差。

圖1 遠程監控系統構建
(3)中心采用主副GPRS-DTU,采用移動APN專網固定IP。這種方案具有移動內網固定IP,傳輸數據不經過公網,節省了寬帶專線費用,所以其穩定性,安全性和性價比都比方案二好。
(4)中心采用APN專線,采用內網固定IP。此方案在實時性、安全性和穩定性方面都比前三種方案有很大提高,適用于數據點多、安全性和實時性要求高的環境。缺點是費用太高[2-3]。
綜合考慮穩定性和開發成本,最終決定采用方案一。
GPRS有TCP和UDP兩種通信協議。TCP是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。TCP協議有五大特點:①面向連接的傳輸;②端到端的通信;③高可靠性;④全雙工方式傳輸;⑤采用字節流方式。UDP提供的服務是不可靠的、無連接的,因UDP無需進行確認排序以及網絡信息的發送,其數據包的包頭較TCP小,占用網絡資源少,實時性較高。因此,TCP協議更多的應用于對數據傳輸的可靠性要求較高,但對實時性要求不是很高的情況,例如文件傳送、計算機郵件等;而UDP適用于對數據傳輸的可靠性要求不是很高,但對實時性要求比較高的情況,例如視頻電話會議系統等[4]。
綜合考慮遠程監控的實時性和數據傳輸的可靠性,決定選用TCP協議。
在客戶端,利用RAM7開發出基于UC/OS II實時操作系統的串口通信程序,從而將RAM7采集到的數據發送給GPRS DTU模塊。UC/OS II操作系統是基于任務的,所以在該程序中建立了一個主函數和兩個任務。
主函數采用UC/OS II中main函數的典型寫法,只用于初始化UC/OS II、啟動多任務環境和建立一個 TaskUart0Send 任務[5]。
TaskUart0Send任務完成目標板的初始化和數據的發送,并建立一個數據發送任務Taskrecv:
UART0_Init(115200);/*初始化目標板的串口*/
UART1_SendStr(snd);/*向串口發送字符串snd*/
OSTaskCreate(Taskrecv,(void*)0,&TaskStk[TaskStkLengh-1],2);
TaskRecv任務主要完成數據的接收[6],本任務采用循環接收,每次接收一個字節,直到接收完規定的字節數為止。
for(i=0;i<8;i++)
{if(UART0Getch())
{
temp=UART0Getch();
*cp++=temp;
}
}
該服務器的通信模塊采用socket套接字的非阻塞實現形式,其基本流程如圖2所示。

圖2 服務器通信模塊流程圖
圖2 中啟動服務器函數的主要功能是初始化套接字[7],包括初始化 windows socket的動態庫、創建新的套接字并設置其為非阻塞模式、綁定套接字并進行監聽。
創建清理資源線程和接收客戶端線程的程序模塊主要是實現接收客戶端請求線程和釋放資源線程的創建。接收客戶端請求線程用來完成接收客戶端的連接請求,釋放資源線程主要用于當數據傳輸完畢時清理相應線程所占的系統資源。
當完成接收客戶端請求時,在臨界區內以sAccept套接字和addrclient客戶端地址為參數創建一個cClient類的實例,將該實例作為一個節點加入用戶鏈表cClientlist中,并為該客戶端創建接收和發送數據線程,從而使服務器在各自的線程中調用socket中的recv()和send()l來實現數據的收發:
//創建接收客戶端數據線程
m_hThreadRecv=CreateThread(NULL,0,Recv-DataThread,this,0,&ulThreadId);
//創建數據發送線程
m_hThreadSend=CreateThread(NULL,0,Send-DataThread,this,0,&ulThreadId);
結束進程完成服務器退出是最后清理工作,清理在啟動主線程時申請的資源[8]。其中包括釋放臨界區對象和事件對象句柄、關閉SOCKET以及卸載Windows Sockets DLL。
通過實際的鏈路搭建和調試運行,證明該系統可以很好的滿足遠程監控系統對實時性和移動性的要求,并且所用費用不高,具有很好的性價比。實際的客戶端搭建如圖3所示。

圖3 客戶端的搭建
[1]GeoffreySanders.GPRSnetworks[C].Chichester,England;Hoboken,NJ:Wiley,2003:210 -230.
[2]趙亮,黎峰.GPRS無線網絡在遠程數據采集中的應用[J].計算機工程與設計,2005(9)期:2552 -2554.
[3]Yi- Bing Lin,Shun - Ren Yang.A mobility management strategy for GPRS[J].IEEE Transactions on Wireless Communications,2003,2(6):1178 -1188.
[4]TCP/IP協 議[EB/OL].http://tieba.baidu.com/f?kz=477764940.
[5]Labrosse J J.MicroC/OS - II The Real- Time Kenel[M].Second Edition.邵貝貝譯.北京:北京航空航天大學出版社,2006.
[6]周立功,張華.深入淺出 RAM7-LPC213X/214X(下冊)[M].北京:北京航空航天大學出版社,2006.
[7]Socket編程的實現過程[EB/OL].http://blog.sina.com.cn/s/blog_59f0cdb00100ajgl.htm.
[8]孫海民.精通windows socket網絡開發[M].北京:北京郵電出版社,2008.