引言
在解決一個(gè)監(jiān)控系統(tǒng)的信息傳輸問(wèn)題時(shí),遇到了一些困難,主要的原因是該系統(tǒng)中的數(shù)據(jù)類型多,發(fā)送的方向雜,控制起來(lái)比較繁瑣。而引入XML文件后使得這個(gè)問(wèn)題變得簡(jiǎn)單化。
1 監(jiān)控系統(tǒng)的數(shù)據(jù)通信
數(shù)據(jù)通信是依照一定的通信協(xié)議,利用數(shù)據(jù)傳輸技術(shù)在兩個(gè)終端之間傳遞數(shù)據(jù)信息。它可實(shí)現(xiàn)計(jì)算機(jī)和計(jì)算機(jī)、計(jì)算機(jī)和終端以及終端與終端之間的數(shù)據(jù)信息傳遞。在分布式監(jiān)控系統(tǒng)中,數(shù)據(jù)通信是最基本的問(wèn)題。如圖1所示是一個(gè)比較典型的站點(diǎn)式遠(yuǎn)程監(jiān)控系統(tǒng)的模型。
在這個(gè)系統(tǒng)中,監(jiān)控中心和站點(diǎn)之間要相互發(fā)送數(shù)據(jù),基本上有三種情況:
(1) 站點(diǎn)→監(jiān)控中心
如站點(diǎn)采集到的現(xiàn)場(chǎng)數(shù)據(jù)、抓拍的圖片信息、報(bào)警信息、站點(diǎn)收到監(jiān)控中心發(fā)來(lái)的數(shù)據(jù)后回發(fā)的確認(rèn)應(yīng)答信息等。
(2) 監(jiān)控中心→站點(diǎn)
如監(jiān)控中心發(fā)往站點(diǎn)的基礎(chǔ)數(shù)據(jù)與系統(tǒng)運(yùn)行參數(shù)、監(jiān)控中心收到站點(diǎn)發(fā)來(lái)的數(shù)據(jù)后回發(fā)的確認(rèn)應(yīng)答信息、監(jiān)控中心給站點(diǎn)的遠(yuǎn)程控制指令等。
(3) 站點(diǎn)→站點(diǎn)
有些事務(wù)可能需要兩個(gè)站點(diǎn)共同完成(如在站點(diǎn)A稱得皮重,在站點(diǎn)B稱得毛重,兩個(gè)站點(diǎn)要相互交換數(shù)據(jù)才能得到凈重值),因此在站點(diǎn)之間也會(huì)發(fā)送數(shù)據(jù),而這些數(shù)據(jù)監(jiān)控中心是不關(guān)心地。
由此可見(jiàn),在這個(gè)站點(diǎn)式監(jiān)控系統(tǒng)中有多種數(shù)據(jù)要互相發(fā)送,并且數(shù)據(jù)的發(fā)送是隨機(jī)的、雜亂的、動(dòng)態(tài)的,內(nèi)容相異,格式不同,種類繁多。另外,監(jiān)控中心通過(guò)局域網(wǎng)連接Internet,可以有固定的IP地址,而站點(diǎn)使用ADSL連接,通常其IP地址是不固定的,用Socket通信機(jī)制作為系統(tǒng)的數(shù)據(jù)通道時(shí),把監(jiān)控中心做為Socket Server,啟動(dòng)偵聽(tīng),站點(diǎn)只能做Socket Client,主動(dòng)連接Server。站點(diǎn)之間若要相互傳送數(shù)據(jù),則只能通過(guò)監(jiān)控中心來(lái)轉(zhuǎn)發(fā),更增加了監(jiān)控中心和站點(diǎn)之間收發(fā)數(shù)據(jù)的復(fù)雜性。
2 XML及其特點(diǎn)
XML(EXtensible Markup Language)是可擴(kuò)展標(biāo)記語(yǔ)言,類似于HTML,但和HTML不同的是XML的標(biāo)記不是預(yù)先定義好的,用戶可以且必須自己定義標(biāo)記。XML是用來(lái)描述數(shù)據(jù)和保存數(shù)據(jù)的一種靈活而有效的方式,能夠清楚地表示出:什么是數(shù)據(jù),有什么數(shù)據(jù)及如何組織數(shù)據(jù)。XML是Web上表示結(jié)構(gòu)化信息的一種標(biāo)準(zhǔn)文本格式,廣泛用于網(wǎng)絡(luò)數(shù)據(jù)交換,具有“易于生成數(shù)據(jù)”的優(yōu)點(diǎn)。
XML支持世界上幾乎所有的主要語(yǔ)言,并且不同語(yǔ)言的文本可以在同一文檔中混合使用,應(yīng)用XML的軟件能處理這些語(yǔ)言的任何組合。所有這一切將使XML成為數(shù)據(jù)表示的一個(gè)開(kāi)放標(biāo)準(zhǔn),這種數(shù)據(jù)表示獨(dú)立于機(jī)器平臺(tái)、供應(yīng)商以及編程語(yǔ)言。
XML被引入許多網(wǎng)絡(luò)協(xié)議,以便于為二個(gè)軟件提供相互通信的標(biāo)準(zhǔn)方法,如簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP)和XML-RPC規(guī)范。
XML數(shù)據(jù)是以純文本格式存儲(chǔ)的,提供了一種與軟件和硬件無(wú)關(guān)的共享數(shù)據(jù)方法,所以XML數(shù)據(jù)文件可以被更多的用戶、更多的設(shè)備所利用,而不僅僅是基于HTML標(biāo)準(zhǔn)的瀏覽器。
XML是不同系統(tǒng)之間的橋梁。
3 系統(tǒng)模型的建立
根據(jù)監(jiān)控系統(tǒng)的功能要求和XML的特點(diǎn),將系統(tǒng)的數(shù)據(jù)通信問(wèn)題轉(zhuǎn)化為如何實(shí)現(xiàn)網(wǎng)絡(luò)文件傳輸和如何使用XML文件表示數(shù)據(jù)這兩個(gè)子問(wèn)題。同時(shí),為了便于實(shí)現(xiàn),提高系統(tǒng)的可靠性、穩(wěn)定性及可維護(hù)性,采用層次結(jié)構(gòu),將系統(tǒng)的功能劃分為七層模型,如圖2所示:
(1) 物理鏈路層
是指網(wǎng)絡(luò)通訊的線路,本系統(tǒng)采用電信的ADSL有線方式,其它也可以是局域網(wǎng)(雙絞線、同軸電纜、光纖等)或者無(wú)線通訊方式(GPRS、GSM、CDMA等);物理鏈路層是系統(tǒng)數(shù)據(jù)通信的基礎(chǔ),但與上層的實(shí)現(xiàn)方式基本無(wú)關(guān)。
(2) 標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議層
是指TCP/IP(TransmissionControl Protocol/InternetProtocol)協(xié)議族,網(wǎng)絡(luò)中TCP/IP協(xié)議叫做傳輸控制/網(wǎng)際協(xié)議,又叫網(wǎng)絡(luò)通訊協(xié)議,是Internet國(guó)際互聯(lián)網(wǎng)絡(luò)的基礎(chǔ),其中的TCP協(xié)議和UDP(User Datagram Protocol)協(xié)議是兩種最常用的數(shù)據(jù)通信協(xié)議。
(3) 文件傳輸層
使用Socket(套接字)技術(shù)實(shí)現(xiàn)文件的傳輸。Socket是Windows與網(wǎng)絡(luò)的接口。Windows通過(guò)Socket把數(shù)據(jù)格式轉(zhuǎn)換成網(wǎng)絡(luò)傳輸格式,也把網(wǎng)絡(luò)數(shù)據(jù)格式轉(zhuǎn)換成Windows格式。Socket可以使用面向連接的協(xié)議(如TCP),也可以使用無(wú)連接的協(xié)議(如UDP)。Socket一般用來(lái)描述IP地址和端口,是一個(gè)通信鏈接的句柄。應(yīng)用程序通常通過(guò)Socket向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求,可以通過(guò)Socket傳送數(shù)據(jù),進(jìn)一步封裝成傳送任何文件(字節(jié)流)的功能。
(4) XML文件控制層
在XML中的數(shù)據(jù)可能是接收到的數(shù)據(jù),也可能是要發(fā)送的數(shù)據(jù),監(jiān)控中心和站點(diǎn)必須準(zhǔn)確控制XML文件的接收和發(fā)送。特別是對(duì)于監(jiān)控中心,可能同時(shí)接收到多個(gè)站點(diǎn)發(fā)送來(lái)的XML文件,發(fā)送XML文件時(shí)也要準(zhǔn)確控制發(fā)送的目標(biāo)站點(diǎn)。
(5) XML文件封裝/解析層
這是兩個(gè)相逆的過(guò)程,也是兩種相對(duì)應(yīng)的操作。XML文件封裝是指將要發(fā)送的數(shù)據(jù)按照一定的協(xié)議打包組裝成一個(gè)特定格式的XML文件,解析是指對(duì)一個(gè)XML文件按照特定的協(xié)議進(jìn)行分析解讀,還原出其中所描述的數(shù)據(jù)。
(6) 數(shù)據(jù)表示層
將采集到的數(shù)據(jù)、處理中的數(shù)據(jù)或者在數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)等各種數(shù)據(jù)格式轉(zhuǎn)換為能夠用XML文件描述的格式。這一層在本地操作的數(shù)據(jù)和遠(yuǎn)程傳輸?shù)臄?shù)據(jù)之間建立了一個(gè)通道,使兩者之間互不影響,從而不會(huì)降低系統(tǒng)的執(zhí)行效率。
(7) 業(yè)務(wù)邏輯層
實(shí)際上就是整個(gè)系統(tǒng)的用戶接口,或者說(shuō)是系統(tǒng)功能的實(shí)現(xiàn)層,包括打印單據(jù)、防作弊、報(bào)警處理、用戶管理、查詢統(tǒng)計(jì)、費(fèi)用計(jì)算、實(shí)時(shí)監(jiān)控、基礎(chǔ)數(shù)據(jù)錄入、系統(tǒng)管理等。
4 系統(tǒng)實(shí)現(xiàn)
4.1 網(wǎng)絡(luò)文件傳輸
4.1.1 動(dòng)態(tài)鏈接庫(kù)
本系統(tǒng)使用VC++開(kāi)發(fā)專門用于網(wǎng)絡(luò)文件傳輸?shù)膭?dòng)態(tài)鏈接庫(kù)(DLL),基于對(duì)字節(jié)流的處理可以傳輸任何文件,因此對(duì)于XML文件的傳輸來(lái)說(shuō)是透明的。該動(dòng)態(tài)鏈接庫(kù)的主要接口及其功能如下:
(1) 初始化
服務(wù)器端要先啟動(dòng)監(jiān)聽(tīng),客戶端主動(dòng)聯(lián)接。
DWORD DT_Net_InitServer(BOOL bIsServer = TRUE);
參數(shù):bIsServer表示是否將此Socket端用作服務(wù)返回:0或者錯(cuò)誤代碼
(2) 設(shè)置回調(diào)函數(shù)接口
DWORD DT_Net_SetCallBack(LPVOID pParam,LPNET_ACCEPT_CALLBACK pAccept,LPNET_RECV_CALLBACK pRevc,LPNET_DISCONN_CALLBACK pDisConnect,LPNET_LOG_CALLBACK pLogInfo);
包括請(qǐng)求連接、接收到數(shù)據(jù)、斷開(kāi)連接和日志回調(diào)。
(3) 設(shè)置文件操作的回調(diào)函數(shù)接口
DWORD DT_Net_SetFileCallBack(LPCTSTR pSavePath,LPNET_SENDFILE_CALLBACK pSendFile,LPNET_RECVFILE_CALLBACK pRecvFile,LPNET_ABORTFILE_CALLBACKpAbortFile);
包括文件發(fā)送完畢、接收到文件、文件發(fā)送中斷的回調(diào)。
(4) 服務(wù)器啟動(dòng)監(jiān)聽(tīng)
DWORD DT_Net_StartListen(LPCTSTR pszLocalIP,unsigned long nSvrPort);
參數(shù):pszLocalIP-服務(wù)器IP地址nSvrPort-服務(wù)器端口號(hào)返回:0或者錯(cuò)誤代碼
(5) 服務(wù)器停止監(jiān)聽(tīng)
DWORD DT_Net_StopListen();
(6) 發(fā)送文件
DWORD DT_Net_SendFile(unsigned int nIDSocket,LPCTSTR pstrFileName, LPCTSTR pszReName=NULL);
參數(shù):nIDSocket-Client端套接字句柄pstrFileName-文件名稱(全部路徑)pszReName-文件重命名
(7) 中止文件發(fā)送
DWORD DT_Net_AbortFile(unsigned int nIDSocket);
參數(shù):nIDSocket-Client端套接字句柄
(8) 斷開(kāi)連接
DWORD DT_Net_DisConnect(unsigned int nIDSocket);
參數(shù):nIDSocket-套接字句柄
(9) 連接服務(wù)器
D W O R D D T _ N e t _ C o n n e c t R e m o t e ( L P C T S T RpstrRemoteIP, unsigned long nRemotePort);
參數(shù):pstrRemoteIp-服務(wù)器IP地址;nRemotePort-服務(wù)器端口號(hào)
4.1.2 實(shí)現(xiàn)文件傳輸
將監(jiān)控中心作為Socket Server,啟動(dòng)監(jiān)聽(tīng):DT_Net_InitServer(TRUE);DT_Net_StartListen(ServerIP,ServerPort);
然后設(shè)置回調(diào)函數(shù):
DT_Net_SetCallBack(self,LPNET_ACCEPT_CALLBACK,LPNET_RECV_CALLBACK,LPNET_DISCONN_CALLBACK,LPNET_LOG_CALLBACK);
DT_Net_SetFileCallBack(PChar('d:\temps'),LPNET_SENDFILE_CALLBACK,LPNET_RECVFILE_CALLBACK,LPNET_ABORTFILE_CALLBACK);
各站點(diǎn)作為Socket Client,也設(shè)置回調(diào)函數(shù),并主動(dòng)去連接Server:
DT_Net_InitServer(FALSE);
DT_Net_SetCallBack(self,LPNET_ACCEPT_CALLBACK,LPNET_RECV_CALLBACK,LPNET_DISCONN_CALLBACK,LPNET_LOG_CALLBACK);
DT_Net_SetFileCallBack(PChar('c:\tempc'),LPNET_SENDFILE_CALLBACK,LPNET_RECVFILE_CALLBACK,LPNET_ABORTFILE_CALLBACK);
DT_Net_ConnectRemote(ServerIP,ServerPort);
每個(gè)站點(diǎn)和監(jiān)控中心之間建立唯一的獨(dú)立通道,當(dāng)連接建立成功后,就可以利用該套接字在該站點(diǎn)與監(jiān)控中心之間收發(fā)文件:
DT_Net_SendFile(theSocket,FileName);
4.2 XML文件封裝協(xié)議
不同的數(shù)據(jù)最終封裝成的XML文件是不同的,但是為了便于處理,把每一個(gè)XML文件分成兩個(gè)主要的部分(Head和Data),如圖3所示:
(1) Head部分系統(tǒng)中的任何一個(gè)X M L數(shù)據(jù)文件都有相同的H e a d (數(shù)據(jù)包頭), 表明該X M L文件的優(yōu)先級(jí)( p r i o r i t y )、數(shù)據(jù)種類(FrameType)、來(lái)自何處(FromStationNo,站點(diǎn)編號(hào),如果是服務(wù)器則為“0”)以及封裝時(shí)間(DateTime)。
(2) Data部分這一部分是XML文件所要封裝的數(shù)據(jù)內(nèi)容,基本按字段格式排列即可。要注意數(shù)據(jù)類型轉(zhuǎn)換的問(wèn)題,任何數(shù)據(jù)都必須想方設(shè)法轉(zhuǎn)換成字符串類型的表示形式。
4.3 XML文件控制
在實(shí)現(xiàn)了文件傳輸?shù)幕A(chǔ)上,對(duì)XML文件的封裝、解析、接收和發(fā)送等操作使用多線程方式并行處理,并且引入隊(duì)列(Queue)的機(jī)制。監(jiān)控中心的基本處理機(jī)制與流程如圖4所示:
文件接收線程接收到XML文件后,先不管文件的具體內(nèi)容,只負(fù)責(zé)將文件入隊(duì)。然后由專門負(fù)責(zé)從隊(duì)列中提取文件的線程將文件取出,由處理線程進(jìn)行解析、處理,并將數(shù)據(jù)保存至數(shù)據(jù)庫(kù),同時(shí)還要生成確認(rèn)應(yīng)答的XML文件放如發(fā)送隊(duì)列中。另外有專門負(fù)責(zé)發(fā)送文件的線程將文件發(fā)送出去。監(jiān)控中心要往各站點(diǎn)發(fā)送的數(shù)據(jù)有一個(gè)獨(dú)立的線程負(fù)責(zé)從數(shù)據(jù)庫(kù)中讀取相應(yīng)數(shù)據(jù)封裝成XML文件放入發(fā)送隊(duì)列,等待發(fā)送。數(shù)據(jù)處理線程負(fù)責(zé)對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)做進(jìn)一步的業(yè)務(wù)處理,而系統(tǒng)監(jiān)管線程主要的任務(wù)就是監(jiān)視其它各個(gè)線程的狀態(tài),及時(shí)進(jìn)行調(diào)整、修復(fù)或者發(fā)出報(bào)警,以保證系統(tǒng)正常運(yùn)行。
站點(diǎn)的處理與監(jiān)控中心的處理比較相似,但更為簡(jiǎn)單,因?yàn)楸O(jiān)控中心面對(duì)多個(gè)站點(diǎn),而站點(diǎn)只面對(duì)一個(gè)監(jiān)控中心。
要保證監(jiān)控中西文件處理的速度和系統(tǒng)運(yùn)行的效率還要考慮以下幾個(gè)問(wèn)題:
(1) 優(yōu)先級(jí)
(2) 區(qū)分文件是哪個(gè)站點(diǎn)發(fā)送來(lái)的或者要發(fā)送給哪個(gè)站點(diǎn)
(3) 文件隊(duì)列的管理
雖然XML文件的
部分有優(yōu)先級(jí)和站點(diǎn)編號(hào)信息,但是需要解析XML文件才能得到,為此要把文件名定為“優(yōu)先級(jí)_站點(diǎn)編號(hào)_流水號(hào)。xml”的格式,可在一定程度上方便處理的過(guò)程。另外,文件隊(duì)列可能存在積壓現(xiàn)象,即入隊(duì)快而出隊(duì)慢,并且會(huì)造成惡性循環(huán)使系統(tǒng)性能持續(xù)降低,針對(duì)這種情況制定一個(gè)限度,當(dāng)隊(duì)列中的文件數(shù)達(dá)到此限度,則停止入隊(duì),即把新生成的XML文件丟棄。
5 結(jié)語(yǔ)
利用上述方法解決了一個(gè)站點(diǎn)式遠(yuǎn)程監(jiān)控系統(tǒng)的數(shù)據(jù)傳輸問(wèn)題,使原本錯(cuò)綜復(fù)雜地、多種格式數(shù)據(jù)相互收發(fā)控制變得邏輯簡(jiǎn)單、層次分明、實(shí)現(xiàn)方便、安全可靠、穩(wěn)定高效。經(jīng)實(shí)際應(yīng)用和測(cè)試,該方法是完全可行的,效果很好。
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1926瀏覽量
64690 -
監(jiān)控系統(tǒng)
+關(guān)注
關(guān)注
21文章
3932瀏覽量
175534 -
局域網(wǎng)
+關(guān)注
關(guān)注
5文章
760瀏覽量
46318
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論