王龍龍,周志峰
(上海工程技術(shù)大學(xué) 機(jī)械工程學(xué)院,上海 201600)
近年來(lái),隨著全球衛(wèi)星導(dǎo)航系統(tǒng)(global navigation satellite system,GNSS)技術(shù)在各個(gè)領(lǐng)域的深入應(yīng)用,我國(guó)不斷完善連續(xù)運(yùn)行衛(wèi)星定位綜合服務(wù)系統(tǒng)的建設(shè),許多城市建成了連續(xù)運(yùn)行參考站(continuously operating reference stations,CORS)系統(tǒng)[1-2],CORS系統(tǒng)是由多個(gè)建立在地球上固定位置上的連續(xù)運(yùn)行的衛(wèi)星基準(zhǔn)站利用數(shù)據(jù)處理單元、控制器、計(jì)算機(jī)、數(shù)據(jù)通信與數(shù)據(jù)傳輸技術(shù)組成網(wǎng)絡(luò),能夠根據(jù)不同用戶、不同行業(yè)提供實(shí)施不同精度的定位導(dǎo)航技術(shù)等空間服務(wù)的綜合系統(tǒng)[3],涉及到全球衛(wèi)星導(dǎo)航定位、測(cè)繪與地理信息、氣象、地質(zhì)勘探等多個(gè)領(lǐng)域。CORS參考站是若干具有已知坐標(biāo)的GNSS衛(wèi)星數(shù)據(jù)觀測(cè)站構(gòu)成的數(shù)據(jù)接收部分,其主要功能是對(duì)連續(xù)運(yùn)行的衛(wèi)星進(jìn)行定位跟蹤、采集、記錄各種數(shù)據(jù)等,并且將數(shù)據(jù)的傳輸?shù)綌?shù)據(jù)管理中心;每個(gè)參考站由GNSS接收機(jī)、天線、不間斷電源、網(wǎng)絡(luò)傳輸設(shè)備等構(gòu)成,所以接收機(jī)的穩(wěn)定運(yùn)行對(duì)于衛(wèi)星的連續(xù)定位以及整個(gè)CORS系統(tǒng)起著至關(guān)重要的作用[4]。
在多基站的連續(xù)運(yùn)行的衛(wèi)星定位系統(tǒng)中,基站站點(diǎn)的布置位置分散,國(guó)內(nèi)外接收機(jī)開(kāi)發(fā)商目前難以實(shí)現(xiàn)對(duì)所有參考站衛(wèi)星接收機(jī)的一次性升級(jí):若要對(duì)接收機(jī)的固件、板卡或者前面板升級(jí),只能逐臺(tái)接收機(jī)現(xiàn)場(chǎng)維護(hù);雖然通過(guò)登錄網(wǎng)絡(luò)客戶端操作較為方便,但仍避免不了逐臺(tái)操作的局限性。這無(wú)疑增加了參考站的維護(hù)成本,降低了參考站后期的工作效率。本文研究開(kāi)發(fā)參考站基站接收機(jī)批量維護(hù)升級(jí)工具,以期實(shí)現(xiàn)同時(shí)對(duì)多臺(tái)接收機(jī)通過(guò)文件傳輸協(xié)議(file transfer protocol,F(xiàn)TP)統(tǒng)一升級(jí)。
QT作為一種基于C++的跨平臺(tái)圖形用戶界面(graphical user interface,GUI)系統(tǒng),能夠提供給用戶構(gòu)造圖形用戶界面的較強(qiáng)功能,滿足用戶構(gòu)造復(fù)雜圖形界面系統(tǒng)的需求[5]。作為目前主流的嵌入式GUI設(shè)計(jì)工具,為不影響界面的響應(yīng)速度,引入了多線程技術(shù),還有其多種線程的通信機(jī)制[6],給軟件開(kāi)發(fā)帶來(lái)了很大優(yōu)勢(shì)。
首先和多進(jìn)程相比較,多線程具有開(kāi)銷小、切換快的優(yōu)點(diǎn),同時(shí),由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其他線程所用,這樣線程之間通信也就更加方便快捷;但是數(shù)據(jù)的共享也帶來(lái)一些問(wèn)題,有些數(shù)據(jù)不能被同時(shí)修改。
其次,多線程能有效提高應(yīng)用程序的響應(yīng)速度,這對(duì)圖形界面的程序具有重要意義。當(dāng)完成操作耗時(shí)比較長(zhǎng)的任務(wù)時(shí),傳統(tǒng)程序不會(huì)響應(yīng)鍵盤(pán)、鼠標(biāo)、菜單的操作;而使用多線程技術(shù)將耗時(shí)長(zhǎng)的操作(time consuming)置于一個(gè)新的線程,則可以避免這種尷尬的情況,特別是在并行操作時(shí),多線程能夠響應(yīng)不同的操作請(qǐng)求,不至于出現(xiàn)操作堵塞。隨著多核多線程技術(shù)[7]的發(fā)展,對(duì)于多中央處理器(central processing unit,CPU)的系統(tǒng),不同線程會(huì)在不同的CPU中運(yùn)行,操作系統(tǒng)則會(huì)控制當(dāng)前的線程數(shù)不大于CPU的數(shù)目,這樣也提高了CPU的運(yùn)行效率。
QT中的線程主要分為用戶界面主線程和后臺(tái)的工作線程:主線程擔(dān)負(fù)著響應(yīng)用戶輸入信息以及處理繪制圖形事件和消息的任務(wù),在程序中,QWidget對(duì)象的創(chuàng)建意味著一個(gè)用戶界面主線程啟動(dòng),程序運(yùn)行結(jié)束,也就線程終止;而后臺(tái)的工作線程也就是執(zhí)行客戶所需求的任務(wù)線程,如相關(guān)計(jì)算、串口的讀寫(xiě)等功能。它們二者最大的區(qū)別是主線程不是由QThread繼承而來(lái),其最重要的是實(shí)現(xiàn)工作線程任務(wù)控制函數(shù)。工作線程和用戶界面主線程啟動(dòng)時(shí)充分利用C++多態(tài)的特性,實(shí)現(xiàn)相同函數(shù)的不同版本。
QT中提供了4種多線程實(shí)現(xiàn)的方法,分別是繼承QThread、繼承QRunnable、使用moveToThrough將實(shí)現(xiàn)的目標(biāo)代碼轉(zhuǎn)到新線程中運(yùn)行,以及使用QTConcurrent:run啟動(dòng)新的線程。在接收機(jī)批量升級(jí)工具的開(kāi)發(fā)中使用了moveToThrough這種方法來(lái)實(shí)現(xiàn)多線程,可以將每一臺(tái)接收機(jī)的升級(jí)任務(wù)放到一個(gè)單獨(dú)的線程來(lái)完成,實(shí)現(xiàn)線程的并發(fā)效果。
通過(guò)FTP推送文件是因?yàn)镕TP屏蔽了各計(jì)算機(jī)系統(tǒng)的細(xì)節(jié),因而適合在異構(gòu)網(wǎng)絡(luò)中任意計(jì)算機(jī)之間傳送文件。FTP只提供文件傳送的一些基本服務(wù),使用傳輸控制協(xié)議(transmission control protocol,TCP),主要功能是減小或消除在不同系統(tǒng)下處理文件的不兼容性。FTP使用客戶端/服務(wù)器模型[8],一個(gè)FTP服務(wù)器進(jìn)程可以為多個(gè)客戶進(jìn)程提供服務(wù)。FTP服務(wù)器由2大部分組成:一個(gè)主進(jìn)程,負(fù)責(zé)接受新的請(qǐng)求;若干從屬進(jìn)程,負(fù)責(zé)處理單個(gè)請(qǐng)求。
衛(wèi)星接收機(jī)是基于Linux系統(tǒng)運(yùn)行的,在其內(nèi)部構(gòu)建了FTP服務(wù)器端,將系統(tǒng)升級(jí)文件、固件升級(jí)文件,以及前面板升級(jí)文件保存在指定的文件目錄下。FTP客戶端將文件直接推送到指定的目錄下,然后接收機(jī)可以自動(dòng)解析解壓,完成升級(jí)任務(wù)。
需要特別說(shuō)明的是在QT4中去掉了FTP的實(shí)現(xiàn)類QFtp,為了文件上傳的方便,并且讓系統(tǒng)運(yùn)行穩(wěn)定,在軟件設(shè)計(jì)的時(shí)候選用了官方原來(lái)的QFtp源碼,再重新編譯,構(gòu)造FTP客戶端,完成連接(ConnecToHost)、設(shè)置用戶名和密碼、登錄(login)、上傳(put)等操作。
由于文件傳輸頻繁,數(shù)據(jù)在傳送的過(guò)程中可能會(huì)因?yàn)榫W(wǎng)絡(luò)中斷或者斷電而中斷文件傳輸,為了應(yīng)對(duì)這些突發(fā)事件,開(kāi)發(fā)支持了文件上傳的斷點(diǎn)續(xù)傳[9]和多線程上傳等功能。
軟件設(shè)計(jì)基于C/S構(gòu)架,實(shí)現(xiàn)接收機(jī)系統(tǒng)中服務(wù)器端對(duì)應(yīng)的客戶端[10],客戶端通過(guò)Socket建立一個(gè)或者多個(gè)連接,通過(guò)傳輸控制/網(wǎng)絡(luò)通訊協(xié)議(transmission control protocol/internet protocol,TCP/IP)進(jìn)行數(shù)據(jù)交互。軟件平臺(tái)的主要功能如下:
1)通過(guò)檢查Socket是否連接成功,以及FTP是否連接成功來(lái)測(cè)試接收機(jī)是否連接成功,并且獲得連接成功和失敗的連接數(shù);
2)重啟功能,連接失敗時(shí),可以重啟連接,F(xiàn)TP上傳文件失敗,實(shí)現(xiàn)斷點(diǎn)續(xù)傳的功能;
3)獲取接收機(jī)的系統(tǒng)版本、固件版本以及接收機(jī)的序列號(hào),實(shí)時(shí)顯示每臺(tái)接收機(jī)推送文件的進(jìn)度和總的文件進(jìn)度;
4)動(dòng)態(tài)加載IP地址,根據(jù)不同接收機(jī)的不同IP地址進(jìn)行Socket連接。
客戶端/服務(wù)器模式下基于TCP/IP協(xié)議通信的多線程實(shí)現(xiàn)[11]保證了客戶端與服務(wù)器同步,接收數(shù)據(jù)穩(wěn)定可靠。
首先將所有接收機(jī)的IP地址寫(xiě)入文件,然后通過(guò)QFile繼承類打開(kāi)文件,讀取IP地址,顯示在軟件的表格中(QTableWidget繼承類),并且檢驗(yàn)IP地址的正確性,再進(jìn)行Socket連接,并由客戶端向服務(wù)器發(fā)送連接請(qǐng)求報(bào)文,如果報(bào)文結(jié)構(gòu)正確且Socket連接成功,則接收到接收機(jī)發(fā)來(lái)的報(bào)文信息,通過(guò)解析,可以獲得報(bào)文的內(nèi)容為接收機(jī)的序列號(hào)(SN)、固件版本號(hào)(Firm Version)、系統(tǒng)前面板版本號(hào)(OEMFirmVersion)。此時(shí),將客戶端與服務(wù)器的連接狀態(tài)顯示到軟件界面。程序設(shè)計(jì)流程如圖1所示。
圖1 軟件流程
程序設(shè)計(jì)經(jīng)過(guò)多文件編譯,分功能實(shí)現(xiàn),保證軟件能夠流暢運(yùn)行,與服務(wù)器通信穩(wěn)定,響應(yīng)迅速,通過(guò)自實(shí)現(xiàn)FTP客戶端類與報(bào)文解析類,使得程序可讀性高,構(gòu)架上更為方便日后的升級(jí)維護(hù)。頭文件介紹:cbu.h實(shí)現(xiàn)主界面編輯功能;kfifo.h實(shí)現(xiàn)報(bào)文解析;qftp.h設(shè)計(jì)了FTP客戶端操作方法;所有的升級(jí)過(guò)程任務(wù)在workthread.h中設(shè)計(jì);然后通過(guò)創(chuàng)建新線程,在新線程中運(yùn)行。如圖2所示。
圖2 程序?qū)崿F(xiàn)文件
連接成功之后開(kāi)始通過(guò)FTP向服務(wù)器推送文件,根據(jù)寫(xiě)入字節(jié)數(shù)計(jì)算推送進(jìn)度,顯示到軟件表格的progress中,QFtp繼承類提供了FTP的連接、登錄、用戶名密碼設(shè)置、文件上傳、下載、推送進(jìn)度等方法直接調(diào)用,推送文件的同時(shí),向服務(wù)器發(fā)送升級(jí)類型報(bào)文,包括3個(gè)類型:前面板升級(jí)、系統(tǒng)固件升級(jí)以及板卡固件升級(jí)。服務(wù)器端檢測(cè)文件成功后,開(kāi)始升級(jí),并且將升級(jí)進(jìn)度以報(bào)文的形式發(fā)送給客戶端,升級(jí)進(jìn)度從0x02到0x64,將升級(jí)進(jìn)度顯示在軟件的進(jìn)度條上。
報(bào)文的格式由28個(gè)字節(jié)的報(bào)文頭(header)、可變長(zhǎng)報(bào)文內(nèi)容(content)和4個(gè)字節(jié)的校驗(yàn)位構(gòu)成。其中header包含了3個(gè)字節(jié)的同步頭和25個(gè)字節(jié)的報(bào)文信息,而報(bào)文信息 主要有報(bào)文ID(MessageID)、報(bào)文長(zhǎng)度(MessageLength)等。
將構(gòu)造的報(bào)文通過(guò)QByteArray繼承類的FromRawDate轉(zhuǎn)換為字節(jié)數(shù)組,發(fā)送給服務(wù)器端,這樣保證數(shù)據(jù)不丟失。而客戶端接收的報(bào)文,同樣轉(zhuǎn)化成字節(jié)數(shù)組的形式,然后根據(jù)報(bào)文頭信息獲取需要的報(bào)文內(nèi)容,填入軟件構(gòu)造的表中。
QT在主線程中完成界面的創(chuàng)建,通過(guò)信號(hào)和槽機(jī)制將事件連接起來(lái);在構(gòu)造函數(shù)中完成初始化。由于在QT其他的自定義類中無(wú)法對(duì)主界面類的控件進(jìn)行操作,在設(shè)計(jì)的過(guò)程中,也采用了自定義信號(hào),通過(guò)槽函數(shù)連接,實(shí)現(xiàn)自定義線程類對(duì)主界面控件的操作,這樣主要是為了方便進(jìn)度條顯示每個(gè)線程升級(jí)的進(jìn)度。多線程實(shí)現(xiàn)思路如圖3所示。
圖3 多線程升級(jí)流程
程序根據(jù)讀取IP地址的個(gè)數(shù)來(lái)確定創(chuàng)建的線程(thread)數(shù)目,在每個(gè)線程中除了不同的IP地址之外,其他完成的任務(wù)都一樣,所以在線程的構(gòu)造當(dāng)中傳入IP地址參數(shù),線程任務(wù)由一個(gè)單獨(dú)的類實(shí)現(xiàn)。所有線程獲取報(bào)文內(nèi)容建立統(tǒng)一的容器存儲(chǔ)(QList),為防止多個(gè)線程同時(shí)修改共享數(shù)據(jù),直接使用QT中提供的線程同步類(QMutex和QMutexLocker)對(duì)線程的共享數(shù)據(jù)加鎖,在函數(shù)的入口處加入同步類對(duì)象,對(duì)象的局部變量在函數(shù)使用結(jié)束后自動(dòng)銷毀,共享數(shù)據(jù)也就解鎖成功,保證線程的并發(fā)不會(huì)出錯(cuò)。
通過(guò)連接上海司南公司研發(fā)的M300pro接收機(jī)進(jìn)行軟件測(cè)試驗(yàn)證,運(yùn)行結(jié)果如圖4所示。為了驗(yàn)證效果,最后一個(gè)IP為錯(cuò)誤地址。
本文通過(guò)QT平臺(tái)利用C++編程完成了多線程接收機(jī)批量升級(jí)工具。在局域網(wǎng)絡(luò)系統(tǒng)中,將接收機(jī)和PC機(jī)通過(guò)網(wǎng)絡(luò)接口連接,客戶端和服務(wù)器端連接成功,使用FTP上傳所需要的升級(jí)文件。經(jīng)測(cè)試驗(yàn)證,各線程獨(dú)立運(yùn)行,達(dá)到并發(fā)效果,升級(jí)過(guò)程不相互影響,連接接收機(jī)穩(wěn)定;同時(shí)讀取不同接收機(jī)的報(bào)文信息,報(bào)文解析正確,軟件能夠同時(shí)快速上傳文件至各個(gè)接收機(jī)指定文件目錄中,并且能夠根據(jù)不同的報(bào)文信息及時(shí)將升級(jí)狀態(tài)顯示到計(jì)算機(jī)界面;對(duì)批量的接收機(jī)升級(jí)進(jìn)行可視化管理,改善了以往的單臺(tái)升級(jí)模式,并且可以實(shí)現(xiàn)遠(yuǎn)程網(wǎng)絡(luò)傳輸控制,有效提高了接收機(jī)的升級(jí)效率,降低了衛(wèi)星基地增強(qiáng)系統(tǒng)的維護(hù)成本。
圖4 軟件運(yùn)行效果
由于實(shí)驗(yàn)條件限制,實(shí)驗(yàn)只針對(duì)了司南一個(gè)品牌的接收機(jī)測(cè)試,對(duì)于不同廠商的接收機(jī),還需要進(jìn)行軟件升級(jí),修改報(bào)文解析方法即可。
[1] 李曉亮.CORS系統(tǒng)的構(gòu)建與應(yīng)用[D].北京:中國(guó)地質(zhì)大學(xué),2014.
[2] 汪偉,史廷玉,張志全.CORS系統(tǒng)的應(yīng)用發(fā)展及展望[J].城市勘測(cè),2010(3):45-47.
[3] 王向東,于曉偉.城市連續(xù)運(yùn)行參考站(CORS)系統(tǒng)建設(shè)淺析[J].大眾科技,2012(1):30-31.
[4] 黃斌,王勇紅,姜來(lái)想.GNSS兼容接收機(jī)及其在CORS中的應(yīng)用[J].測(cè)繪通報(bào),2007(1):29-32.
[5] BLANCHETTE J,SUMMERFIELD M.C++ GUI Qt4編程[M].閆鋒欣,曾泉人,張志強(qiáng),譯.2版.北京:電子工業(yè)出版社,2008.
[6] 黃宇東,胡躍明,陳安.基于Qt的多線程技術(shù)應(yīng)用與研究[J].軟件導(dǎo)刊,2009(10):40-42.
[7] 眭俊華,劉慧娜,王建鑫,等.多核多線程技術(shù)綜述[J].計(jì)算機(jī)應(yīng)用,2013(增刊1):239-242.
[8] 顧彤辰.FTP客戶端及服務(wù)器系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].南京:南京郵電大學(xué),2016.
[9] 鄭營(yíng)營(yíng).基于HTTP/FTP協(xié)議的斷點(diǎn)續(xù)傳多線程下載組件[D].濟(jì)南:濟(jì)南大學(xué),2012.
[10] 龔俐,毛曉蛟.基于C#的FTP客戶端的實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2010(24):94-95.
[11] 劉爽,史國(guó)友,張遠(yuǎn)強(qiáng).基于TCP/IP協(xié)議和多線程的通信軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2010(7):1417-1420.