鐘志武
(湖南省水利水電勘測(cè)設(shè)計(jì)研究總院 長(zhǎng)沙市 410007)
本系統(tǒng)作為山洪災(zāi)害預(yù)警系統(tǒng)的一部分,主要負(fù)責(zé)接收雨量水位監(jiān)測(cè)站通過無線GPRS網(wǎng)絡(luò)發(fā)送過來的數(shù)據(jù),包括雨量數(shù)據(jù)、水位數(shù)據(jù)、電瓶電壓數(shù)據(jù)和監(jiān)測(cè)站(水庫(kù)、河道和閘壩等)監(jiān)控?zé)o線視頻圖片信息。
系統(tǒng)在Windows環(huán)境下用Delphi 7編寫,數(shù)據(jù)庫(kù)采用MS SQL Server 2005。下位機(jī)采用基于ARM9處理器(三星 S3C2410)的HYKJ-2410 Arm-PC104嵌入式工業(yè)計(jì)算機(jī)主板設(shè)計(jì),配置HYKJ-GPRS V5.0通信模塊,預(yù)裝linux操作系統(tǒng),采用C語言編程,采用TCP/IP協(xié)議與上位機(jī)程序(本系統(tǒng))通訊。下位機(jī)采用太陽能電源供電(配置38 Ah電瓶和13 W太陽能電板),連接雨量傳感器、水位傳感器和視頻攝像頭。數(shù)據(jù)傳輸采用公共的GPRS網(wǎng)絡(luò),具有組網(wǎng)方便、實(shí)時(shí)性高、運(yùn)行費(fèi)用低等優(yōu)點(diǎn)。
Indy 的全名是 Internet Direct(也叫 Winshoes),它是一套開放源代碼的Internet控件集,它支持大部分流行的Internet協(xié)議。IdTCPServer控件是Indy控件系列中基于TCP/IP協(xié)議的TCP服務(wù)器控件。IdTCPServer是一個(gè)多線程控件。IdTCPServer在開始工作后,首先會(huì)自動(dòng)建立一個(gè)偵聽線程TidListenerThread,該線程負(fù)責(zé)偵聽客戶端的連接請(qǐng)求,Server端首先是響應(yīng)客戶的Connect事件,一旦連接了,就自動(dòng)在服務(wù)端對(duì)每一個(gè)服務(wù)器已接受的連接創(chuàng)建一個(gè)TidPeerThread線程。每個(gè)連接通過運(yùn)行各自所屬的TidPeerThread來實(shí)現(xiàn)與服務(wù)器的數(shù)據(jù)交互。只要有客戶發(fā)送數(shù)據(jù),就會(huì)激活Server的OnExecute事件。數(shù)據(jù)的接收是在各個(gè)為連接所建的線程中并發(fā)進(jìn)行的。而這個(gè)連接線程是需要Server維護(hù)的,IdTCPServer的最大連接線程數(shù)為600個(gè)左右,完全能滿足縣級(jí)山洪災(zāi)害預(yù)警系統(tǒng)的需要。
通常使用Winsock開發(fā)網(wǎng)絡(luò)應(yīng)用程序時(shí),從Socket中讀取數(shù)據(jù)或者向Socket寫入數(shù)據(jù)都是異步發(fā)生的,這樣就不會(huì)阻斷程序中其它代碼的執(zhí)行。在收到數(shù)據(jù)時(shí),Winsock會(huì)向應(yīng)用程序發(fā)送相應(yīng)的消息。這種訪問方式被稱作非阻塞式連接,它要求你對(duì)事件作出響應(yīng),設(shè)置狀態(tài)機(jī),并通常還需要一個(gè)等待循環(huán)。與通常的Winsock編程方法不同的是,Indy使用了阻塞式(便于編程)Socket調(diào)用方式。阻塞式訪問更像是文件存取。當(dāng)你讀取數(shù)據(jù),或是寫入數(shù)據(jù)時(shí),讀取和寫入函數(shù)將一直等到相應(yīng)的操作完成后才返回,程序也一直阻塞在讀或?qū)懙牡胤?。比如說,發(fā)起網(wǎng)絡(luò)連接只需調(diào)用Connect方法并等待它返回,如果該方法執(zhí)行成功,在結(jié)束時(shí)就直接返回,如果未能成功執(zhí)行,則會(huì)拋出相應(yīng)的異常。同文件訪問不同的是,Socket調(diào)用可能會(huì)需要更長(zhǎng)的時(shí)間,因?yàn)橐x寫的數(shù)據(jù)可能不會(huì)立即就能準(zhǔn)備好(很大程度上依賴于網(wǎng)絡(luò)帶寬)。
事物都具有兩面性,阻塞式Socket也不例外。它的一個(gè)主要的缺點(diǎn)就是使客戶程序的用戶界面“凍結(jié)”。當(dāng)在程序的主線程中進(jìn)行阻塞式Socket調(diào)用時(shí),由于要等待Socket調(diào)用完成并返回,這段時(shí)間就不能處理用戶界面消息,使得Update、Repaint以及其它消息得不到及時(shí)響應(yīng),從而導(dǎo)致用戶界面被“凍結(jié)”。Indy使用一個(gè)特殊的組件TIdAntiFreeze來透明地解決客戶程序用戶界面“凍結(jié)”的問題。TIdAntiFreeze在Indy內(nèi)部定時(shí)中斷對(duì)棧的調(diào)用,并在中斷期間調(diào)用Application.ProcessMessages方法處理消息,而外部的Indy調(diào)用繼續(xù)保存阻塞狀態(tài),就好像TIdAntiFreeze對(duì)象不存在一樣。我們只要在程序中的任意地方添加一個(gè)TIdAntiFreeze對(duì)象,就能利用到阻塞式Socket的所有優(yōu)點(diǎn)而避開它的一些顯著缺點(diǎn)。
Indy服務(wù)器工作原理同Unix服務(wù)器十分類似,只是Windows不像Unix那樣支持fork,而是支持線程,因此Indy服務(wù)器為每一個(gè)客戶連接分配一個(gè)線程。圖1顯示了Indy服務(wù)器的工作原理與系統(tǒng)流程圖。Indy服務(wù)器組件創(chuàng)建一個(gè)同應(yīng)用程序主線程分離的監(jiān)聽線程來監(jiān)聽客戶連接請(qǐng)求,對(duì)于接受的每一個(gè)客戶,都創(chuàng)建一個(gè)新的線程來為該客戶提供服務(wù),所有與這一客戶相關(guān)的事務(wù)都由該線程來處理。
圖1 系統(tǒng)流程示意圖
本系統(tǒng)接收的客戶端(下位機(jī))通過GPRS網(wǎng)絡(luò)上傳的數(shù)據(jù)包包括字符串包(雨量、水位和電壓)和流媒體包(視頻圖片)。由于服務(wù)端讀取各個(gè)客戶端數(shù)據(jù)是并發(fā)進(jìn)行的,所以應(yīng)盡量避免讀取數(shù)據(jù)時(shí)進(jìn)行數(shù)據(jù)處理入庫(kù),可分別為兩種數(shù)據(jù)包建立兩個(gè)循環(huán)隊(duì)列表,先將客戶端數(shù)據(jù)存入緩存中,然后新建兩個(gè)線程(定時(shí)器)處理數(shù)據(jù)。循環(huán)隊(duì)列表數(shù)據(jù)結(jié)構(gòu)如下所示:
下位機(jī)上傳的數(shù)據(jù)包符合水利部發(fā)布的水情信息編碼標(biāo)準(zhǔn)(SL330-2005)和湖南省山洪災(zāi)害監(jiān)測(cè)預(yù)警系統(tǒng)水文通信協(xié)議規(guī)范。數(shù)據(jù)包格式如下:
河道水位包:CH 10 000 001 MMDDHHNN PN10 2 Z 100.00 NN
該數(shù)據(jù)包表示站號(hào)為10 000 001的監(jiān)測(cè)站于時(shí)間MMDDHHNN采集的10分鐘雨量2 mm,河道水位100.00 m。
水庫(kù)水位包:CK 10 000 001 MMDDHHNN PN10 2 ZU 100.00 NN
該數(shù)據(jù)包表示站號(hào)為10 000 001的監(jiān)測(cè)站于時(shí)間MMDDHHNN采集的10分鐘雨量2 mm,庫(kù)水位100.00 m。
本系統(tǒng)除了接收監(jiān)測(cè)站的數(shù)據(jù)外,另一個(gè)功能是通過GSM短信貓遠(yuǎn)程設(shè)置監(jiān)測(cè)站的參數(shù),包括連接的數(shù)據(jù)中心IP地址、端口號(hào)、水位站類型(河道或水庫(kù)等)、站號(hào)、水位原始高程等。主要的模塊有視頻監(jiān)控模塊、站點(diǎn)信息管理模塊、參數(shù)設(shè)置模塊、數(shù)據(jù)監(jiān)測(cè)模塊、數(shù)據(jù)查詢模塊等。
圖2為監(jiān)測(cè)站視頻監(jiān)控示意圖。
本系統(tǒng)關(guān)鍵代碼如下:
圖2 監(jiān)測(cè)站視頻監(jiān)控示意圖
本系統(tǒng)已經(jīng)應(yīng)用于湖南省30多個(gè)縣的山洪災(zāi)害預(yù)警系統(tǒng)建設(shè)中,運(yùn)行穩(wěn)定可靠,極大地提高對(duì)暴雨山洪災(zāi)害的監(jiān)測(cè)能力和反應(yīng)速度,最大程度保障了人民群眾生命財(cái)產(chǎn)的安全。
1水情信息編碼標(biāo)準(zhǔn)SL 330-2005.中華人民共和國(guó)水利部[S].
2蔣方帥.Delphi 5程序員指南[M].北京:人民郵電出版社,2000.
3國(guó)家防汛抗旱總指揮部辦公室.山洪災(zāi)害防治縣級(jí)監(jiān)測(cè)預(yù)警系統(tǒng)建設(shè)技術(shù)要求[R].2010.