亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于B/S的雙CCD相機(jī)精度靶測控系統(tǒng)軟件架構(gòu)設(shè)計(jì)

        2022-12-26 12:53:50高嘉韻倪晉平
        計(jì)算機(jī)測量與控制 2022年12期
        關(guān)鍵詞:機(jī)軟件下位瀏覽器

        高嘉韻,倪晉平,徐 飛

        (1.西安工業(yè)大學(xué) 光電工程學(xué)院,西安 710000; 2.西安工業(yè)大學(xué) 計(jì)算機(jī)學(xué)院,西安 710000)

        0 引言

        靶場試驗(yàn)測試作為武器研發(fā)、生產(chǎn)和測試的重要一環(huán),主要對武器的各種性能指標(biāo)進(jìn)行的檢測,以確定武器是否能夠達(dá)到預(yù)期的指標(biāo)要求。立靶密集度測試是槍彈生產(chǎn)檢驗(yàn)的關(guān)鍵參數(shù),雙線陣交會精度靶密集度參數(shù)測量系統(tǒng)因較高的測量精度、使用方便以及相對較低的使用成本而被廣泛使用[1-3]。系統(tǒng)包括三個部分,上位機(jī)軟件、數(shù)據(jù)采集處理下位機(jī)軟件和精度靶采集系統(tǒng),其中上位機(jī)軟件就是本文要設(shè)計(jì)實(shí)現(xiàn)的。

        目前國內(nèi)外對于該領(lǐng)域的測控軟件通常采用C/S(客戶端/服務(wù)器)架構(gòu)實(shí)現(xiàn)的,軟件形成兩層結(jié)構(gòu),服務(wù)器負(fù)責(zé)處理具有復(fù)雜邏輯的業(yè)務(wù)功能,客戶端實(shí)現(xiàn)用戶界面和簡單的數(shù)據(jù)處理。這種架構(gòu)軟件實(shí)際使用中一般需要專門的客戶端軟件安裝使用安裝,處理出現(xiàn)的問題難度較大,也難以功能擴(kuò)展,可能會出現(xiàn)開發(fā)一個全新的軟件的情況[4]。如丁力等[5]設(shè)計(jì)C/S架構(gòu)的控制管理系統(tǒng)有如下缺點(diǎn):系統(tǒng)擴(kuò)展性差,業(yè)務(wù)變更不靈活;兼容性差,開發(fā)工具不兼容,獨(dú)立客戶端安裝;維護(hù)和升級成本高。

        結(jié)合上述問題,精度靶測試系統(tǒng)上位機(jī)軟件采用拓展性和維護(hù)性方便、簡單、共享性強(qiáng)和訪問簡單的B/S(瀏覽器/服務(wù)器)架構(gòu)開發(fā)[6-7]。將用戶界面等在瀏覽器端實(shí)現(xiàn),為了不僅能簡化系統(tǒng)的維護(hù),還可以降低使用成本,將所有的功能邏輯都集中到了服務(wù)器端。

        1 軟件需求分析

        1.1 系統(tǒng)概述

        雙線陣交會精度靶測控系統(tǒng)整體上可分為精度靶測控系統(tǒng)軟件上位機(jī)部分、數(shù)據(jù)采集處理下位機(jī)部分和精度靶采集硬件系統(tǒng)三部分,如圖1所示。其中將上位機(jī)部分習(xí)慣稱為控制端,下位機(jī)和精度靶硬件采集系統(tǒng)整體稱為測量端,從使用角度來說,一般情況下上位機(jī)和測量端之間間隔100米左右,通過網(wǎng)線進(jìn)行連接,實(shí)現(xiàn)遠(yuǎn)程指令控制和數(shù)據(jù)傳輸?shù)氖褂眯枨蟆?/p>

        圖1 精度靶測控系統(tǒng)整體結(jié)構(gòu)圖

        精度靶測控系統(tǒng)功能主要是實(shí)現(xiàn)對整個試驗(yàn)流程進(jìn)行控制,需要上位機(jī)執(zhí)行相應(yīng)的控制命令,判斷當(dāng)前的任務(wù)或流程執(zhí)行情況,以及是否進(jìn)入下一個控制命令[8];其次是接收下位機(jī)傳輸?shù)臄?shù)據(jù)。這里控制方面主要需要實(shí)現(xiàn)遠(yuǎn)程控制網(wǎng)絡(luò)繼電器操作以及任務(wù)開始、結(jié)束的控制,數(shù)據(jù)方面主要是對下位接收的數(shù)據(jù)進(jìn)行一個直觀顯示和存儲。

        1.2 功能需求

        精度靶系統(tǒng)對于上位機(jī)的要求是能夠及時準(zhǔn)確的接收下位的數(shù)據(jù),同時對整個試驗(yàn)流程進(jìn)行功能控制。從上述情況來看,上位機(jī)主要實(shí)現(xiàn)功能分為以下幾個:

        1) 電源開關(guān)控制:上位機(jī)軟件啟動后,檢測與網(wǎng)絡(luò)繼電器連接狀態(tài),向網(wǎng)絡(luò)繼電器發(fā)送控制命令,從而實(shí)現(xiàn)遠(yuǎn)程控制下位機(jī)和精度靶硬件部分的電源開關(guān)。

        2) 狀態(tài)檢測:下位機(jī)軟件和精度靶硬件采集部分啟動后,下位機(jī)軟件獲取和硬件的連接狀態(tài),將連接狀態(tài)發(fā)送到上位機(jī)軟件進(jìn)行顯示,方便使用者知道下位機(jī)和精度靶硬件采集部分的連接情況,便于出現(xiàn)異常狀態(tài)問題的快速解決。

        3) 試驗(yàn)參數(shù)設(shè)置:該功能是精度靶測試試驗(yàn)前的相關(guān)參數(shù)初始化設(shè)置,包含試驗(yàn)任務(wù)的名稱、組數(shù)、每組的次數(shù)和試驗(yàn)操作人員的相關(guān)信息設(shè)置,以及測試用的彈種數(shù)據(jù)包含彈徑、彈長和彈速的設(shè)置。

        4) 測試試驗(yàn):該功能包含了多個子功能,開始試驗(yàn)、數(shù)據(jù)顯示、試驗(yàn)密集度參數(shù)計(jì)算、試驗(yàn)組數(shù)和結(jié)束試驗(yàn)。開始試驗(yàn)是使用者操作上位機(jī)向下位機(jī)發(fā)送開始試驗(yàn)的控制命令,下位機(jī)接收到指令后進(jìn)入測試狀態(tài);數(shù)據(jù)顯示是上位機(jī)軟件把從下位機(jī)接收到的試驗(yàn)數(shù)據(jù)結(jié)果進(jìn)行展示;試驗(yàn)密集度參數(shù)計(jì)算是由上位機(jī)完成的,在試驗(yàn)中,上位機(jī)接收到試驗(yàn)數(shù)據(jù)大于等于三的時候,程序會自動進(jìn)行參數(shù)結(jié)果的計(jì)算,也可以手動選擇計(jì)算;試驗(yàn)組數(shù)是在試驗(yàn)中進(jìn)行試驗(yàn)組別切換;試驗(yàn)結(jié)束同開始試驗(yàn),用戶操作上位機(jī)向下位機(jī)發(fā)送試驗(yàn)結(jié)束指令,且該功能不設(shè)置前置條件。

        5) 歷史數(shù)據(jù):在試驗(yàn)中,上位機(jī)會把從下位機(jī)接收到的試驗(yàn)結(jié)果和密集度參數(shù)計(jì)算的結(jié)果全部保存到本地?cái)?shù)據(jù)庫,并且以任務(wù)創(chuàng)建時間為名稱區(qū)別存儲,通過任務(wù)創(chuàng)建時間或名稱檢索對應(yīng)的歷史試驗(yàn)數(shù)據(jù),還可以選擇所需試驗(yàn)任務(wù)數(shù)據(jù)導(dǎo)出到Excel。

        2 軟件設(shè)計(jì)

        2.1 整體設(shè)計(jì)

        基于B/S架構(gòu)的上位機(jī)軟件的整體結(jié)構(gòu)如圖2所示,依據(jù)整體框圖的結(jié)構(gòu)層次,進(jìn)一步闡述層與層之間模塊的設(shè)計(jì)和信息的交互。上位機(jī)軟件整體分為上層、中層和下層,表示層位于最上層,是為了與用戶進(jìn)行交互的層面,用戶在界面觸發(fā)相關(guān)控制命令的按鈕操作,隨之用戶的請求及數(shù)據(jù)由表示層接收,接著對數(shù)據(jù)進(jìn)行處理,最后顯示處理后的數(shù)據(jù)。業(yè)務(wù)邏輯層作為紐帶存在于表示層和數(shù)據(jù)之間,需要依據(jù)業(yè)務(wù)的具體功能需求,實(shí)現(xiàn)相對應(yīng)的業(yè)務(wù)功能。該軟件系統(tǒng)數(shù)據(jù)來自與下位機(jī)的通信獲得,所以設(shè)計(jì)在中間層需要搭建TCP服務(wù)器進(jìn)行數(shù)據(jù)交互。數(shù)據(jù)層主要實(shí)現(xiàn)對數(shù)據(jù)庫的增刪改查,用于TCP服務(wù)器存儲從下位機(jī)獲取來的數(shù)據(jù)以及向歷史數(shù)據(jù)查詢功能模塊提供數(shù)據(jù)支持。

        圖2 上位機(jī)軟件系統(tǒng)整體框圖

        服務(wù)器和瀏覽器作為B/S軟件架構(gòu)的核心。其中瀏覽器作為用戶直接操作的層面,主要包含功能操作、發(fā)送請求和獲取數(shù)據(jù),最后通過瀏覽器展示出來。服務(wù)器承載了大多數(shù)的業(yè)務(wù)分析數(shù)據(jù)處理,也是真正的實(shí)現(xiàn)界面應(yīng)用層各模塊的業(yè)務(wù)邏輯,例如在和數(shù)據(jù)庫部分的交互中,專門設(shè)計(jì)了數(shù)據(jù)緩存處理,數(shù)據(jù)查詢的優(yōu)化等。更重要的是,在與下位機(jī)的交互中,提供可靠的數(shù)據(jù)傳輸,較好的傳輸性能。

        根據(jù)軟件系統(tǒng)整體設(shè)計(jì)數(shù)據(jù)流圖,如圖3所示,對上位機(jī)軟件的功能需求進(jìn)行分析整理,以技術(shù)出發(fā)的角度,上位機(jī)軟件服務(wù)器部分設(shè)計(jì)實(shí)現(xiàn)了應(yīng)用Netty通信框架、HTTP傳輸方式[9]、數(shù)據(jù)庫等的搭建。其中,服務(wù)器的Netty通信框架的設(shè)計(jì)與實(shí)現(xiàn)應(yīng)用是核心問題,保證了和下位機(jī)之間穩(wěn)定的數(shù)據(jù)傳輸。Netty多用于搭建數(shù)據(jù)通信底層部分,并且是基于TCP通信協(xié)議實(shí)現(xiàn),Netty因其非阻塞通信方式,實(shí)現(xiàn)了優(yōu)異的性能而被廣泛應(yīng)用,也是目前大多數(shù)框架的主流或被服務(wù)端首選用來搭建軟件底層框架。

        圖3 軟件系統(tǒng)整體數(shù)據(jù)流圖

        2.2 相關(guān)技術(shù)

        2.2.1 B/S架構(gòu)

        目前軟件常用的開發(fā)模式有兩種,C/S和B/S[10]。C/S模式,范圍比較有限,大部分基于局域網(wǎng)環(huán)境使用,因?yàn)樗募軜?gòu)主要是由表示層和數(shù)據(jù)層構(gòu)成的,所以使用方式必須是安裝獨(dú)有客戶端使用,且難以一次開發(fā)實(shí)現(xiàn)多平臺的使用。C/S這種架構(gòu)還有著一些其他缺點(diǎn),舉例來說,在開發(fā)者方面,客戶端的升級和維護(hù)增加了工作量;對于用戶來說,時常進(jìn)行迭代也增加了使用成本。因此,需要簡化客戶端的安裝部署工作。

        B/S模式下,選擇了瀏覽器成為客戶端,避免進(jìn)行繁瑣的客戶端安裝工作,使其可以專注于業(yè)務(wù)功能邏輯的開發(fā)實(shí)現(xiàn)。B/S是一個由三個主要部分組成的Web應(yīng)用程序:瀏覽器、服務(wù)器、數(shù)據(jù)庫[11]。承擔(dān)用戶交互的主要應(yīng)用軟件,成為了瀏覽器部分,但是不承擔(dān)業(yè)務(wù)部署和功能性開發(fā),服務(wù)器端即可完成所有的業(yè)務(wù)邏輯。并且通過瀏覽器即可訪問系統(tǒng),瀏覽器的UI設(shè)計(jì)更加美觀多樣化,升級方便。

        2.2.2 Netty框架

        Netty 是一個利用 Java 的高級網(wǎng)絡(luò)的能力,隱藏其背后的復(fù)雜性而提供一個易于使用的 API 的客戶端/服務(wù)器框架[12]。Netty實(shí)現(xiàn)了多種通信協(xié)議的支持,因其使用簡單,對非阻塞通信方式進(jìn)行封裝;功能強(qiáng)大,支持多種主流協(xié)議,內(nèi)置集成了解碼功能;穩(wěn)定,目前已經(jīng)修復(fù)了框架已發(fā)現(xiàn)的缺陷。所以,它已經(jīng)成為大多框架和項(xiàng)目實(shí)現(xiàn)的底層,并被許多開發(fā)者青睞。Netty框架的底層實(shí)現(xiàn)包括了一個非阻塞的IO架構(gòu),允許開發(fā)人員輕松地編寫相關(guān)的應(yīng)用程序,以達(dá)到優(yōu)化網(wǎng)絡(luò)編程的目的,雖然Netty的底層框架邏輯實(shí)現(xiàn)非常復(fù)雜,但是其API簡單易用,開發(fā)者在編程中易于繞開業(yè)務(wù)層實(shí)現(xiàn)。其構(gòu)成有三個模塊:傳輸服務(wù),支持的協(xié)議和核心模塊[13]。

        Netty在設(shè)計(jì)上有以下幾個優(yōu)點(diǎn):NIO通信;無鎖化的串行設(shè)計(jì)理念;高效的并發(fā)編程;高性能的序列化框架等[14]。本系統(tǒng)選擇Netty主要是三方面的優(yōu)勢:并發(fā)高、傳輸可靠和封裝好。

        1)并發(fā)高:對比于BIO(阻塞IO),Netty框架是基于非阻塞IO開發(fā)的網(wǎng)絡(luò)通信框架。其單線程能處理的連接數(shù)比BIO要高出很多。當(dāng)建立了一個連接之后,接著還有兩個步驟,先是將客戶端發(fā)過來的數(shù)據(jù)全部接收,然后是在服務(wù)器處理完請求給客戶端響應(yīng)。這也是NIO和BIO的一個主要區(qū)別。在BIO中,等候客戶端發(fā)送數(shù)據(jù)這個過程是阻塞的,這樣就造成了一個線程只能處理一個請求的情況,而且計(jì)算機(jī)的處理線程也不是無限的。但是在NIO中,當(dāng)一個套接字建立好以后,Thread類不會像BIO一樣將其阻塞,而且將請求推到了選擇器,由選擇器去不停地遍歷所有產(chǎn)生的套接字,當(dāng)有一個套接字建立,選擇器就會通知Thread類,然后交由Thread類處理后再響應(yīng)給客戶端,這樣整個流程是非阻塞的。

        2)傳輸快:Netty的數(shù)據(jù)發(fā)送和接收主要是使用bytebuffer,其使用對外內(nèi)存直接對套接字進(jìn)行讀寫操作。如果使用傳統(tǒng)的堆內(nèi)存對套接字進(jìn)行讀寫,Java虛擬機(jī)會將buffer直接復(fù)制一份到內(nèi)存中后再寫入套接字,多了一次緩沖區(qū)的內(nèi)存復(fù)制操作。但是Netty提供了一種組合ByteBuf,可以避免這樣的情況,因?yàn)槠洳]有將Buffer組合起來,而是保存了它們的引用,本質(zhì)上是避免了數(shù)據(jù)的復(fù)制,實(shí)現(xiàn)了零拷貝。Netty中還使用了FileChannel的transfer to 方法,此方法依賴于操作系統(tǒng)實(shí)現(xiàn)零拷貝機(jī)制。

        3)封裝好:編程過程中,從代碼量來看,Netty有很多自帶處理方法,實(shí)現(xiàn)連接、請求和接入等[16]。如ChannelHandler及其實(shí)現(xiàn)類,ChannelHandler 接口定義了許多事件處理的方法, Netty開發(fā)中需要自定義一個 Handler 類去實(shí)現(xiàn) ChannelHandle接口或其子接口或其實(shí)現(xiàn)類,然后我們可以通過重寫這些方法去實(shí)現(xiàn)具 體的業(yè)務(wù)邏輯。channelActive通道就緒事件,channelRead通道讀取數(shù)據(jù)事件,exceptionCaught通道發(fā)生異常的事件。

        3 軟件設(shè)計(jì)關(guān)鍵技術(shù)

        在軟件整體設(shè)計(jì)中提到,TCP服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)是上位機(jī)系統(tǒng)中最關(guān)鍵部分。承擔(dān)著與下位機(jī)通信,接收、發(fā)送、解析、保存數(shù)據(jù)等功能。其中主要就是可靠接收傳輸消息和及時發(fā)送消息指令,同時考慮到功能需求分析中下位機(jī)會頻繁發(fā)送數(shù)據(jù)等問題,故選用了Netty通信框架搭建TCP服務(wù)器底層,通信架構(gòu)如圖4所示。在Netty通信框架的應(yīng)用過程中主要研究了適應(yīng)于本系統(tǒng)基于Netty的通信實(shí)現(xiàn)、傳輸中TCP粘包拆包處理和心跳監(jiān)測機(jī)制的應(yīng)用。

        圖4 通信框架圖

        3.1 基于Netty的通信實(shí)現(xiàn)

        Netty被定義為是一個基于Java 非阻塞I/O(輸入/輸出)的異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架[17-18],提供了高層次的抽象來簡化TCP服務(wù)器的編程,具有高性能和高可靠性的特點(diǎn),且廣泛應(yīng)用于客戶端與服務(wù)器之間長連接、高并發(fā)的場景。近幾年,Netty框架在計(jì)算機(jī)互聯(lián)網(wǎng)行業(yè)熱門起來,已經(jīng)成為了Java網(wǎng)絡(luò)編程框架的首選。

        基本實(shí)現(xiàn)思路,通信的讀寫邏輯均是啟動階段實(shí)現(xiàn)連接數(shù)據(jù)的讀寫邏輯,其通過邏輯處理鏈Pipeline來添加邏輯處理器。首先,下位機(jī)連接成功回調(diào)處理器的channelActive()方法,當(dāng)下位機(jī)和上位機(jī)分別接收到對方的消息回調(diào)自己的處理器的channelRead()方法;接著是上位機(jī)和下位機(jī)向?qū)Ψ綄憯?shù)據(jù)的時候調(diào)用writeAndFlush()方法,規(guī)定上位機(jī)和下位機(jī)之間交互信息的二進(jìn)制數(shù)據(jù)傳輸載體為ByteBuf。

        Netty服務(wù)器端的實(shí)現(xiàn),是被動的接收發(fā)送請求,為了避免出現(xiàn)服務(wù)器之間多端口產(chǎn)生沖突的問題,將服務(wù)器的端口號固定且綁定為6000。首先,創(chuàng)建ServerBootstrap()實(shí)例,設(shè)置并且綁定Reactor()線程池:EventLoopGroup,EventLoop就是處理所有注冊到該線程的選擇器上的;設(shè)置并綁定服務(wù)器端的Channel();TCP鏈路建立時創(chuàng)建ChannelPipeline()方法,添加并設(shè)置ChannelHandler(),用來處理網(wǎng)絡(luò)事件;綁定監(jiān)聽端口并啟動服務(wù)端;然后進(jìn)入Netty獨(dú)有流程,通過多路復(fù)用器輪詢,進(jìn)行網(wǎng)絡(luò)事件通知,最后執(zhí)行Netty系統(tǒng)和業(yè)務(wù)通過執(zhí)行pipline中的方法最終調(diào)度調(diào)用HandlerChannel()方法,過程如圖5所示。

        圖5 基于Netty服務(wù)器實(shí)現(xiàn)流程圖

        實(shí)現(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) // 線程隊(duì)列并發(fā)數(shù)的設(shè)置

        .channel(NioServerSocketChannel.class)

        .childOption(ChannelOption.SO_KEEPALIVE, true) //保持活動的連接狀態(tài)設(shè)置

        .childHandler((ChannelInit)(ch)->{});

        //服務(wù)器啟動并綁定端口

        bind(serverBootstrap, PORT);

        // 對關(guān)閉通道進(jìn)行監(jiān)聽

        cf.channel().closeFuture().sync();

        } catch (Exception e) {

        log.error(" netty服務(wù)啟動異常 " + e.getMessage());

        } finally {

        workerGroup.shutdownGracefully();

        bossGroup.shutdownGracefully();

        }

        }

        在Netty框架的設(shè)計(jì)與實(shí)現(xiàn)應(yīng)用的過程中,主要實(shí)現(xiàn)了基礎(chǔ)的數(shù)據(jù)通信交互后,因?yàn)門CP使用的是一種“數(shù)據(jù)流”的方式傳輸,還需要設(shè)計(jì)并且解決基于TCP數(shù)據(jù)傳輸過程中出現(xiàn)的粘包拆包的問題。

        3.2 TCP數(shù)據(jù)處理

        TCP是一種“數(shù)據(jù)流”的協(xié)議,處理數(shù)據(jù)包以流的方式,所以在接收數(shù)據(jù)的時候不能完整的得到一條數(shù)據(jù)稱為TCP粘包拆包。Netty這里提供了消息定長度,將傳輸消息大小固定不夠的空位用空格補(bǔ)齊然后發(fā)送;符號分割即用特殊符合進(jìn)行標(biāo)識,接收方遇到標(biāo)識符就知道是下一條數(shù)據(jù);發(fā)送長度,每次發(fā)送數(shù)據(jù)的時候?qū)⑦@條數(shù)據(jù)的長度一并發(fā)送,這樣對方解析的時候根據(jù)長度來判斷數(shù)據(jù)接收是否完整。本軟件采用了換行符的處理方式,結(jié)合Netty提供的多種解碼器來解決這種問題。并且設(shè)計(jì)了自己的處理方法,順序遍歷ByteBuffer中的刻度字節(jié)[19],查找標(biāo)志位“/n”。

        不斷地從TCP緩沖區(qū)中讀取數(shù)據(jù),每次都需要判斷這是不是一個完整的包讀取完后,假如當(dāng)下讀到的消息不能夠拼成完整的業(yè)務(wù)數(shù)據(jù)包,那就先把該數(shù)據(jù)保留,再從TCP緩沖區(qū)中讀出待得到完整的消息包。數(shù)據(jù)內(nèi)容正確需要進(jìn)行業(yè)務(wù)處理,推向前臺頁面或者存入數(shù)據(jù)庫,流程如圖6所示。

        圖6 TCP數(shù)據(jù)處理流程圖

        實(shí)現(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());

        }

        實(shí)現(xiàn)了TCP傳輸中粘包拆包問題的解決方法后,還需要通過對Netty框架提供的心跳機(jī)制功能接口進(jìn)行研究,來實(shí)現(xiàn)狀態(tài)檢測管理功能模塊。

        3.3 狀態(tài)監(jiān)測管理

        在使用的過程中,會出現(xiàn)網(wǎng)絡(luò)不穩(wěn)定的情況,而在TCP通信中,發(fā)生網(wǎng)絡(luò)問題就會導(dǎo)致上下位機(jī)連接中斷。沒有通信連接,那就無法發(fā)現(xiàn)相互掉線,這時候需要通過心跳機(jī)制實(shí)現(xiàn)狀態(tài)監(jiān)測。類似一端發(fā)送一個數(shù)據(jù)包內(nèi)容給對面,另一端收到后馬上返回一個響應(yīng)包,這樣的一個數(shù)據(jù)交互就是心跳交互[20]。通俗來說,就是定時發(fā)送一個自定義的心跳包,讓對方知道己方的存在,來確保連接的有效性。

        下位機(jī)每間隔1 s向上位機(jī)發(fā)送一個包含特殊內(nèi)容數(shù)據(jù)的消息Ping,上位機(jī)收到后馬上返回一個消息Pong,于是雙方通過這樣一對心跳消息來確定TCP的連接是否斷開,如圖7所示。

        圖7 心跳機(jī)制

        在本文中,依據(jù)功能需求,基于心跳機(jī)制的原理,借助Netty提供的IdleStateHandler類,來實(shí)現(xiàn)處理下位機(jī)的連接狀態(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ù)責(zé)接收心跳,客戶端發(fā)送心跳,在上文中提到過,使用Netty提供的IdleStateHandler類實(shí)現(xiàn)心跳的關(guān)鍵,根據(jù)不同的idle類型發(fā)生不同的idle類事件,而該事件的捕捉就是通過上文的userEventTriggered實(shí)現(xiàn)的。

        心跳機(jī)制的實(shí)現(xiàn),下位機(jī)就需要按照設(shè)定周期頻繁的發(fā)送數(shù)據(jù)包,上位機(jī)就必須能夠響應(yīng)和處理下位機(jī)發(fā)送來的數(shù)據(jù)請求。這里,Netty框架提供的NettyServerHandler類又實(shí)現(xiàn)了多個重要的方法,設(shè)計(jì)使用非公平鎖機(jī)制提高系統(tǒng)的吞吐量,更好地處理與客戶端的連接、斷開和數(shù)據(jù)讀取。非公平鎖是指多個線程獲取鎖的順序,并不是按照申請鎖的順序,有可能申請的線程比先申請的線程優(yōu)先獲得鎖,收發(fā)效率較高。

        4 通信測試

        對本系統(tǒng)軟件數(shù)據(jù)通信進(jìn)行測試和試用,上位機(jī)軟件測試環(huán)境為Intel(R) Core(TM) i3-8100,內(nèi)存8 GB,CPU3.6 GHz,硬盤1 T,操作系統(tǒng)Windows 7 64位;下位機(jī)操作系統(tǒng)為Windows7,上下位機(jī)之間為千兆網(wǎng)絡(luò)連接,測試環(huán)境框架如圖8所示。

        圖8 通信測試環(huán)境框架圖

        4.1 模擬測試

        本系統(tǒng)上位機(jī)軟件關(guān)鍵部分在于TCP服務(wù)器的設(shè)計(jì),采用Netty通信框架設(shè)計(jì),實(shí)現(xiàn)穩(wěn)定可靠的上下位機(jī)數(shù)據(jù)傳輸,滿足上位機(jī)接收處理下位機(jī)頻繁的數(shù)據(jù)發(fā)送需求。TCP服務(wù)器部分屬于底層開發(fā),所以采用WebSocket技術(shù)通過Web頁面進(jìn)行模擬測試的數(shù)據(jù)展示。WebSocket是一種新的協(xié)議在HTML5下,其還是基于TCP的協(xié)議本質(zhì)上說。實(shí)現(xiàn)了全雙工通信在瀏覽器端與服務(wù)器之間,模擬Socket協(xié)議,可以雙向發(fā)送或接受信息,實(shí)現(xiàn)數(shù)據(jù)推送,主動由服務(wù)端推送向?yàn)g覽器端;完成一次握手,由瀏覽器和服務(wù)器,即可以建立長時間的連接在兩者之間,實(shí)現(xiàn)數(shù)據(jù)傳輸,更加方便我們進(jìn)行通信模擬測試。如圖9所示,對下位機(jī)部分進(jìn)行了模擬設(shè)計(jì)實(shí)現(xiàn),充分達(dá)到真實(shí)的使用情況,實(shí)現(xiàn)心跳機(jī)制發(fā)送狀態(tài)數(shù)據(jù),以及模擬坐標(biāo)數(shù)據(jù)發(fā)送。

        圖9 下位機(jī)模擬程序

        模擬下位機(jī)實(shí)現(xiàn)狀態(tài)數(shù)據(jù)發(fā)送,以周期1 s的時間模擬下位機(jī)向上位機(jī)發(fā)送狀態(tài)的協(xié)議內(nèi)容和手動發(fā)送模擬的測量試驗(yàn)結(jié)果坐標(biāo)數(shù)據(jù)。上位機(jī)通過瀏覽器頁面展示由下位機(jī)發(fā)送的心跳狀態(tài)數(shù)據(jù)和坐標(biāo)試驗(yàn)數(shù)據(jù),TCP服務(wù)器模擬接收數(shù)據(jù)測試結(jié)果如圖10所示。

        圖10 上位機(jī)數(shù)據(jù)接收測試圖

        通過模擬測試,下位機(jī)所發(fā)送的狀態(tài)檢測數(shù)據(jù)和試驗(yàn)坐標(biāo)數(shù)據(jù)上位機(jī)的TCP服務(wù)器都能正常接收,且全部顯示到測試頁面,滿足基本的功能需求。

        4.2 性能測試

        最后對上位機(jī)接收數(shù)據(jù)處理性能進(jìn)行對比測試。根據(jù)功能需求分析所提出的技術(shù)指標(biāo)要求,需要上位機(jī)對接收數(shù)據(jù)的處理不能低于每秒鐘一個請求。創(chuàng)建兩組不同周期數(shù)據(jù)發(fā)送的對比測試,第一組設(shè)計(jì)1 000個樣本數(shù)據(jù),以周期1 s發(fā)送數(shù)據(jù),測試服務(wù)器接收處理請求的性能;第二組同樣設(shè)計(jì)1 000個樣本數(shù)據(jù),發(fā)送速率比第一組提高10倍以周期100 ms發(fā)送數(shù)據(jù),測試服務(wù)器接收處理請求的性能。這里采用JMeter開源測試軟件,模擬一個下位機(jī)以周期1 s的時間向上位機(jī)發(fā)送數(shù)據(jù)判斷上位機(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ù)指標(biāo)。

        4.3 實(shí)際測試

        進(jìn)行了模擬測試和性能測試后,再對上位機(jī)軟件進(jìn)行系統(tǒng)測試,測試的內(nèi)容為將上位機(jī)軟件置于真實(shí)的使用環(huán)境,測試上位機(jī)軟件是否能達(dá)到效果。

        把上位機(jī)軟件置于試驗(yàn)測試的界面,如圖13所示。從彈丸發(fā)射開始計(jì)算時間起始,上位機(jī)界面顯示模擬坐標(biāo)計(jì)算為時間結(jié)束,來衡量數(shù)據(jù)通信和軟件系統(tǒng)響應(yīng)的情況。同時作為對性能測試的一個補(bǔ)充測試。

        圖13 實(shí)際測試

        通過對整個精度靶的系統(tǒng)聯(lián)調(diào)測試,可以得到在實(shí)際使用環(huán)境中的結(jié)果。從圖中的測試結(jié)果可以看到,從彈丸發(fā)射開始計(jì)時到最后上位機(jī)顯示坐標(biāo)位置整個過程時間發(fā)生都在1 s以內(nèi),忽略掉計(jì)時操作的時間以及系統(tǒng)的響應(yīng)時間,數(shù)據(jù)的通信部分能夠滿足相應(yīng)的技術(shù)指標(biāo)要求,整體上使用能夠滿足數(shù)據(jù)實(shí)時顯示的要求。

        5 結(jié)束語

        本文針對精度靶系統(tǒng)軟件功能的需求分析,參考一些該類型軟件,設(shè)計(jì)了一個采用B/S架構(gòu)的CCD精度靶上位機(jī)軟件,關(guān)鍵設(shè)計(jì)了上位機(jī)服務(wù)器整體結(jié)構(gòu)和核心模塊Netty通信架構(gòu)。通過模擬測試上位機(jī)滿足通過網(wǎng)絡(luò)穩(wěn)定接收下位機(jī)傳輸數(shù)據(jù)的功能需求;解決了C/S模式軟件的擴(kuò)展難度大,維護(hù)成本高和用戶后期使用升級復(fù)雜等問題。與C/S模式不同,B/S模式軟件的界面是基于瀏覽器進(jìn)行首次全新開發(fā),和服務(wù)器采用HTTP進(jìn)行交互。本系統(tǒng)軟件目前前端頁面部分還未完善,存在頁面布局和功能缺陷問題。

        經(jīng)分析選擇B/S架構(gòu)的設(shè)計(jì)思想[22]和面向?qū)ο蟮木幊谭妒?,降低了各模塊代碼之間的耦合性,使得軟件維護(hù)的效率提升,同時節(jié)省了軟件開發(fā)的成本,在一類具有上下位機(jī)工作屬性的控制軟件[23]設(shè)計(jì)方面具有重要意義。

        猜你喜歡
        機(jī)軟件下位瀏覽器
        反瀏覽器指紋追蹤
        電子制作(2019年10期)2019-06-17 11:45:14
        發(fā)射機(jī)房監(jiān)控系統(tǒng)之下位機(jī)
        道岔監(jiān)測系統(tǒng)上位機(jī)軟件設(shè)計(jì)
        景洪電廠監(jiān)控系統(tǒng)下位機(jī)數(shù)據(jù)傳輸網(wǎng)絡(luò)改造
        圍觀黨“下位”,吐槽帝“登基”
        基于正交試驗(yàn)法的北斗用戶機(jī)軟件測試用例設(shè)計(jì)
        環(huán)球?yàn)g覽器
        再見,那些年我們嘲笑過的IE瀏覽器
        PCI-e高速數(shù)據(jù)采集卡的驅(qū)動與上位機(jī)軟件設(shè)計(jì)
        電子器件(2015年5期)2015-12-29 08:43:12
        CAN總線并發(fā)通信時下位機(jī)應(yīng)用軟件設(shè)計(jì)
        国产乱人对白| 视频精品亚洲一区二区| 精品日韩一区二区三区av| 欧美高清精品一区二区| 欧美一区二区三区红桃小说 | 66lu国产在线观看| 精品久久久久久国产潘金莲| 久草中文在线这里只有精品| 99无码熟妇丰满人妻啪啪| 吃奶还摸下面动态图gif| 亚洲国产精品无码久久九九大片健| 国产精品夜色视频久久| 热re99久久精品国99热| 欧美亚洲精品一区二区| 国产精品久久无码免费看| 亚洲天堂av在线免费观看| 久久性爱视频| 日本强好片久久久久久aaa| 国产一区二区三区亚洲天堂| 亚洲av毛片在线网站| 97精品国产97久久久久久免费| 亚洲伊人久久大香线蕉综合图片| 国产一区二区三区视频了| 妇女性内射冈站hdwwwooo | 久久久久亚洲AV无码去区首| 一级老熟女免费黄色片| 亚洲精品久久久久成人2007| 国模精品无码一区二区二区| 人妻少妇久久精品一区二区| 免费的小黄片在线观看视频| 桃花影院理论片在线| 中文亚洲爆乳av无码专区| 国产一区二区杨幂在线观看性色| 色狠狠色狠狠综合天天| 国产午夜激无码av毛片| 91国产自拍视频在线| 国产偷国产偷亚洲高清视频| 天堂а√在线中文在线新版| 久9热免费精品视频在线观看| 性感美女脱内裤无遮挡| 免费看美女被靠的网站|