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