王龍龍,周志峰
(上海工程技術大學 機械工程學院,上海 201600)
近年來,隨著全球衛星導航系統(global navigation satellite system,GNSS)技術在各個領域的深入應用,我國不斷完善連續運行衛星定位綜合服務系統的建設,許多城市建成了連續運行參考站(continuously operating reference stations,CORS)系統[1-2],CORS系統是由多個建立在地球上固定位置上的連續運行的衛星基準站利用數據處理單元、控制器、計算機、數據通信與數據傳輸技術組成網絡,能夠根據不同用戶、不同行業提供實施不同精度的定位導航技術等空間服務的綜合系統[3],涉及到全球衛星導航定位、測繪與地理信息、氣象、地質勘探等多個領域。CORS參考站是若干具有已知坐標的GNSS衛星數據觀測站構成的數據接收部分,其主要功能是對連續運行的衛星進行定位跟蹤、采集、記錄各種數據等,并且將數據的傳輸到數據管理中心;每個參考站由GNSS接收機、天線、不間斷電源、網絡傳輸設備等構成,所以接收機的穩定運行對于衛星的連續定位以及整個CORS系統起著至關重要的作用[4]。
在多基站的連續運行的衛星定位系統中,基站站點的布置位置分散,國內外接收機開發商目前難以實現對所有參考站衛星接收機的一次性升級:若要對接收機的固件、板卡或者前面板升級,只能逐臺接收機現場維護;雖然通過登錄網絡客戶端操作較為方便,但仍避免不了逐臺操作的局限性。這無疑增加了參考站的維護成本,降低了參考站后期的工作效率。本文研究開發參考站基站接收機批量維護升級工具,以期實現同時對多臺接收機通過文件傳輸協議(file transfer protocol,FTP)統一升級。
QT作為一種基于C++的跨平臺圖形用戶界面(graphical user interface,GUI)系統,能夠提供給用戶構造圖形用戶界面的較強功能,滿足用戶構造復雜圖形界面系統的需求[5]。作為目前主流的嵌入式GUI設計工具,為不影響界面的響應速度,引入了多線程技術,還有其多種線程的通信機制[6],給軟件開發帶來了很大優勢。
首先和多進程相比較,多線程具有開銷小、切換快的優點,同時,由于同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接為其他線程所用,這樣線程之間通信也就更加方便快捷;但是數據的共享也帶來一些問題,有些數據不能被同時修改。
其次,多線程能有效提高應用程序的響應速度,這對圖形界面的程序具有重要意義。當完成操作耗時比較長的任務時,傳統程序不會響應鍵盤、鼠標、菜單的操作;而使用多線程技術將耗時長的操作(time consuming)置于一個新的線程,則可以避免這種尷尬的情況,特別是在并行操作時,多線程能夠響應不同的操作請求,不至于出現操作堵塞。隨著多核多線程技術[7]的發展,對于多中央處理器(central processing unit,CPU)的系統,不同線程會在不同的CPU中運行,操作系統則會控制當前的線程數不大于CPU的數目,這樣也提高了CPU的運行效率。
QT中的線程主要分為用戶界面主線程和后臺的工作線程:主線程擔負著響應用戶輸入信息以及處理繪制圖形事件和消息的任務,在程序中,QWidget對象的創建意味著一個用戶界面主線程啟動,程序運行結束,也就線程終止;而后臺的工作線程也就是執行客戶所需求的任務線程,如相關計算、串口的讀寫等功能。它們二者最大的區別是主線程不是由QThread繼承而來,其最重要的是實現工作線程任務控制函數。工作線程和用戶界面主線程啟動時充分利用C++多態的特性,實現相同函數的不同版本。
QT中提供了4種多線程實現的方法,分別是繼承QThread、繼承QRunnable、使用moveToThrough將實現的目標代碼轉到新線程中運行,以及使用QTConcurrent:run啟動新的線程。在接收機批量升級工具的開發中使用了moveToThrough這種方法來實現多線程,可以將每一臺接收機的升級任務放到一個單獨的線程來完成,實現線程的并發效果。
通過FTP推送文件是因為FTP屏蔽了各計算機系統的細節,因而適合在異構網絡中任意計算機之間傳送文件。FTP只提供文件傳送的一些基本服務,使用傳輸控制協議(transmission control protocol,TCP),主要功能是減小或消除在不同系統下處理文件的不兼容性。FTP使用客戶端/服務器模型[8],一個FTP服務器進程可以為多個客戶進程提供服務。FTP服務器由2大部分組成:一個主進程,負責接受新的請求;若干從屬進程,負責處理單個請求。
衛星接收機是基于Linux系統運行的,在其內部構建了FTP服務器端,將系統升級文件、固件升級文件,以及前面板升級文件保存在指定的文件目錄下。FTP客戶端將文件直接推送到指定的目錄下,然后接收機可以自動解析解壓,完成升級任務。
需要特別說明的是在QT4中去掉了FTP的實現類QFtp,為了文件上傳的方便,并且讓系統運行穩定,在軟件設計的時候選用了官方原來的QFtp源碼,再重新編譯,構造FTP客戶端,完成連接(ConnecToHost)、設置用戶名和密碼、登錄(login)、上傳(put)等操作。
由于文件傳輸頻繁,數據在傳送的過程中可能會因為網絡中斷或者斷電而中斷文件傳輸,為了應對這些突發事件,開發支持了文件上傳的斷點續傳[9]和多線程上傳等功能。
軟件設計基于C/S構架,實現接收機系統中服務器端對應的客戶端[10],客戶端通過Socket建立一個或者多個連接,通過傳輸控制/網絡通訊協議(transmission control protocol/internet protocol,TCP/IP)進行數據交互。軟件平臺的主要功能如下:
1)通過檢查Socket是否連接成功,以及FTP是否連接成功來測試接收機是否連接成功,并且獲得連接成功和失敗的連接數;
2)重啟功能,連接失敗時,可以重啟連接,FTP上傳文件失敗,實現斷點續傳的功能;
3)獲取接收機的系統版本、固件版本以及接收機的序列號,實時顯示每臺接收機推送文件的進度和總的文件進度;
4)動態加載IP地址,根據不同接收機的不同IP地址進行Socket連接。
客戶端/服務器模式下基于TCP/IP協議通信的多線程實現[11]保證了客戶端與服務器同步,接收數據穩定可靠。
首先將所有接收機的IP地址寫入文件,然后通過QFile繼承類打開文件,讀取IP地址,顯示在軟件的表格中(QTableWidget繼承類),并且檢驗IP地址的正確性,再進行Socket連接,并由客戶端向服務器發送連接請求報文,如果報文結構正確且Socket連接成功,則接收到接收機發來的報文信息,通過解析,可以獲得報文的內容為接收機的序列號(SN)、固件版本號(Firm Version)、系統前面板版本號(OEMFirmVersion)。此時,將客戶端與服務器的連接狀態顯示到軟件界面。程序設計流程如圖1所示。

圖1 軟件流程
程序設計經過多文件編譯,分功能實現,保證軟件能夠流暢運行,與服務器通信穩定,響應迅速,通過自實現FTP客戶端類與報文解析類,使得程序可讀性高,構架上更為方便日后的升級維護。頭文件介紹:cbu.h實現主界面編輯功能;kfifo.h實現報文解析;qftp.h設計了FTP客戶端操作方法;所有的升級過程任務在workthread.h中設計;然后通過創建新線程,在新線程中運行。如圖2所示。

圖2 程序實現文件
連接成功之后開始通過FTP向服務器推送文件,根據寫入字節數計算推送進度,顯示到軟件表格的progress中,QFtp繼承類提供了FTP的連接、登錄、用戶名密碼設置、文件上傳、下載、推送進度等方法直接調用,推送文件的同時,向服務器發送升級類型報文,包括3個類型:前面板升級、系統固件升級以及板卡固件升級。服務器端檢測文件成功后,開始升級,并且將升級進度以報文的形式發送給客戶端,升級進度從0x02到0x64,將升級進度顯示在軟件的進度條上。
報文的格式由28個字節的報文頭(header)、可變長報文內容(content)和4個字節的校驗位構成。其中header包含了3個字節的同步頭和25個字節的報文信息,而報文信息 主要有報文ID(MessageID)、報文長度(MessageLength)等。
將構造的報文通過QByteArray繼承類的FromRawDate轉換為字節數組,發送給服務器端,這樣保證數據不丟失。而客戶端接收的報文,同樣轉化成字節數組的形式,然后根據報文頭信息獲取需要的報文內容,填入軟件構造的表中。
QT在主線程中完成界面的創建,通過信號和槽機制將事件連接起來;在構造函數中完成初始化。由于在QT其他的自定義類中無法對主界面類的控件進行操作,在設計的過程中,也采用了自定義信號,通過槽函數連接,實現自定義線程類對主界面控件的操作,這樣主要是為了方便進度條顯示每個線程升級的進度。多線程實現思路如圖3所示。

圖3 多線程升級流程
程序根據讀取IP地址的個數來確定創建的線程(thread)數目,在每個線程中除了不同的IP地址之外,其他完成的任務都一樣,所以在線程的構造當中傳入IP地址參數,線程任務由一個單獨的類實現。所有線程獲取報文內容建立統一的容器存儲(QList),為防止多個線程同時修改共享數據,直接使用QT中提供的線程同步類(QMutex和QMutexLocker)對線程的共享數據加鎖,在函數的入口處加入同步類對象,對象的局部變量在函數使用結束后自動銷毀,共享數據也就解鎖成功,保證線程的并發不會出錯。
通過連接上海司南公司研發的M300pro接收機進行軟件測試驗證,運行結果如圖4所示。為了驗證效果,最后一個IP為錯誤地址。
本文通過QT平臺利用C++編程完成了多線程接收機批量升級工具。在局域網絡系統中,將接收機和PC機通過網絡接口連接,客戶端和服務器端連接成功,使用FTP上傳所需要的升級文件。經測試驗證,各線程獨立運行,達到并發效果,升級過程不相互影響,連接接收機穩定;同時讀取不同接收機的報文信息,報文解析正確,軟件能夠同時快速上傳文件至各個接收機指定文件目錄中,并且能夠根據不同的報文信息及時將升級狀態顯示到計算機界面;對批量的接收機升級進行可視化管理,改善了以往的單臺升級模式,并且可以實現遠程網絡傳輸控制,有效提高了接收機的升級效率,降低了衛星基地增強系統的維護成本。

圖4 軟件運行效果
由于實驗條件限制,實驗只針對了司南一個品牌的接收機測試,對于不同廠商的接收機,還需要進行軟件升級,修改報文解析方法即可。
[1] 李曉亮.CORS系統的構建與應用[D].北京:中國地質大學,2014.
[2] 汪偉,史廷玉,張志全.CORS系統的應用發展及展望[J].城市勘測,2010(3):45-47.
[3] 王向東,于曉偉.城市連續運行參考站(CORS)系統建設淺析[J].大眾科技,2012(1):30-31.
[4] 黃斌,王勇紅,姜來想.GNSS兼容接收機及其在CORS中的應用[J].測繪通報,2007(1):29-32.
[5] BLANCHETTE J,SUMMERFIELD M.C++ GUI Qt4編程[M].閆鋒欣,曾泉人,張志強,譯.2版.北京:電子工業出版社,2008.
[6] 黃宇東,胡躍明,陳安.基于Qt的多線程技術應用與研究[J].軟件導刊,2009(10):40-42.
[7] 眭俊華,劉慧娜,王建鑫,等.多核多線程技術綜述[J].計算機應用,2013(增刊1):239-242.
[8] 顧彤辰.FTP客戶端及服務器系統的設計與實現[D].南京:南京郵電大學,2016.
[9] 鄭營營.基于HTTP/FTP協議的斷點續傳多線程下載組件[D].濟南:濟南大學,2012.
[10] 龔俐,毛曉蛟.基于C#的FTP客戶端的實現[J].電腦編程技巧與維護,2010(24):94-95.
[11] 劉爽,史國友,張遠強.基于TCP/IP協議和多線程的通信軟件的設計與實現[J].計算機工程與設計,2010(7):1417-1420.