李貴元,何思源,鐘李彬,劉華姣,徐文海
(四川省地震局成都地震基準臺,四川 成都 611730)
《地震前兆臺網(wǎng)專用設備網(wǎng)絡通信》規(guī)定了中國地震前兆臺網(wǎng)專用設備基于以太網(wǎng)接口網(wǎng)絡化功能的技術要求,包括前兆臺網(wǎng)專用設備的通信接口、設備信息、運行功能、數(shù)據(jù)格式、通信協(xié)議和訪問安全控制的約定,以太網(wǎng)接口是設備通信的必備標準接口。規(guī)程是“中國數(shù)字地震觀測網(wǎng)絡”分項“中國地震前兆臺網(wǎng)”之《中國地震前兆臺網(wǎng)技術規(guī)程》的組成部分,適用于“中國地震前兆臺網(wǎng)”建設。地震前兆臺網(wǎng)設備是指可用于測量重力、地磁、地殼形變、地電和地下流體各個學科的觀測對象的設備以及臺站輔助觀測設備。地震前兆設備接口軟件的設計需嚴格遵守地震前兆臺網(wǎng)專用設備網(wǎng)絡通信規(guī)定,主要針對地電和地磁的設備接入進行研究。本文主要采用基于TCP/IP協(xié)議的SOCKET連接技術,設計能夠在行業(yè)網(wǎng)絡環(huán)境下實現(xiàn)對儀器控制與參數(shù)讀取的接口軟件,主要功能有收集測量數(shù)據(jù)、設定工作參數(shù)、查看狀態(tài)信息、調取工作日志等。軟件數(shù)據(jù)通信通過以太網(wǎng)、采用基于TCP/IP協(xié)議的SOCKET連接的前兆臺網(wǎng)專用設備與客戶端的數(shù)據(jù)信息交換。客戶端通過上傳命令字和相關參數(shù),設備端解析原語后執(zhí)行相應動作,返回執(zhí)行結果。接口軟件可在地震前兆設備調試、教學實踐、儀器故障原因判定等工作中應用。
圖1 前兆設備網(wǎng)絡連接示意圖
成都地震臺有GM-4磁通門磁力儀、FHDZ-M15自動化地磁臺站系統(tǒng)、ZD8M地電儀、ZD9A地電場儀等數(shù)字化前兆設備,各前兆設備的網(wǎng)絡連接如圖1所示。成都地震臺作為地球物理學實踐教育基地,承擔教學實踐的工作,如何在實習教學中,對重力、地磁、地電儀器狀態(tài)信息進行教學演示,使實踐人員更清楚設備如何進行通信、如何進行數(shù)據(jù)傳輸以及在故障中如何對指定IP地址的服務器告警,了解SNTP協(xié)議在儀器校時的工作機制具有重要意義。前兆設備接口軟件主要從儀器數(shù)據(jù)、儀器參數(shù)、參數(shù)設置等幾方面進行設計,使軟件能應用于監(jiān)測人員與設備交互的日常工作之中,輔助監(jiān)測人員深入了解前兆儀器在通信、數(shù)據(jù)存儲、遠程控制等方面的原理。
軟件主要通過TCP/IP協(xié)議連接前兆設備,對每一套接入的設備分配對應內(nèi)存和軟件資源,利用Socket(IP:Port)對設備發(fā)起連接請求,儀器做出應答,使用設置好的用戶名和密碼登陸設備。軟件依照規(guī)程的協(xié)議實現(xiàn)監(jiān)測數(shù)據(jù)、工作參數(shù)、設備告警、參數(shù)設定(何案華等,2008)等4個模塊。軟件流程圖如圖2所示。考慮到連接設備時,設備同時也承擔著數(shù)據(jù)采集任務,規(guī)程規(guī)定在連接儀器30 s后沒有操作,連接自動斷開,以保障整個觀測系統(tǒng)的穩(wěn)定運行。在軟件設計中,各個功能操作應在登錄后30 s內(nèi)完成操作,若需要持續(xù)連接,可以考慮以合法的空操作指令作為心跳幀,在30 s內(nèi)向設備發(fā)起請求來維持連接。在讀取監(jiān)測數(shù)據(jù)時,存在數(shù)據(jù)量過大的問題,對于秒采樣的磁通門磁力儀單測項的數(shù)據(jù)量一天是86 400字節(jié)(王秀英等,2009),在同時讀取15天的數(shù)據(jù)時要考慮速度較慢的問題。在數(shù)據(jù)傳輸過程中,軟件發(fā)送數(shù)據(jù)傳輸指令,設備端響應數(shù)據(jù)傳輸命令,依據(jù)命令將相應的測量數(shù)據(jù)發(fā)送到接口軟件(王秀英等,2008)。軟件再接收數(shù)據(jù)進行數(shù)據(jù)處理。獲取工作參數(shù)、告警信息、設定儀器參數(shù)功能與數(shù)據(jù)傳輸過程類似。
圖2 通用接口軟件流程圖
在連接設備中,值得注意的是,在設備連接中一定要保證正確的設備ID號和上位機運行所應用的端口號。根據(jù)規(guī)程,設備ID由12個字符表示,一般前4個字符為“X”加設備的測項代碼,中間4個字符為廠家自定義標志,后4個字符為設備序列號。測項代碼遵照《地震及地震前兆測項分類與代碼(DB/T 3-2011)》的規(guī)定,設備序列號由4個阿拉伯數(shù)字組成。連接成功后使用缺省的用戶名和密碼即可登錄設備。在選用Socket時,主要比較了CAsyncSocket類和CSocket類之間的區(qū)別,其中在CAsyncSocket類中逐個封裝了WinSock API,這個類基于非常了解網(wǎng)絡通信,目的是為了在MFC中使用WinSock,開發(fā)者有能力處理諸如阻塞、字節(jié)順序和在Unicode與MBCS間轉換字符的任務。提供更方便的接口以自動處理這些任務,CSocket類是由CAsyncSocket類繼承下來的,它提供了比CAsyncSocket類更高的WinSock API接口。CSocket類和CSocketFile類可以與CArchive類合作起來管理發(fā)送和接收的數(shù)據(jù),這使得管理數(shù)據(jù)收發(fā)更加便利。CAsyncSocket類是異步通信,CSocket類是同步通信;前者是非阻塞模式,后者是阻塞模式。CAsyncSocket類異步效率高,但是更容易出錯,而內(nèi)置了多線程機制的CSocket類能夠保證數(shù)據(jù)的順序交付,提高了效率。在接口軟件的設計中,最終采用了CSocket類作為核心組件實現(xiàn)與前兆設備的數(shù)據(jù)收發(fā)管理機制。
數(shù)據(jù)傳輸協(xié)議采用基于SOCKET連接的HTTP(Hyper Text Transfer Protocol)協(xié)議,支持指令方式和網(wǎng)頁方式。本文中僅使用了指令方式,通信協(xié)議采用的是HTTP 1.1版本,相較于HTTP 1.0,HTTP 1.1支持持久連接,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲,允許客戶端不用等待上一次請求結果返回就可發(fā)送下一次請求,能有效降低系統(tǒng)交互時間,提高效率??蛻舳税l(fā)送一個請求消息到設備端包含請求行、請求頭部、空行和請求數(shù)據(jù)4個部分(見圖3)。使用HTTP請求消息結構分析來解析用戶登錄設備過程,用戶登錄設備端的協(xié)議定義如圖4所示。
圖3 HTTP請求消息結構
圖4 用戶登錄協(xié)議結構
使用HTTP的GET請求,前兩個字段分別為請求方法名和固定的空格,第三個字段是除指令原語固有格式外指令的字節(jié)數(shù)總和,ID字段需要的唯一的設備ID參數(shù),lin字段是命令字,表示協(xié)議功能,取login的lin為用戶登錄功能,username和password表示用戶登錄的參數(shù)。最后為固定格式空格加上協(xié)議版本號。客戶端發(fā)送請求后,設備端驗證登錄連接正常,返回$ack 。驗證登錄連接不正常,返回$nak 。若儀器端接收到錯誤指令,返回$err 。對于更復雜一點的協(xié)議,協(xié)議的固定格式還是一致,唯一的區(qū)別在于參數(shù)列表發(fā)生了變化,比如獲取整體觀測數(shù)據(jù),最多可以獲取15天的觀測數(shù)據(jù),協(xié)議結構如圖5所示。
圖5 獲取整體測量數(shù)據(jù)協(xié)議結構
協(xié)議的主體結構與上一協(xié)議一致,此處不再贅述,主要分析協(xié)議功能和參數(shù)列表,該協(xié)議的命令字是dat,表示功能為獲取觀測數(shù)據(jù),n是獲取數(shù)據(jù)的天數(shù),最大取值為15,只能獲取的觀測數(shù)據(jù)為15天,day0即獲取當天的數(shù)據(jù),day1為前一天數(shù)據(jù),以此類推。雖m可以取值到255,但最多到day14為有效參數(shù)。在客戶端發(fā)出請求后,正常執(zhí)行返回信息格式,格式為:$第一個數(shù)據(jù)包信息長度 第一個數(shù)據(jù)包內(nèi)容 第二個數(shù)據(jù)包信息長度 第二個數(shù)據(jù)包內(nèi)容 ……最后一個數(shù)據(jù)包信息長度 最后一個數(shù)據(jù)包內(nèi)容 ack 。其中$為返回信息起始符。信息長度是指數(shù)據(jù)包的具體內(nèi)容的字節(jié)總數(shù),不含“信息長度”本身和以“ ”表示的分隔符。數(shù)據(jù)包內(nèi)容是以天為單位的測量數(shù)據(jù), 為換行符,用于分隔各個信息。若數(shù)據(jù)傳輸參數(shù)指定的某天數(shù)據(jù)不存在,則將對應天的數(shù)據(jù)包信息長度置為0,不傳輸該天數(shù)據(jù)包內(nèi)容。若儀器端接收到錯誤指令,返回$err 。
使用了封裝的SocketClient實現(xiàn)數(shù)據(jù)通信,分別設置了Socket連接、Socket重新連接、Socket斷開連接等函數(shù)。在新建的線程中間接收并分發(fā)數(shù)據(jù)給指定的函數(shù)處理。下例是線程中處理數(shù)據(jù)的代碼:
DWORD WINAPI MyThreadFunction1(LPVOID lpParam)
{
SocketClient* c = (SocketClient*)lpParam; //取得SocketClient類的對象
memset(recvBuff, 0, sizeof(recvBuff));
while (c->isConnected){ //連接可用的時候
int ret, num = 100, err;
ret = recv(c->sockClient, recvBuff, num, 0); //接收Socket數(shù)據(jù)
if (ret == SOCKET_ERROR)
{
err = WSAGetLastError();
if (err == WSAEWOULDBLOCK)
{ continue; }
else if (err == WSAETIMEDOUT){} //超時。
else if (err == WSAENETDOWN){} //連接斷開。
else //其他錯誤。
break;
}
else {
isGetData = TRUE;
//break; //接受成功,退出線程
}
}
return 0;
}
數(shù)據(jù)發(fā)送模塊使用的發(fā)送函數(shù)的代碼:
int SocketClient::sendData(char *data, int length)
{
hThread1 = CreateThread( // 開啟接收線程
NULL, // 默認安全屬性
0, // 使用默認棧大小
MyThreadFunction1, // 線程函數(shù)名稱
this, // 線程函數(shù)參數(shù)
0, // 使用默認創(chuàng)建標志
NULL); // 返回函數(shù)標識符
int res = send(this->sockClient, data, length, 0); //數(shù)據(jù)發(fā)送
return res;
}
圖6 軟件主界面
前兆設備接口軟件主要分為4個模塊(見圖6),分別是數(shù)據(jù)獲取、設備控制、設備監(jiān)視、工作參數(shù)。首先是Socket連接設備,連接成功后,才能使用賬號信息登錄設備。之后才能實現(xiàn)對設備的管理控制。
軟件使用了臺站代碼為51×××、設備ID為3120IGEA××××的崇州地震臺的GM-4磁通門磁力儀為例,對軟件進行測試,該軟件完成了預期的效果,能夠獲取準確的設備狀態(tài)信息、設備網(wǎng)絡參數(shù)以及相應的各項功能。圖7、圖8為軟件在獲取設備信息的測試情形。
圖7 設備狀態(tài)信息獲取
圖8 設備網(wǎng)絡參數(shù)獲取
在使用地震觀測網(wǎng)絡技術規(guī)程開發(fā)前兆設備接口軟件中,有以下幾點認識:(1)地震前兆設備支持多種傳輸協(xié)議,實現(xiàn)了FTP,HTTP1.1等通用的應用層傳輸協(xié)議,為用戶多渠道獲取觀測數(shù)據(jù)提供了方法。(2)地震觀測網(wǎng)絡技術規(guī)程為前兆設備遠程監(jiān)控提供了解決方案,可以實現(xiàn)多平臺、多終端的數(shù)據(jù)監(jiān)控和故障處理判定。(3)地震接口軟件的實現(xiàn)為Android/iOS移動設備接入地震專用儀器驗證了技術可行性,為地震數(shù)據(jù)在移動終端展示提供了解決方案。(4)本次研制的接口軟件能夠獲取設備的狀態(tài)信息、網(wǎng)絡信息、供電狀況,能在設備原理案例學習、儀器故障判定等工作中發(fā)揮作用,以期前兆設備接口軟件能在后續(xù)工作中有更大范圍的推廣應用。