董國法,李文慶,宋苗苗,苗斌,王文彥
(山東省科學院海洋儀器儀表研究所,山東青島,266001)
Qt是一個跨平臺的C++圖形用戶界面應用程序框架,它為應用程序開發者提供建立藝術級圖形用戶界面所需的所有功能。它是完全面向對象的,很容易擴展,并且允許真正的組件編程,優勢包括優良的跨平臺特性、面向對象、豐富的API、國際化等[1]。
傳統工具包使用一種被稱作回調的通訊方式,首先它們不是類型安全的,不能確定處理函數使用了正確的參數來回調,因此容易造成進程崩潰。另外一個問題是,回調這種方式緊緊地綁定了圖形用戶接口的功能元素,因而很難把開發進行獨立的分類。Qt提供了信號與槽機制,它是一種類型安全的高級接口,應用于對象之間的通信。

圖1 通訊過程示意圖
串口和網絡通信又是開發的主要內容之一,本文基于win7 64 + Qt Creator5.5 + MinGW4.9.2開發環境,采用面向對象編程(object oriented programming,OOP)思想,對如何開發TCP網絡程序和串口通信進行了研究,監視協議交互數據,一方面是數據內容,另一方面是協議交互。
TCP協議能夠為應用程序提供可靠的通信連接,使發出的字節流無差錯地送達網絡上的計算機。Qt QNetwork模塊提供的類允許編寫TCP/IP Clients和Servers以及FTP和HTTP協 議,而QTcpSocket和QTcpServer類則是實現TCP客戶端和服務器用的,網絡通訊流程如圖2所示。

圖2 服務端和客戶端的交互時序
采用兩套socket套接字,一套連接基于GPRS數據通信網絡的DTU無線數據終端,發送到服務端;另一套連接到服務端,將回執發送回DTU無線數據終端,可以根據實際需求控制回執信息是否轉發[8]。消息通信采用JSON數據格式,QJsonValue類為TCP通信的參數傳遞類,方便封裝和解析消息。創建轉發任務,不同于以往的大部分都是點對點的一對一傳輸,本模式支持自定義,一對一、一對多、多對多模式,多端口同時在線,有效的處理復雜的數據量。為支持7*24小時無人值守,采用定時器定時重連,掉線時發出disconnect()信號,1分鐘重連一次,直到連接上為止,socket轉發原理結構如圖3所示。

圖3 socket轉發原理結構示意圖
北斗衛星導航系統是中國自行研制的全球衛星定位與通信系統(CNSS),是相繼于美國的GPS和俄羅斯的GLONASS之后第三個具有成熟運營能力的通訊衛星導航系統,北斗衛星通訊是特有的短報文模式,通信的可靠性較高[10]。根據北斗終端接口協議,除去包頭和包尾校驗,民用的北斗每次可載數據量最多為78個字節,并且同一終端發送兩條數據包之間必須相隔一分鐘[3]。海洋監測數據包含氣壓、氣溫、濕度、雨量、輻射、能見度等氣象要素,波浪高度、波浪周期、波向的海浪要素,多層流速、流向的海流要素,風速和風向要素,水溫、鹽度、電導率等水質要素,設備傳感器報警狀態,壓縮到78字節非常困難,所以對采集數據進行了壓縮編碼并分包發出[6]。串口通信是9針RS-232接口,應用QSerialPort模塊,封裝串口有關的操作,自動檢測計算機串口號,波特率默認19200bps,8bit數據位,1bit停止位,無校驗位,具備串口助手功能。在實際調試中遇到了一條數據分多次拋出,尤其在北斗通訊機數量多,發送時間頻率高導致數據量特大的時候會出現接收數據不完整現象,這是因為串口是異步收發,而默認情況下QSerialPort沒有對串口收進行阻塞,解決方法是在接收槽開一個定時器,增加延時接收功能,把多次讀取的數據增加到緩沖區,一般設置為最大1024字節,延時結束,一次性讀取,保證了每次收到的數據都是完整數據,而不是脫節的,最后調用北斗轉網絡發送函數,遍歷存儲去向IP和端口的QMap
相比與其他協議如HTTP協議,FTP協議要復雜一些。與一般的C/S應用不同點在于一般的C/S應用程序只會建立一個Socket連接,這個連接同時處理服務器和客戶端的連接命令和數據傳輸,而FTP中將命令與數據分開傳送的方法提高了效率。FTP是TCP/IP網絡上兩臺計算機傳送文件的協議,工作在OSI模型的第七層,TCP模型的第四層,即應用層,其連接是可靠的,傳輸是面向連接的,所以能為數據傳輸提供可靠地保障。FTP服務使用兩個端口21(命令端口)和20(數據端口),端口20用于在客戶端和服務端之間傳輸數據流,而端口21用于傳輸控制流。
以國家海洋局、中國氣象局為應用主體的往往都有自身的信息系統監測平臺,上級數據中心將資源整合,進行數據的系統分析和利用,而數據落地后如何把XML文件、文本文件自動的上傳到服務端[7],真正有效的實現自動無人監管和智能化,成為了必須要解決的問題,而本通信協議傳輸正可以滿足實際需求。首先是連接服務器,設置參數包括服務器IP地址,用戶名和密碼開始連接,端口默認為21,連接流程圖如圖4所示。

圖4 連接流程圖
其中網絡請求由QNetworkRequest類來表示,作為與請求有關的信息的統一容器,在創建請求對象時指定的URL決定了請求使用的協議;QNetworkAccessManager用于協調網絡操作,每當一個請求創建后,用來調度它,并發送信號來報告進度;而對于網絡請求的應答則使用QNetworkReply,它會在請求被完成調度時創建。由此便可實現指定路徑特定文件的上傳。
觀測數據平均每10min向接收岸站發送一次,7*24小時不間斷運行,文本流QTextStream提供了方便的接口來讀寫文本文件,顯示和保存收到的原始報文數據,能夠獲取來源IP地址、日期時間和報文長度,按天模式寫入txt文本,保證了原始報文存儲。特殊情況下,工具欄上的文件按鈕,可選中所需的文本文件來動態監視,QFileSystemWatcher類是一個文件監視器,提供用于監控文件和目錄進行修改的接口,當監視的文件被修改時,發出信號,同時記錄偏移量currentPos位置,即可通過配置的訪問ip地址、端口號的網絡方式將最新數據包發送到服務端。數據采集控制器每十分鐘統計一組各參數的平均值自容存儲在主存儲器CF卡和備存儲器優盤內,存儲器中的數據文件為一個月一個文件,文件監視器會按照回車換行為分隔符將報文一行一行的分隔開,然后每秒一次將報文轉發到服務端,便于部門數據恢復及數據處理。
除此以外還具備歷史數據列表查詢、數據導出Excel報表功能,數據操作方面的技術采用多線程并行運行的設計思想,使用QEventLoop創建子事件循環,在子事件循環中父事件循環仍然可以執行,提高了程序的運行效率,同時也避免了程序在處理數據時阻塞線程,大量占用CPU[12]。
根據數據庫大小可分為大型和小型數據庫,在Windows平臺下,兼容好并且開發程度高就屬微軟旗下的兩款數據庫系統Microsoft SQL Server和ACCESS。但ACCESS是一種小型數據庫,適合存儲較少的數據量,理論上在幾百兆左右,如果數據量再變大可能會出現反應遲鈍現象,并且沒有自帶的日志系統,不能記錄針對數據庫的所有操作。
Microsoft SQL Server 2008是一種關系型數據庫系統。作為新一代的數據平臺產品,不僅延續現有數據數據平臺的強大能力,全面支持云技術與平臺,并且能夠快速構建相應的解決方案,實現私有云與公有云之間數據的擴展與應用的遷移[2]。
Qt建立了不同的數據庫驅動,這些驅動會調用相應DBMS的編程接口對數據庫進行操作。在使用QODBC的時候有兩種連接方式,手動設置ODBC數據源和DSN字符串,需要注意的是對于express版本數據庫,需加\sqlexpress后綴,最后通過SQL Server的結構化查詢語言完成對數據庫的訪問和操作。
早期的業務系統繁多,存在一定的數據信息孤島現象,無論在技術上還是人力上均給運維管理人員帶來較大挑戰。隨著數據庫同步現象越來越普遍,研究數據庫同步在理論和實際應用上都有非常重要的意義,是分布式環境中的一項關鍵技術[9]。
(1)直接同步
SQL Server數據庫同步是項目中常用到的環節,致力于解決異構數據庫間復雜的交互操作,若一個項目中的數據同時存在于不同的數據庫服務器中,而這些數據庫需要被多個不同的網域調用時,配置發布/訂閱是一個比較好的解決方案,具體實施步驟如下:
發布:找到數據庫服務下的【復制】--【本地發布】,選擇【新建發布】;選擇待發布的數據庫,選擇發布類型,這里選擇的默認類型【快照發布】,設置快照代理,設置代理安全性,填寫發布名稱,完成發布。
訂閱:找到數據庫服務器下的【復制】--【本地訂閱】,選擇【新建訂閱】,選擇訂閱的發布,選擇分發代理的位置,選擇訂閱服務器上的存放同步過來的數據的一個或者多個目標數據庫,設置分發代理的安全性,設置同步計劃,完成訂閱。
在實際應用中,從專業的角度分析,發布/訂閱技術存在一定的缺陷,同步雙方的表結構不能更改,并且表結構必須一致,一旦發布方數據庫表結構發生更改需要重新生成數據庫快照。對于大數據量的同步缺乏可靠的保證,其中主要原因是大數據量的數據同步過程不具備可靠的通信鏈路,造成訂閱數據庫與源數據庫之間數據傳輸延時問題[5]。
(2)間接同步
利用第三方偉思信安數據庫同步系統,調試日志實時輸出,著重研究網絡之間安全接入、安全隔離、安全交換技術,配置管理簡單、運行可靠,保證數據時效性和一致性,是一款可信邊界安全數據交換平臺[4],本系統已應用在移動互聯網的項目體系當中,運行過程良好,是其他業務系統的底層支撐,如圖5所示。

圖5 數據庫實時同步
2019年6月1日-2020年9月26日,在福建附近港口碼頭進行實驗,數據每10分鐘傳送一次,取三個10米大浮標的實驗數據。如表1所示,1號大標接收率為98%,2號大標接收率為97.1%,3號大標接收率為97.2%,考慮到設備實際接收率一般要求達到95%,如結果所示,本系統完全能夠滿足數據接收率的要求。

表1 數據處理實驗結果
本系統可以進行十六進制和ASCII數據收發,具備定時器定時重連,支持一對一、一對多、多對多連接并發,采用FTP傳輸,讀寫文本文件及磁盤處理,利用分布式SQL Server數據庫操作,同時支持在局域網、廣域網、互聯網訪問。
軟件遵循模塊化來設計,對系統的升級和二次開發是有利的,后期可根據實際需求增加實用功能,如曲線分析、GIS海圖定位繪制、InterView框架等等,提高軟件存活周期。
保持網絡定時重連的方法,并使用跨平臺QT C++程序框架實現,使得本應用可用于所有操作系統平臺下,不僅提高了網絡的可靠性,更大大提高了程序擴展性,是服務器與客戶端之間通信的優秀解決方案。保證數據能夠長期、穩定、連續的接收,傳輸處理更加及時,并且具備智能管理功能,比如信息幀長度可變、遠程站點的優先級控制等等[11],提高強化觀測能力,推動海洋行業應用的發展和基礎研究水平。