高嘉韻,倪晉平,徐 飛
(1.西安工業(yè)大學(xué) 光電工程學(xué)院,西安 710000; 2.西安工業(yè)大學(xué) 計算機學(xué)院,西安 710000)
靶場試驗測試作為武器研發(fā)、生產(chǎn)和測試的重要一環(huán),主要對武器的各種性能指標進行的檢測,以確定武器是否能夠達到預(yù)期的指標要求。立靶密集度測試是槍彈生產(chǎn)檢驗的關(guān)鍵參數(shù),雙線陣交會精度靶密集度參數(shù)測量系統(tǒng)因較高的測量精度、使用方便以及相對較低的使用成本而被廣泛使用[1-3]。系統(tǒng)包括三個部分,上位機軟件、數(shù)據(jù)采集處理下位機軟件和精度靶采集系統(tǒng),其中上位機軟件就是本文要設(shè)計實現(xiàn)的。
目前國內(nèi)外對于該領(lǐng)域的測控軟件通常采用C/S(客戶端/服務(wù)器)架構(gòu)實現(xiàn)的,軟件形成兩層結(jié)構(gòu),服務(wù)器負責處理具有復(fù)雜邏輯的業(yè)務(wù)功能,客戶端實現(xiàn)用戶界面和簡單的數(shù)據(jù)處理。這種架構(gòu)軟件實際使用中一般需要專門的客戶端軟件安裝使用安裝,處理出現(xiàn)的問題難度較大,也難以功能擴展,可能會出現(xiàn)開發(fā)一個全新的軟件的情況[4]。如丁力等[5]設(shè)計C/S架構(gòu)的控制管理系統(tǒng)有如下缺點:系統(tǒng)擴展性差,業(yè)務(wù)變更不靈活;兼容性差,開發(fā)工具不兼容,獨立客戶端安裝;維護和升級成本高。
結(jié)合上述問題,精度靶測試系統(tǒng)上位機軟件采用拓展性和維護性方便、簡單、共享性強和訪問簡單的B/S(瀏覽器/服務(wù)器)架構(gòu)開發(fā)[6-7]。將用戶界面等在瀏覽器端實現(xiàn),為了不僅能簡化系統(tǒng)的維護,還可以降低使用成本,將所有的功能邏輯都集中到了服務(wù)器端。
雙線陣交會精度靶測控系統(tǒng)整體上可分為精度靶測控系統(tǒng)軟件上位機部分、數(shù)據(jù)采集處理下位機部分和精度靶采集硬件系統(tǒng)三部分,如圖1所示。其中將上位機部分習(xí)慣稱為控制端,下位機和精度靶硬件采集系統(tǒng)整體稱為測量端,從使用角度來說,一般情況下上位機和測量端之間間隔100米左右,通過網(wǎng)線進行連接,實現(xiàn)遠程指令控制和數(shù)據(jù)傳輸?shù)氖褂眯枨蟆?/p>
圖1 精度靶測控系統(tǒng)整體結(jié)構(gòu)圖
精度靶測控系統(tǒng)功能主要是實現(xiàn)對整個試驗流程進行控制,需要上位機執(zhí)行相應(yīng)的控制命令,判斷當前的任務(wù)或流程執(zhí)行情況,以及是否進入下一個控制命令[8];其次是接收下位機傳輸?shù)臄?shù)據(jù)。這里控制方面主要需要實現(xiàn)遠程控制網(wǎng)絡(luò)繼電器操作以及任務(wù)開始、結(jié)束的控制,數(shù)據(jù)方面主要是對下位接收的數(shù)據(jù)進行一個直觀顯示和存儲。
精度靶系統(tǒng)對于上位機的要求是能夠及時準確的接收下位的數(shù)據(jù),同時對整個試驗流程進行功能控制。從上述情況來看,上位機主要實現(xiàn)功能分為以下幾個:
1) 電源開關(guān)控制:上位機軟件啟動后,檢測與網(wǎng)絡(luò)繼電器連接狀態(tài),向網(wǎng)絡(luò)繼電器發(fā)送控制命令,從而實現(xiàn)遠程控制下位機和精度靶硬件部分的電源開關(guān)。
2) 狀態(tài)檢測:下位機軟件和精度靶硬件采集部分啟動后,下位機軟件獲取和硬件的連接狀態(tài),將連接狀態(tài)發(fā)送到上位機軟件進行顯示,方便使用者知道下位機和精度靶硬件采集部分的連接情況,便于出現(xiàn)異常狀態(tài)問題的快速解決。
3) 試驗參數(shù)設(shè)置:該功能是精度靶測試試驗前的相關(guān)參數(shù)初始化設(shè)置,包含試驗任務(wù)的名稱、組數(shù)、每組的次數(shù)和試驗操作人員的相關(guān)信息設(shè)置,以及測試用的彈種數(shù)據(jù)包含彈徑、彈長和彈速的設(shè)置。
4) 測試試驗:該功能包含了多個子功能,開始試驗、數(shù)據(jù)顯示、試驗密集度參數(shù)計算、試驗組數(shù)和結(jié)束試驗。開始試驗是使用者操作上位機向下位機發(fā)送開始試驗的控制命令,下位機接收到指令后進入測試狀態(tài);數(shù)據(jù)顯示是上位機軟件把從下位機接收到的試驗數(shù)據(jù)結(jié)果進行展示;試驗密集度參數(shù)計算是由上位機完成的,在試驗中,上位機接收到試驗數(shù)據(jù)大于等于三的時候,程序會自動進行參數(shù)結(jié)果的計算,也可以手動選擇計算;試驗組數(shù)是在試驗中進行試驗組別切換;試驗結(jié)束同開始試驗,用戶操作上位機向下位機發(fā)送試驗結(jié)束指令,且該功能不設(shè)置前置條件。
5) 歷史數(shù)據(jù):在試驗中,上位機會把從下位機接收到的試驗結(jié)果和密集度參數(shù)計算的結(jié)果全部保存到本地數(shù)據(jù)庫,并且以任務(wù)創(chuàng)建時間為名稱區(qū)別存儲,通過任務(wù)創(chuàng)建時間或名稱檢索對應(yīng)的歷史試驗數(shù)據(jù),還可以選擇所需試驗任務(wù)數(shù)據(jù)導(dǎo)出到Excel。
基于B/S架構(gòu)的上位機軟件的整體結(jié)構(gòu)如圖2所示,依據(jù)整體框圖的結(jié)構(gòu)層次,進一步闡述層與層之間模塊的設(shè)計和信息的交互。上位機軟件整體分為上層、中層和下層,表示層位于最上層,是為了與用戶進行交互的層面,用戶在界面觸發(fā)相關(guān)控制命令的按鈕操作,隨之用戶的請求及數(shù)據(jù)由表示層接收,接著對數(shù)據(jù)進行處理,最后顯示處理后的數(shù)據(jù)。業(yè)務(wù)邏輯層作為紐帶存在于表示層和數(shù)據(jù)之間,需要依據(jù)業(yè)務(wù)的具體功能需求,實現(xiàn)相對應(yīng)的業(yè)務(wù)功能。該軟件系統(tǒng)數(shù)據(jù)來自與下位機的通信獲得,所以設(shè)計在中間層需要搭建TCP服務(wù)器進行數(shù)據(jù)交互。數(shù)據(jù)層主要實現(xiàn)對數(shù)據(jù)庫的增刪改查,用于TCP服務(wù)器存儲從下位機獲取來的數(shù)據(jù)以及向歷史數(shù)據(jù)查詢功能模塊提供數(shù)據(jù)支持。
圖2 上位機軟件系統(tǒng)整體框圖
服務(wù)器和瀏覽器作為B/S軟件架構(gòu)的核心。其中瀏覽器作為用戶直接操作的層面,主要包含功能操作、發(fā)送請求和獲取數(shù)據(jù),最后通過瀏覽器展示出來。服務(wù)器承載了大多數(shù)的業(yè)務(wù)分析數(shù)據(jù)處理,也是真正的實現(xiàn)界面應(yīng)用層各模塊的業(yè)務(wù)邏輯,例如在和數(shù)據(jù)庫部分的交互中,專門設(shè)計了數(shù)據(jù)緩存處理,數(shù)據(jù)查詢的優(yōu)化等。更重要的是,在與下位機的交互中,提供可靠的數(shù)據(jù)傳輸,較好的傳輸性能。
根據(jù)軟件系統(tǒng)整體設(shè)計數(shù)據(jù)流圖,如圖3所示,對上位機軟件的功能需求進行分析整理,以技術(shù)出發(fā)的角度,上位機軟件服務(wù)器部分設(shè)計實現(xiàn)了應(yīng)用Netty通信框架、HTTP傳輸方式[9]、數(shù)據(jù)庫等的搭建。其中,服務(wù)器的Netty通信框架的設(shè)計與實現(xiàn)應(yīng)用是核心問題,保證了和下位機之間穩(wěn)定的數(shù)據(jù)傳輸。Netty多用于搭建數(shù)據(jù)通信底層部分,并且是基于TCP通信協(xié)議實現(xiàn),Netty因其非阻塞通信方式,實現(xiàn)了優(yōu)異的性能而被廣泛應(yīng)用,也是目前大多數(shù)框架的主流或被服務(wù)端首選用來搭建軟件底層框架。
圖3 軟件系統(tǒng)整體數(shù)據(jù)流圖
2.2.1 B/S架構(gòu)
目前軟件常用的開發(fā)模式有兩種,C/S和B/S[10]。C/S模式,范圍比較有限,大部分基于局域網(wǎng)環(huán)境使用,因為它的架構(gòu)主要是由表示層和數(shù)據(jù)層構(gòu)成的,所以使用方式必須是安裝獨有客戶端使用,且難以一次開發(fā)實現(xiàn)多平臺的使用。C/S這種架構(gòu)還有著一些其他缺點,舉例來說,在開發(fā)者方面,客戶端的升級和維護增加了工作量;對于用戶來說,時常進行迭代也增加了使用成本。因此,需要簡化客戶端的安裝部署工作。
B/S模式下,選擇了瀏覽器成為客戶端,避免進行繁瑣的客戶端安裝工作,使其可以專注于業(yè)務(wù)功能邏輯的開發(fā)實現(xiàn)。B/S是一個由三個主要部分組成的Web應(yīng)用程序:瀏覽器、服務(wù)器、數(shù)據(jù)庫[11]。承擔用戶交互的主要應(yīng)用軟件,成為了瀏覽器部分,但是不承擔業(yè)務(wù)部署和功能性開發(fā),服務(wù)器端即可完成所有的業(yè)務(wù)邏輯。并且通過瀏覽器即可訪問系統(tǒng),瀏覽器的UI設(shè)計更加美觀多樣化,升級方便。
2.2.2 Netty框架
Netty 是一個利用 Java 的高級網(wǎng)絡(luò)的能力,隱藏其背后的復(fù)雜性而提供一個易于使用的 API 的客戶端/服務(wù)器框架[12]。Netty實現(xiàn)了多種通信協(xié)議的支持,因其使用簡單,對非阻塞通信方式進行封裝;功能強大,支持多種主流協(xié)議,內(nèi)置集成了解碼功能;穩(wěn)定,目前已經(jīng)修復(fù)了框架已發(fā)現(xiàn)的缺陷。所以,它已經(jīng)成為大多框架和項目實現(xiàn)的底層,并被許多開發(fā)者青睞。Netty框架的底層實現(xiàn)包括了一個非阻塞的IO架構(gòu),允許開發(fā)人員輕松地編寫相關(guān)的應(yīng)用程序,以達到優(yōu)化網(wǎng)絡(luò)編程的目的,雖然Netty的底層框架邏輯實現(xiàn)非常復(fù)雜,但是其API簡單易用,開發(fā)者在編程中易于繞開業(yè)務(wù)層實現(xiàn)。其構(gòu)成有三個模塊:傳輸服務(wù),支持的協(xié)議和核心模塊[13]。
Netty在設(shè)計上有以下幾個優(yōu)點:NIO通信;無鎖化的串行設(shè)計理念;高效的并發(fā)編程;高性能的序列化框架等[14]。本系統(tǒng)選擇Netty主要是三方面的優(yōu)勢:并發(fā)高、傳輸可靠和封裝好。
1)并發(fā)高:對比于BIO(阻塞IO),Netty框架是基于非阻塞IO開發(fā)的網(wǎng)絡(luò)通信框架。其單線程能處理的連接數(shù)比BIO要高出很多。當建立了一個連接之后,接著還有兩個步驟,先是將客戶端發(fā)過來的數(shù)據(jù)全部接收,然后是在服務(wù)器處理完請求給客戶端響應(yīng)。這也是NIO和BIO的一個主要區(qū)別。在BIO中,等候客戶端發(fā)送數(shù)據(jù)這個過程是阻塞的,這樣就造成了一個線程只能處理一個請求的情況,而且計算機的處理線程也不是無限的。但是在NIO中,當一個套接字建立好以后,Thread類不會像BIO一樣將其阻塞,而且將請求推到了選擇器,由選擇器去不停地遍歷所有產(chǎn)生的套接字,當有一個套接字建立,選擇器就會通知Thread類,然后交由Thread類處理后再響應(yīng)給客戶端,這樣整個流程是非阻塞的。
2)傳輸快:Netty的數(shù)據(jù)發(fā)送和接收主要是使用bytebuffer,其使用對外內(nèi)存直接對套接字進行讀寫操作。如果使用傳統(tǒng)的堆內(nèi)存對套接字進行讀寫,Java虛擬機會將buffer直接復(fù)制一份到內(nèi)存中后再寫入套接字,多了一次緩沖區(qū)的內(nèi)存復(fù)制操作。但是Netty提供了一種組合ByteBuf,可以避免這樣的情況,因為其并沒有將Buffer組合起來,而是保存了它們的引用,本質(zhì)上是避免了數(shù)據(jù)的復(fù)制,實現(xiàn)了零拷貝。Netty中還使用了FileChannel的transfer to 方法,此方法依賴于操作系統(tǒng)實現(xiàn)零拷貝機制。
3)封裝好:編程過程中,從代碼量來看,Netty有很多自帶處理方法,實現(xiàn)連接、請求和接入等[16]。如ChannelHandler及其實現(xiàn)類,ChannelHandler 接口定義了許多事件處理的方法, Netty開發(fā)中需要自定義一個 Handler 類去實現(xiàn) ChannelHandle接口或其子接口或其實現(xiàn)類,然后我們可以通過重寫這些方法去實現(xiàn)具 體的業(yè)務(wù)邏輯。channelActive通道就緒事件,channelRead通道讀取數(shù)據(jù)事件,exceptionCaught通道發(fā)生異常的事件。
在軟件整體設(shè)計中提到,TCP服務(wù)器的設(shè)計與實現(xiàn)是上位機系統(tǒng)中最關(guān)鍵部分。承擔著與下位機通信,接收、發(fā)送、解析、保存數(shù)據(jù)等功能。其中主要就是可靠接收傳輸消息和及時發(fā)送消息指令,同時考慮到功能需求分析中下位機會頻繁發(fā)送數(shù)據(jù)等問題,故選用了Netty通信框架搭建TCP服務(wù)器底層,通信架構(gòu)如圖4所示。在Netty通信框架的應(yīng)用過程中主要研究了適應(yīng)于本系統(tǒng)基于Netty的通信實現(xiàn)、傳輸中TCP粘包拆包處理和心跳監(jiān)測機制的應(yīng)用。
圖4 通信框架圖
Netty被定義為是一個基于Java 非阻塞I/O(輸入/輸出)的異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架[17-18],提供了高層次的抽象來簡化TCP服務(wù)器的編程,具有高性能和高可靠性的特點,且廣泛應(yīng)用于客戶端與服務(wù)器之間長連接、高并發(fā)的場景。近幾年,Netty框架在計算機互聯(lián)網(wǎng)行業(yè)熱門起來,已經(jīng)成為了Java網(wǎng)絡(luò)編程框架的首選。
基本實現(xiàn)思路,通信的讀寫邏輯均是啟動階段實現(xiàn)連接數(shù)據(jù)的讀寫邏輯,其通過邏輯處理鏈Pipeline來添加邏輯處理器。首先,下位機連接成功回調(diào)處理器的channelActive()方法,當下位機和上位機分別接收到對方的消息回調(diào)自己的處理器的channelRead()方法;接著是上位機和下位機向?qū)Ψ綄憯?shù)據(jù)的時候調(diào)用writeAndFlush()方法,規(guī)定上位機和下位機之間交互信息的二進制數(shù)據(jù)傳輸載體為ByteBuf。
Netty服務(wù)器端的實現(xiàn),是被動的接收發(fā)送請求,為了避免出現(xiàn)服務(wù)器之間多端口產(chǎn)生沖突的問題,將服務(wù)器的端口號固定且綁定為6000。首先,創(chuàng)建ServerBootstrap()實例,設(shè)置并且綁定Reactor()線程池:EventLoopGroup,EventLoop就是處理所有注冊到該線程的選擇器上的;設(shè)置并綁定服務(wù)器端的Channel();TCP鏈路建立時創(chuàng)建ChannelPipeline()方法,添加并設(shè)置ChannelHandler(),用來處理網(wǎng)絡(luò)事件;綁定監(jiān)聽端口并啟動服務(wù)端;然后進入Netty獨有流程,通過多路復(fù)用器輪詢,進行網(wǎng)絡(luò)事件通知,最后執(zhí)行Netty系統(tǒng)和業(yè)務(wù)通過執(zhí)行pipline中的方法最終調(diào)度調(diào)用HandlerChannel()方法,過程如圖5所示。
圖5 基于Netty服務(wù)器實現(xiàn)流程圖
實現(xiàn)部分代碼如下:
public void run() throws Exception{
try{
ServerBootstrap serverBootstrap = new ServerBootstrap();//創(chuàng)建服務(wù)器端的啟動對象,配置參數(shù)
serverBootstrap.group(groupBoss, groupWorker) //兩個處理線程組設(shè)置
.option(ChannelOption.SO_BACKLOG, 1024) // 線程隊列并發(fā)數(shù)的設(shè)置
.channel(NioServerSocketChannel.class)
.childOption(ChannelOption.SO_KEEPALIVE, true) //保持活動的連接狀態(tài)設(shè)置
.childHandler((ChannelInit)(ch)->{});
//服務(wù)器啟動并綁定端口
bind(serverBootstrap, PORT);
// 對關(guān)閉通道進行監(jiān)聽
cf.channel().closeFuture().sync();
} catch (Exception e) {
log.error(" netty服務(wù)啟動異常 " + e.getMessage());
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
在Netty框架的設(shè)計與實現(xiàn)應(yīng)用的過程中,主要實現(xiàn)了基礎(chǔ)的數(shù)據(jù)通信交互后,因為TCP使用的是一種“數(shù)據(jù)流”的方式傳輸,還需要設(shè)計并且解決基于TCP數(shù)據(jù)傳輸過程中出現(xiàn)的粘包拆包的問題。
TCP是一種“數(shù)據(jù)流”的協(xié)議,處理數(shù)據(jù)包以流的方式,所以在接收數(shù)據(jù)的時候不能完整的得到一條數(shù)據(jù)稱為TCP粘包拆包。Netty這里提供了消息定長度,將傳輸消息大小固定不夠的空位用空格補齊然后發(fā)送;符號分割即用特殊符合進行標識,接收方遇到標識符就知道是下一條數(shù)據(jù);發(fā)送長度,每次發(fā)送數(shù)據(jù)的時候?qū)⑦@條數(shù)據(jù)的長度一并發(fā)送,這樣對方解析的時候根據(jù)長度來判斷數(shù)據(jù)接收是否完整。本軟件采用了換行符的處理方式,結(jié)合Netty提供的多種解碼器來解決這種問題。并且設(shè)計了自己的處理方法,順序遍歷ByteBuffer中的刻度字節(jié)[19],查找標志位“/n”。
不斷地從TCP緩沖區(qū)中讀取數(shù)據(jù),每次都需要判斷這是不是一個完整的包讀取完后,假如當下讀到的消息不能夠拼成完整的業(yè)務(wù)數(shù)據(jù)包,那就先把該數(shù)據(jù)保留,再從TCP緩沖區(qū)中讀出待得到完整的消息包。數(shù)據(jù)內(nèi)容正確需要進行業(yè)務(wù)處理,推向前臺頁面或者存入數(shù)據(jù)庫,流程如圖6所示。
圖6 TCP數(shù)據(jù)處理流程圖
實現(xiàn)部分代碼如下:
class Solution(SocketChannel ch){
ch.pipeline().addLast(new IdleStateHandler(5,0,0));//換行符處理
ch.pipeline().addLast(new LineBaseFrameDecoder(1024));
ch.pipeline().addLast(new StringDecoder());//編碼
ch.pipeline().addLast(new StringEncoder());//解碼
ch.pipeline().addLast(new MyServerHandler());
}
實現(xiàn)了TCP傳輸中粘包拆包問題的解決方法后,還需要通過對Netty框架提供的心跳機制功能接口進行研究,來實現(xiàn)狀態(tài)檢測管理功能模塊。
在使用的過程中,會出現(xiàn)網(wǎng)絡(luò)不穩(wěn)定的情況,而在TCP通信中,發(fā)生網(wǎng)絡(luò)問題就會導(dǎo)致上下位機連接中斷。沒有通信連接,那就無法發(fā)現(xiàn)相互掉線,這時候需要通過心跳機制實現(xiàn)狀態(tài)監(jiān)測。類似一端發(fā)送一個數(shù)據(jù)包內(nèi)容給對面,另一端收到后馬上返回一個響應(yīng)包,這樣的一個數(shù)據(jù)交互就是心跳交互[20]。通俗來說,就是定時發(fā)送一個自定義的心跳包,讓對方知道己方的存在,來確保連接的有效性。
下位機每間隔1 s向上位機發(fā)送一個包含特殊內(nèi)容數(shù)據(jù)的消息Ping,上位機收到后馬上返回一個消息Pong,于是雙方通過這樣一對心跳消息來確定TCP的連接是否斷開,如圖7所示。
圖7 心跳機制
在本文中,依據(jù)功能需求,基于心跳機制的原理,借助Netty提供的IdleStateHandler類,來實現(xiàn)處理下位機的連接狀態(tài)。
public userEventTriggered
(ChannelHandlerContext ctx, Object evt){
if(evt instanceof IdleStateEvent){
IdleStateEvent e =( IdleStateEvent) evt;
switch(e.state()){
case READER_IDLE:
handlerReaderIdle(ctx);
break;
case WRITER_IDLE;
handleWriterIdle(ctx);
break;
case ALL_IDLE:
handlerAllIdle(ctx);
break;
}
}
}
其中需要通過創(chuàng)建通用類負責接收心跳,客戶端發(fā)送心跳,在上文中提到過,使用Netty提供的IdleStateHandler類實現(xiàn)心跳的關(guān)鍵,根據(jù)不同的idle類型發(fā)生不同的idle類事件,而該事件的捕捉就是通過上文的userEventTriggered實現(xiàn)的。
心跳機制的實現(xiàn),下位機就需要按照設(shè)定周期頻繁的發(fā)送數(shù)據(jù)包,上位機就必須能夠響應(yīng)和處理下位機發(fā)送來的數(shù)據(jù)請求。這里,Netty框架提供的NettyServerHandler類又實現(xiàn)了多個重要的方法,設(shè)計使用非公平鎖機制提高系統(tǒng)的吞吐量,更好地處理與客戶端的連接、斷開和數(shù)據(jù)讀取。非公平鎖是指多個線程獲取鎖的順序,并不是按照申請鎖的順序,有可能申請的線程比先申請的線程優(yōu)先獲得鎖,收發(fā)效率較高。
對本系統(tǒng)軟件數(shù)據(jù)通信進行測試和試用,上位機軟件測試環(huán)境為Intel(R) Core(TM) i3-8100,內(nèi)存8 GB,CPU3.6 GHz,硬盤1 T,操作系統(tǒng)Windows 7 64位;下位機操作系統(tǒng)為Windows7,上下位機之間為千兆網(wǎng)絡(luò)連接,測試環(huán)境框架如圖8所示。
圖8 通信測試環(huán)境框架圖
本系統(tǒng)上位機軟件關(guān)鍵部分在于TCP服務(wù)器的設(shè)計,采用Netty通信框架設(shè)計,實現(xiàn)穩(wěn)定可靠的上下位機數(shù)據(jù)傳輸,滿足上位機接收處理下位機頻繁的數(shù)據(jù)發(fā)送需求。TCP服務(wù)器部分屬于底層開發(fā),所以采用WebSocket技術(shù)通過Web頁面進行模擬測試的數(shù)據(jù)展示。WebSocket是一種新的協(xié)議在HTML5下,其還是基于TCP的協(xié)議本質(zhì)上說。實現(xiàn)了全雙工通信在瀏覽器端與服務(wù)器之間,模擬Socket協(xié)議,可以雙向發(fā)送或接受信息,實現(xiàn)數(shù)據(jù)推送,主動由服務(wù)端推送向瀏覽器端;完成一次握手,由瀏覽器和服務(wù)器,即可以建立長時間的連接在兩者之間,實現(xiàn)數(shù)據(jù)傳輸,更加方便我們進行通信模擬測試。如圖9所示,對下位機部分進行了模擬設(shè)計實現(xiàn),充分達到真實的使用情況,實現(xiàn)心跳機制發(fā)送狀態(tài)數(shù)據(jù),以及模擬坐標數(shù)據(jù)發(fā)送。
圖9 下位機模擬程序
模擬下位機實現(xiàn)狀態(tài)數(shù)據(jù)發(fā)送,以周期1 s的時間模擬下位機向上位機發(fā)送狀態(tài)的協(xié)議內(nèi)容和手動發(fā)送模擬的測量試驗結(jié)果坐標數(shù)據(jù)。上位機通過瀏覽器頁面展示由下位機發(fā)送的心跳狀態(tài)數(shù)據(jù)和坐標試驗數(shù)據(jù),TCP服務(wù)器模擬接收數(shù)據(jù)測試結(jié)果如圖10所示。
圖10 上位機數(shù)據(jù)接收測試圖
通過模擬測試,下位機所發(fā)送的狀態(tài)檢測數(shù)據(jù)和試驗坐標數(shù)據(jù)上位機的TCP服務(wù)器都能正常接收,且全部顯示到測試頁面,滿足基本的功能需求。
最后對上位機接收數(shù)據(jù)處理性能進行對比測試。根據(jù)功能需求分析所提出的技術(shù)指標要求,需要上位機對接收數(shù)據(jù)的處理不能低于每秒鐘一個請求。創(chuàng)建兩組不同周期數(shù)據(jù)發(fā)送的對比測試,第一組設(shè)計1 000個樣本數(shù)據(jù),以周期1 s發(fā)送數(shù)據(jù),測試服務(wù)器接收處理請求的性能;第二組同樣設(shè)計1 000個樣本數(shù)據(jù),發(fā)送速率比第一組提高10倍以周期100 ms發(fā)送數(shù)據(jù),測試服務(wù)器接收處理請求的性能。這里采用JMeter開源測試軟件,模擬一個下位機以周期1 s的時間向上位機發(fā)送數(shù)據(jù)判斷上位機TCP服務(wù)器的接收情況,如圖11所示。由測試吞吐量結(jié)果可知,每秒能夠處理請求的次數(shù)約為1,能夠滿足功能需求。
圖11 第一組性能測試結(jié)果
第二組性能測試將數(shù)據(jù)發(fā)送速率設(shè)為100 ms,對服務(wù)器處理性能測試,測試結(jié)果如圖12所示。
圖12 第二組性能測試結(jié)果
從上述的兩組對比性能測試中,在1 000個樣本數(shù)據(jù)的情況下,將數(shù)據(jù)發(fā)送速率從1 s提高10倍的測試結(jié)果看,第一組的吞吐量測試結(jié)果為服務(wù)器每秒處理請求約1個,第二組的吞吐量測試結(jié)果為服務(wù)器每秒處理請求約8個,滿足性能要求以及技術(shù)指標。
進行了模擬測試和性能測試后,再對上位機軟件進行系統(tǒng)測試,測試的內(nèi)容為將上位機軟件置于真實的使用環(huán)境,測試上位機軟件是否能達到效果。
把上位機軟件置于試驗測試的界面,如圖13所示。從彈丸發(fā)射開始計算時間起始,上位機界面顯示模擬坐標計算為時間結(jié)束,來衡量數(shù)據(jù)通信和軟件系統(tǒng)響應(yīng)的情況。同時作為對性能測試的一個補充測試。
圖13 實際測試
通過對整個精度靶的系統(tǒng)聯(lián)調(diào)測試,可以得到在實際使用環(huán)境中的結(jié)果。從圖中的測試結(jié)果可以看到,從彈丸發(fā)射開始計時到最后上位機顯示坐標位置整個過程時間發(fā)生都在1 s以內(nèi),忽略掉計時操作的時間以及系統(tǒng)的響應(yīng)時間,數(shù)據(jù)的通信部分能夠滿足相應(yīng)的技術(shù)指標要求,整體上使用能夠滿足數(shù)據(jù)實時顯示的要求。
本文針對精度靶系統(tǒng)軟件功能的需求分析,參考一些該類型軟件,設(shè)計了一個采用B/S架構(gòu)的CCD精度靶上位機軟件,關(guān)鍵設(shè)計了上位機服務(wù)器整體結(jié)構(gòu)和核心模塊Netty通信架構(gòu)。通過模擬測試上位機滿足通過網(wǎng)絡(luò)穩(wěn)定接收下位機傳輸數(shù)據(jù)的功能需求;解決了C/S模式軟件的擴展難度大,維護成本高和用戶后期使用升級復(fù)雜等問題。與C/S模式不同,B/S模式軟件的界面是基于瀏覽器進行首次全新開發(fā),和服務(wù)器采用HTTP進行交互。本系統(tǒng)軟件目前前端頁面部分還未完善,存在頁面布局和功能缺陷問題。
經(jīng)分析選擇B/S架構(gòu)的設(shè)計思想[22]和面向?qū)ο蟮木幊谭妒剑档土烁髂K代碼之間的耦合性,使得軟件維護的效率提升,同時節(jié)省了軟件開發(fā)的成本,在一類具有上下位機工作屬性的控制軟件[23]設(shè)計方面具有重要意義。