董國法,李文慶,宋苗苗,苗斌,王文彥
(山東省科學(xué)院海洋儀器儀表研究所,山東青島,266001)
Qt是一個跨平臺的C++圖形用戶界面應(yīng)用程序框架,它為應(yīng)用程序開發(fā)者提供建立藝術(shù)級圖形用戶界面所需的所有功能。它是完全面向?qū)ο蟮?,很容易擴(kuò)展,并且允許真正的組件編程,優(yōu)勢包括優(yōu)良的跨平臺特性、面向?qū)ο?、豐富的API、國際化等[1]。
傳統(tǒng)工具包使用一種被稱作回調(diào)的通訊方式,首先它們不是類型安全的,不能確定處理函數(shù)使用了正確的參數(shù)來回調(diào),因此容易造成進(jìn)程崩潰。另外一個問題是,回調(diào)這種方式緊緊地綁定了圖形用戶接口的功能元素,因而很難把開發(fā)進(jìn)行獨(dú)立的分類。Qt提供了信號與槽機(jī)制,它是一種類型安全的高級接口,應(yīng)用于對象之間的通信。
圖1 通訊過程示意圖
串口和網(wǎng)絡(luò)通信又是開發(fā)的主要內(nèi)容之一,本文基于win7 64 + Qt Creator5.5 + MinGW4.9.2開發(fā)環(huán)境,采用面向?qū)ο缶幊?object oriented programming,OOP)思想,對如何開發(fā)TCP網(wǎng)絡(luò)程序和串口通信進(jìn)行了研究,監(jiān)視協(xié)議交互數(shù)據(jù),一方面是數(shù)據(jù)內(nèi)容,另一方面是協(xié)議交互。
TCP協(xié)議能夠?yàn)閼?yīng)用程序提供可靠的通信連接,使發(fā)出的字節(jié)流無差錯地送達(dá)網(wǎng)絡(luò)上的計算機(jī)。Qt QNetwork模塊提供的類允許編寫TCP/IP Clients和Servers以及FTP和HTTP協(xié) 議,而QTcpSocket和QTcpServer類則是實(shí)現(xiàn)TCP客戶端和服務(wù)器用的,網(wǎng)絡(luò)通訊流程如圖2所示。
圖2 服務(wù)端和客戶端的交互時序
采用兩套socket套接字,一套連接基于GPRS數(shù)據(jù)通信網(wǎng)絡(luò)的DTU無線數(shù)據(jù)終端,發(fā)送到服務(wù)端;另一套連接到服務(wù)端,將回執(zhí)發(fā)送回DTU無線數(shù)據(jù)終端,可以根據(jù)實(shí)際需求控制回執(zhí)信息是否轉(zhuǎn)發(fā)[8]。消息通信采用JSON數(shù)據(jù)格式,QJsonValue類為TCP通信的參數(shù)傳遞類,方便封裝和解析消息。創(chuàng)建轉(zhuǎn)發(fā)任務(wù),不同于以往的大部分都是點(diǎn)對點(diǎn)的一對一傳輸,本模式支持自定義,一對一、一對多、多對多模式,多端口同時在線,有效的處理復(fù)雜的數(shù)據(jù)量。為支持7*24小時無人值守,采用定時器定時重連,掉線時發(fā)出disconnect()信號,1分鐘重連一次,直到連接上為止,socket轉(zhuǎn)發(fā)原理結(jié)構(gòu)如圖3所示。
圖3 socket轉(zhuǎn)發(fā)原理結(jié)構(gòu)示意圖
北斗衛(wèi)星導(dǎo)航系統(tǒng)是中國自行研制的全球衛(wèi)星定位與通信系統(tǒng)(CNSS),是相繼于美國的GPS和俄羅斯的GLONASS之后第三個具有成熟運(yùn)營能力的通訊衛(wèi)星導(dǎo)航系統(tǒng),北斗衛(wèi)星通訊是特有的短報文模式,通信的可靠性較高[10]。根據(jù)北斗終端接口協(xié)議,除去包頭和包尾校驗(yàn),民用的北斗每次可載數(shù)據(jù)量最多為78個字節(jié),并且同一終端發(fā)送兩條數(shù)據(jù)包之間必須相隔一分鐘[3]。海洋監(jiān)測數(shù)據(jù)包含氣壓、氣溫、濕度、雨量、輻射、能見度等氣象要素,波浪高度、波浪周期、波向的海浪要素,多層流速、流向的海流要素,風(fēng)速和風(fēng)向要素,水溫、鹽度、電導(dǎo)率等水質(zhì)要素,設(shè)備傳感器報警狀態(tài),壓縮到78字節(jié)非常困難,所以對采集數(shù)據(jù)進(jìn)行了壓縮編碼并分包發(fā)出[6]。串口通信是9針RS-232接口,應(yīng)用QSerialPort模塊,封裝串口有關(guān)的操作,自動檢測計算機(jī)串口號,波特率默認(rèn)19200bps,8bit數(shù)據(jù)位,1bit停止位,無校驗(yàn)位,具備串口助手功能。在實(shí)際調(diào)試中遇到了一條數(shù)據(jù)分多次拋出,尤其在北斗通訊機(jī)數(shù)量多,發(fā)送時間頻率高導(dǎo)致數(shù)據(jù)量特大的時候會出現(xiàn)接收數(shù)據(jù)不完整現(xiàn)象,這是因?yàn)榇谑钱惒绞瞻l(fā),而默認(rèn)情況下QSerialPort沒有對串口收進(jìn)行阻塞,解決方法是在接收槽開一個定時器,增加延時接收功能,把多次讀取的數(shù)據(jù)增加到緩沖區(qū),一般設(shè)置為最大1024字節(jié),延時結(jié)束,一次性讀取,保證了每次收到的數(shù)據(jù)都是完整數(shù)據(jù),而不是脫節(jié)的,最后調(diào)用北斗轉(zhuǎn)網(wǎng)絡(luò)發(fā)送函數(shù),遍歷存儲去向IP和端口的QMap
相比與其他協(xié)議如HTTP協(xié)議,F(xiàn)TP協(xié)議要復(fù)雜一些。與一般的C/S應(yīng)用不同點(diǎn)在于一般的C/S應(yīng)用程序只會建立一個Socket連接,這個連接同時處理服務(wù)器和客戶端的連接命令和數(shù)據(jù)傳輸,而FTP中將命令與數(shù)據(jù)分開傳送的方法提高了效率。FTP是TCP/IP網(wǎng)絡(luò)上兩臺計算機(jī)傳送文件的協(xié)議,工作在OSI模型的第七層,TCP模型的第四層,即應(yīng)用層,其連接是可靠的,傳輸是面向連接的,所以能為數(shù)據(jù)傳輸提供可靠地保障。FTP服務(wù)使用兩個端口21(命令端口)和20(數(shù)據(jù)端口),端口20用于在客戶端和服務(wù)端之間傳輸數(shù)據(jù)流,而端口21用于傳輸控制流。
以國家海洋局、中國氣象局為應(yīng)用主體的往往都有自身的信息系統(tǒng)監(jiān)測平臺,上級數(shù)據(jù)中心將資源整合,進(jìn)行數(shù)據(jù)的系統(tǒng)分析和利用,而數(shù)據(jù)落地后如何把XML文件、文本文件自動的上傳到服務(wù)端[7],真正有效的實(shí)現(xiàn)自動無人監(jiān)管和智能化,成為了必須要解決的問題,而本通信協(xié)議傳輸正可以滿足實(shí)際需求。首先是連接服務(wù)器,設(shè)置參數(shù)包括服務(wù)器IP地址,用戶名和密碼開始連接,端口默認(rèn)為21,連接流程圖如圖4所示。
圖4 連接流程圖
其中網(wǎng)絡(luò)請求由QNetworkRequest類來表示,作為與請求有關(guān)的信息的統(tǒng)一容器,在創(chuàng)建請求對象時指定的URL決定了請求使用的協(xié)議;QNetworkAccessManager用于協(xié)調(diào)網(wǎng)絡(luò)操作,每當(dāng)一個請求創(chuàng)建后,用來調(diào)度它,并發(fā)送信號來報告進(jìn)度;而對于網(wǎng)絡(luò)請求的應(yīng)答則使用QNetworkReply,它會在請求被完成調(diào)度時創(chuàng)建。由此便可實(shí)現(xiàn)指定路徑特定文件的上傳。
觀測數(shù)據(jù)平均每10min向接收岸站發(fā)送一次,7*24小時不間斷運(yùn)行,文本流QTextStream提供了方便的接口來讀寫文本文件,顯示和保存收到的原始報文數(shù)據(jù),能夠獲取來源IP地址、日期時間和報文長度,按天模式寫入txt文本,保證了原始報文存儲。特殊情況下,工具欄上的文件按鈕,可選中所需的文本文件來動態(tài)監(jiān)視,QFileSystemWatcher類是一個文件監(jiān)視器,提供用于監(jiān)控文件和目錄進(jìn)行修改的接口,當(dāng)監(jiān)視的文件被修改時,發(fā)出信號,同時記錄偏移量currentPos位置,即可通過配置的訪問ip地址、端口號的網(wǎng)絡(luò)方式將最新數(shù)據(jù)包發(fā)送到服務(wù)端。數(shù)據(jù)采集控制器每十分鐘統(tǒng)計一組各參數(shù)的平均值自容存儲在主存儲器CF卡和備存儲器優(yōu)盤內(nèi),存儲器中的數(shù)據(jù)文件為一個月一個文件,文件監(jiān)視器會按照回車換行為分隔符將報文一行一行的分隔開,然后每秒一次將報文轉(zhuǎn)發(fā)到服務(wù)端,便于部門數(shù)據(jù)恢復(fù)及數(shù)據(jù)處理。
除此以外還具備歷史數(shù)據(jù)列表查詢、數(shù)據(jù)導(dǎo)出Excel報表功能,數(shù)據(jù)操作方面的技術(shù)采用多線程并行運(yùn)行的設(shè)計思想,使用QEventLoop創(chuàng)建子事件循環(huán),在子事件循環(huán)中父事件循環(huán)仍然可以執(zhí)行,提高了程序的運(yùn)行效率,同時也避免了程序在處理數(shù)據(jù)時阻塞線程,大量占用CPU[12]。
根據(jù)數(shù)據(jù)庫大小可分為大型和小型數(shù)據(jù)庫,在Windows平臺下,兼容好并且開發(fā)程度高就屬微軟旗下的兩款數(shù)據(jù)庫系統(tǒng)Microsoft SQL Server和ACCESS。但ACCESS是一種小型數(shù)據(jù)庫,適合存儲較少的數(shù)據(jù)量,理論上在幾百兆左右,如果數(shù)據(jù)量再變大可能會出現(xiàn)反應(yīng)遲鈍現(xiàn)象,并且沒有自帶的日志系統(tǒng),不能記錄針對數(shù)據(jù)庫的所有操作。
Microsoft SQL Server 2008是一種關(guān)系型數(shù)據(jù)庫系統(tǒng)。作為新一代的數(shù)據(jù)平臺產(chǎn)品,不僅延續(xù)現(xiàn)有數(shù)據(jù)數(shù)據(jù)平臺的強(qiáng)大能力,全面支持云技術(shù)與平臺,并且能夠快速構(gòu)建相應(yīng)的解決方案,實(shí)現(xiàn)私有云與公有云之間數(shù)據(jù)的擴(kuò)展與應(yīng)用的遷移[2]。
Qt建立了不同的數(shù)據(jù)庫驅(qū)動,這些驅(qū)動會調(diào)用相應(yīng)DBMS的編程接口對數(shù)據(jù)庫進(jìn)行操作。在使用QODBC的時候有兩種連接方式,手動設(shè)置ODBC數(shù)據(jù)源和DSN字符串,需要注意的是對于express版本數(shù)據(jù)庫,需加\sqlexpress后綴,最后通過SQL Server的結(jié)構(gòu)化查詢語言完成對數(shù)據(jù)庫的訪問和操作。
早期的業(yè)務(wù)系統(tǒng)繁多,存在一定的數(shù)據(jù)信息孤島現(xiàn)象,無論在技術(shù)上還是人力上均給運(yùn)維管理人員帶來較大挑戰(zhàn)。隨著數(shù)據(jù)庫同步現(xiàn)象越來越普遍,研究數(shù)據(jù)庫同步在理論和實(shí)際應(yīng)用上都有非常重要的意義,是分布式環(huán)境中的一項關(guān)鍵技術(shù)[9]。
(1)直接同步
SQL Server數(shù)據(jù)庫同步是項目中常用到的環(huán)節(jié),致力于解決異構(gòu)數(shù)據(jù)庫間復(fù)雜的交互操作,若一個項目中的數(shù)據(jù)同時存在于不同的數(shù)據(jù)庫服務(wù)器中,而這些數(shù)據(jù)庫需要被多個不同的網(wǎng)域調(diào)用時,配置發(fā)布/訂閱是一個比較好的解決方案,具體實(shí)施步驟如下:
發(fā)布:找到數(shù)據(jù)庫服務(wù)下的【復(fù)制】--【本地發(fā)布】,選擇【新建發(fā)布】;選擇待發(fā)布的數(shù)據(jù)庫,選擇發(fā)布類型,這里選擇的默認(rèn)類型【快照發(fā)布】,設(shè)置快照代理,設(shè)置代理安全性,填寫發(fā)布名稱,完成發(fā)布。
訂閱:找到數(shù)據(jù)庫服務(wù)器下的【復(fù)制】--【本地訂閱】,選擇【新建訂閱】,選擇訂閱的發(fā)布,選擇分發(fā)代理的位置,選擇訂閱服務(wù)器上的存放同步過來的數(shù)據(jù)的一個或者多個目標(biāo)數(shù)據(jù)庫,設(shè)置分發(fā)代理的安全性,設(shè)置同步計劃,完成訂閱。
在實(shí)際應(yīng)用中,從專業(yè)的角度分析,發(fā)布/訂閱技術(shù)存在一定的缺陷,同步雙方的表結(jié)構(gòu)不能更改,并且表結(jié)構(gòu)必須一致,一旦發(fā)布方數(shù)據(jù)庫表結(jié)構(gòu)發(fā)生更改需要重新生成數(shù)據(jù)庫快照。對于大數(shù)據(jù)量的同步缺乏可靠的保證,其中主要原因是大數(shù)據(jù)量的數(shù)據(jù)同步過程不具備可靠的通信鏈路,造成訂閱數(shù)據(jù)庫與源數(shù)據(jù)庫之間數(shù)據(jù)傳輸延時問題[5]。
(2)間接同步
利用第三方偉思信安數(shù)據(jù)庫同步系統(tǒng),調(diào)試日志實(shí)時輸出,著重研究網(wǎng)絡(luò)之間安全接入、安全隔離、安全交換技術(shù),配置管理簡單、運(yùn)行可靠,保證數(shù)據(jù)時效性和一致性,是一款可信邊界安全數(shù)據(jù)交換平臺[4],本系統(tǒng)已應(yīng)用在移動互聯(lián)網(wǎng)的項目體系當(dāng)中,運(yùn)行過程良好,是其他業(yè)務(wù)系統(tǒng)的底層支撐,如圖5所示。
圖5 數(shù)據(jù)庫實(shí)時同步
2019年6月1日-2020年9月26日,在福建附近港口碼頭進(jìn)行實(shí)驗(yàn),數(shù)據(jù)每10分鐘傳送一次,取三個10米大浮標(biāo)的實(shí)驗(yàn)數(shù)據(jù)。如表1所示,1號大標(biāo)接收率為98%,2號大標(biāo)接收率為97.1%,3號大標(biāo)接收率為97.2%,考慮到設(shè)備實(shí)際接收率一般要求達(dá)到95%,如結(jié)果所示,本系統(tǒng)完全能夠滿足數(shù)據(jù)接收率的要求。
表1 數(shù)據(jù)處理實(shí)驗(yàn)結(jié)果
本系統(tǒng)可以進(jìn)行十六進(jìn)制和ASCII數(shù)據(jù)收發(fā),具備定時器定時重連,支持一對一、一對多、多對多連接并發(fā),采用FTP傳輸,讀寫文本文件及磁盤處理,利用分布式SQL Server數(shù)據(jù)庫操作,同時支持在局域網(wǎng)、廣域網(wǎng)、互聯(lián)網(wǎng)訪問。
軟件遵循模塊化來設(shè)計,對系統(tǒng)的升級和二次開發(fā)是有利的,后期可根據(jù)實(shí)際需求增加實(shí)用功能,如曲線分析、GIS海圖定位繪制、InterView框架等等,提高軟件存活周期。
保持網(wǎng)絡(luò)定時重連的方法,并使用跨平臺QT C++程序框架實(shí)現(xiàn),使得本應(yīng)用可用于所有操作系統(tǒng)平臺下,不僅提高了網(wǎng)絡(luò)的可靠性,更大大提高了程序擴(kuò)展性,是服務(wù)器與客戶端之間通信的優(yōu)秀解決方案。保證數(shù)據(jù)能夠長期、穩(wěn)定、連續(xù)的接收,傳輸處理更加及時,并且具備智能管理功能,比如信息幀長度可變、遠(yuǎn)程站點(diǎn)的優(yōu)先級控制等等[11],提高強(qiáng)化觀測能力,推動海洋行業(yè)應(yīng)用的發(fā)展和基礎(chǔ)研究水平。