張日旺,鄺美琪,李幸梓,崔港仔
(廣州新華學(xué)院信息科學(xué)學(xué)院,東莞 523133)
Android是一個專門為移動終端設(shè)備設(shè)計的操作系統(tǒng)平臺,憑借自身良好的穩(wěn)定性、可移植性和開放性,迅速占據(jù)了大部分的移動電子設(shè)備市場[1]。合作企業(yè)方給出的LTWin軟件是為指定儀器(本文中的應(yīng)用主要適配電池包氣密測試設(shè)備S30)提供豐富功能的工具,在移植前LTWin軟件已可運行在Windows XP、Windows 7、Windows 10操作系統(tǒng)的電腦上,而將該LTWin軟件從Windows端移植到Android端,不但讓測試者在不攜帶較重的電腦的情況下可以使用該軟件對產(chǎn)品進行參數(shù)測試,且可實時觀察到產(chǎn)品在儀器中的情況和檢測返回的數(shù)據(jù)變化情況。
將LTWin軟件移植至Android端,系統(tǒng)采用C/S架構(gòu),服務(wù)端與客戶端基于Android開發(fā),通信主要在TCP/IP網(wǎng)絡(luò)通信協(xié)議的基礎(chǔ)上進行,使用socket進行實現(xiàn)。根據(jù)已有的PC端的LTWin軟件功能進行需求分析,逐步地將功能移植至Android端。
對已給出的PC端LTWin軟件測試功能后,得知移植到Android端的應(yīng)用軟件具有以下功能需求:
(1)實現(xiàn)客戶端到服務(wù)端的連接,從客戶端發(fā)送包含指令的數(shù)據(jù)包到服務(wù)端,服務(wù)端可以正常接收。同時客戶端也能接收到服務(wù)端返回來的數(shù)據(jù),以實現(xiàn)設(shè)置儀器參數(shù)的功能,以及能控制儀器進行測試并查看測試結(jié)果的功能;
(2)軟件在接收到結(jié)果數(shù)據(jù)時,能在本地存儲數(shù)據(jù)的存儲需求,當(dāng)數(shù)據(jù)達到一定量時刪除舊數(shù)據(jù),確保不會占用大量的存儲空間。此外,能查看、查詢本地數(shù)據(jù),能實現(xiàn)根據(jù)條件搜索數(shù)據(jù)的查詢需求;
(3)能選定某些數(shù)據(jù),而后生成折線圖,實現(xiàn)數(shù)據(jù)可視化需求。
對于非功能需求而言,界面設(shè)計應(yīng)簡潔友好。
根據(jù)1.1中對軟件功能的需求分析,可以得到該應(yīng)用系統(tǒng)需要完成的功能子模塊主要有三個:通信模塊、數(shù)據(jù)庫模塊和數(shù)據(jù)可視化模塊。系統(tǒng)功能模塊圖如圖1所示。
本系統(tǒng)的整體架構(gòu)是以服務(wù)器作為橋梁,硬件設(shè)備由支持TCP/IP通信協(xié)議的通信模塊組成;S30儀器通過Socket與服務(wù)器連接。Android端與氣密性檢測設(shè)備同時連接服務(wù)器,從而實現(xiàn)遠程通信和數(shù)據(jù)傳輸。系統(tǒng)總體架構(gòu)如圖2所示。
S30儀器的遠程控制系統(tǒng)主要包括三個部分,分別是手機終端、公司網(wǎng)關(guān)服務(wù)器和S30儀器。用戶使用智能手機通過網(wǎng)絡(luò)連接到公司網(wǎng)關(guān)服務(wù)器,然后公司網(wǎng)關(guān)服務(wù)器連接到S30儀器,用戶發(fā)送帶有指令的數(shù)據(jù)包給公司網(wǎng)關(guān)服務(wù)器,然后公司網(wǎng)關(guān)服務(wù)器將數(shù)據(jù)包發(fā)送給S30儀器,S30儀器執(zhí)行相關(guān)的操作,將執(zhí)行結(jié)果返回到公司網(wǎng)關(guān)服務(wù)器,公司網(wǎng)關(guān)服務(wù)器再將結(jié)果通過網(wǎng)絡(luò)返回到手機終端,以此實現(xiàn)對S30儀器的控制與管理[2]。本文主要實現(xiàn)手機終端的設(shè)計。
由于已有PC端的軟件,因此本項目的UI界面設(shè)計主要仿照PC端的軟件操作界面進行類似功能的分類設(shè)計,即將類似的功能放在一個頁面中進行管理,這樣測試者可以依據(jù)需要的功能來尋找相應(yīng)的頁面即可找到相應(yīng)的功能,方便用戶進行操作,提高工作效率。這就涉及到頁面間的跳轉(zhuǎn)以及各頁面的控件布局設(shè)計。
2.1.1 頁面跳轉(zhuǎn)的設(shè)計與實現(xiàn)
本app主要有四大主頁面,分別是設(shè)置查詢、單機測試、聯(lián)機測試以及數(shù)據(jù)查詢。要實現(xiàn)在這四個頁面中進行跳轉(zhuǎn),本項目采用了Android Jetpack程序庫中的Navigation組件進行實現(xiàn),在完成Navigation的基本配置之后,由于在Navigation里頁面跳轉(zhuǎn)是交給NavController處理的,因此需要獲取NavController,獲取到之后通過navigate方法傳入Action的id,實現(xiàn)跳轉(zhuǎn)。四大頁面依次如圖3的(a)、(b)、(c)、(d)所示。
2.1.2用戶主控界面的設(shè)計與實現(xiàn)
用戶的主控界面含有大量的操作,其中在設(shè)置查詢中包含了八分頁,分別是首頁、時間/單位、壓力參數(shù)、測試參數(shù)、通訊設(shè)置、綜合設(shè)置、儀器信息和S20C配置,另外三個頁面無分頁。本研究使用ViewPager來設(shè)置查詢頁面的分頁,利用Android Jetpack程序庫中的Animation組件實現(xiàn)分頁間切換的頁面滑動動畫效果,頁面中的布局文件均采用LinerLayout作為整體布局,采用RelativeLayout作為內(nèi)部各組件的布局,利用ScrollView實現(xiàn)頁面的上下滾動,利用EditText實現(xiàn)測試參數(shù)的輸入,利用Text顯示測試的結(jié)果,采用Button來觸發(fā)各功能的具體操作。部分分頁界面如圖4的(a)、(b)、(c)、(d)所示。
2.2.1 控制功能設(shè)計
當(dāng)用戶打開功能界面時,設(shè)置好參數(shù),點擊相應(yīng)的功能進行測試,然后系統(tǒng)會查詢是否連接到了公司網(wǎng)關(guān)服務(wù)器,若已連接,則將帶有指令和數(shù)據(jù)的數(shù)據(jù)包發(fā)送給服務(wù)器端,服務(wù)端接收到數(shù)據(jù)包,解析之后發(fā)送給S30儀器進行檢測;如果系統(tǒng)檢測未連接公司網(wǎng)關(guān)服務(wù)器,則會提示用戶需要連接公司網(wǎng)關(guān)服務(wù)器,要求用戶輸入網(wǎng)關(guān)的IP地址和要控制的儀器的端口號,然后進行連接,連接成功,再進行已連接公司網(wǎng)關(guān)服務(wù)器時的相應(yīng)操作。
2.2.2 手機終端與公司網(wǎng)關(guān)服務(wù)器建立連接
實現(xiàn)手機終端和公司網(wǎng)關(guān)服務(wù)器之間連接涉及到了Socket通信[3]。Socket又被稱為“套接字”,是一種抽象層,被用來實現(xiàn)網(wǎng)絡(luò)上兩個設(shè)備之間的收發(fā)數(shù)據(jù),每一個Socket由一個IP地址和一個端口號唯一確定,通常被用來實現(xiàn)服務(wù)端和客戶端的連接[3]。
服務(wù)端實現(xiàn)步驟如下:
(1)服務(wù)端創(chuàng)建服務(wù)端的Socket服務(wù),即ServerSocket,開始監(jiān)聽來自客戶端的連接請求;
(2)當(dāng)接收到連接請求時,調(diào)用accept方法進行連接,客戶端Socket連接到服務(wù)端的ServerSocket;
(3)創(chuàng)建OutputStream和InputStream的對象實例,利用write方法和read方法與客戶端進行通信[4];
(4)當(dāng)結(jié)束通信時,調(diào)用Socket的close方法關(guān)閉連接。
客戶端實現(xiàn)步驟如下:
(1)建立客戶端的Socket服務(wù);
(2)客戶端調(diào)用connect方法與服務(wù)端進行Socket連接;
(3)創(chuàng)建OutputStream和InputStream的對象實例,利用write方法和read方法與服務(wù)端端進行通信;
(4)當(dāng)結(jié)束通信時,調(diào)用Socket中的close方法關(guān)閉連接。
客戶端(或服務(wù)端)獲取Socket中的輸出流,將數(shù)據(jù)寫入到輸出流,通過網(wǎng)絡(luò)發(fā)送到服務(wù)端(或客戶端)。獲取Socket中的輸入流,讀取里面的數(shù)據(jù),即完成一次通信。
服務(wù)端和客戶端的連接通信過程如圖5所示。
客戶端與服務(wù)器連接效果展示如圖6、圖7和圖8所示。
針對測試過程中存在數(shù)據(jù)查詢麻煩、接收的數(shù)據(jù)難以存儲等問題,該本地存儲數(shù)據(jù)模塊以Android為基礎(chǔ),利用SQLite數(shù)據(jù)庫技術(shù)設(shè)計,實現(xiàn)測試結(jié)果信息的快速獲取和顯示,提高查詢效率,并實現(xiàn)當(dāng)數(shù)據(jù)達到一定量時刪除舊數(shù)據(jù),來確保不會占用大量存儲空間。
該模塊采用數(shù)據(jù)層、邏輯層和應(yīng)用層三層體系結(jié)構(gòu),其中數(shù)據(jù)層是此部分的基礎(chǔ),主要負責(zé)測試結(jié)構(gòu)數(shù)據(jù)的存儲檢索;邏輯層負責(zé)鏈接數(shù)據(jù)層和應(yīng)用層;應(yīng)用層是應(yīng)用界面,將邏輯層獲取的請求信息展示給用戶。
在此我們需要使用到基本的操作——增刪改查,因此需要重寫這些操作,將其封裝到繼承了SQLiteOpenHelper的dbHelper類里。
操作步驟如下:
(1)創(chuàng)建一個數(shù)據(jù)庫:先創(chuàng)建一個DatabaseHelper對象,使用這個對象調(diào)用getWritableDatabase方法創(chuàng)建一個可讀寫的數(shù)據(jù)庫;
(2)創(chuàng)建表格:自定義一個數(shù)據(jù)庫子類db-Helper繼承SQLiteOpenHelper,重寫里面的onCreate和onUprade方法,在onCreate方法中寫好sql語句,并且采用execSQL(sql)方法運行sql語句,實現(xiàn)創(chuàng)建表格的操作;
(3)插入數(shù)據(jù)庫:創(chuàng)建ContentValues對象,取名叫values,使用put方法向該對象中插入鍵值對,最后調(diào)用sqliteDatabase的insert方法插入數(shù)據(jù)庫;
(4)修改數(shù)據(jù)庫:創(chuàng)建ContentValues對象,取名叫values,使用put方法向該對象中插入鍵值對,最后調(diào)用sqliteDatabase的update方法插入數(shù)據(jù)庫;
(5)刪除數(shù)據(jù):調(diào)用sqliteDatabase的delete方法刪除數(shù)據(jù);
(6)查詢數(shù)據(jù):調(diào)用sqliteDatabase的query方法遍歷查詢數(shù)據(jù)。
實現(xiàn)了基本操作之后,還要根據(jù)本系統(tǒng)的需求再定義一些操作。
當(dāng)數(shù)據(jù)達到2000條時,我們需要刪除舊數(shù)據(jù),然后才能繼續(xù)添加新數(shù)據(jù),SQL語句如下所示:
//刪除testinfo表里的數(shù)據(jù)
DELETE FROM testinfo
//當(dāng)數(shù)據(jù)條數(shù)大于2000行時
WHERE id>=2000 IN
//選擇其中的前100條進行刪除
(SELECT id FROM testinfo ORDER BY id LIMIT 100);
處理流程如圖9所示。
表1為檢測結(jié)果表,Id字段為主鍵,用其存儲檢測結(jié)果數(shù)據(jù)信息。
表1 檢測結(jié)果表
該模塊將根據(jù)得到的數(shù)據(jù)進行可視化,數(shù)據(jù)可視化是將數(shù)據(jù)用圖形化的方式來表示,可以幫助企業(yè)迅速明白某些數(shù)據(jù)的重要性,理解數(shù)據(jù)的背后含義。數(shù)據(jù)可視化通常是理解和交流分析的第一步,因為當(dāng)數(shù)據(jù)以圖形方式而非數(shù)字方式呈現(xiàn)時,更利于人們理解數(shù)據(jù),而且還可以實現(xiàn)多維度的數(shù)據(jù)比較。
本研究中使用折線圖來進行數(shù)據(jù)可視化。折線圖可以顯示隨時間(根據(jù)常用比例設(shè)置)而變化的連續(xù)數(shù)據(jù),因此非常適用于顯示在相等時間間隔下的數(shù)據(jù)變化趨勢。在折線圖中,類別數(shù)據(jù)沿水平軸均勻分布,所有值數(shù)據(jù)沿垂直軸均勻分布,可以使用戶更直觀地看到隨時間推移的檢測情況,能直接知道在多長時間、什么條件下氣密性達到了一個閾值,以便進行改進。
接收到輸入的數(shù)據(jù)之后,首先調(diào)用JFreeChart類的createLineChar(t)和setBackgroud-Pain(t)以及getTitle()方法,來設(shè)置折線圖的名稱、字體和顏色;其次則是CategoryPlot類的setDomainGridlinesVisible()、setRangeGridlines-Visible()、setDomainGridlinePaint()、setRange GridlinePain(t)方法實現(xiàn)x軸、y軸是否可見,以及網(wǎng)格橫豎線的顏色,setNoDataMessage()方法則表示當(dāng)沒有數(shù)據(jù)顯示時的文字說明。
隨后即是NumberAxis類的setStandardTick-Units()、setUpperMargin()、setAutoRangeIncludesZero()、setLabelAngle()方法來設(shè)置數(shù)據(jù)軸顯示的格式,數(shù)據(jù)范圍,是否包含0。然后到CategoryAxis類的setTickLabelFont()、setLabel-Font()、setCategoryLabelPositions()、setLower-Margin()、setUpperMargin()方法設(shè)置x軸坐標(biāo)和標(biāo)題的文字,左右邊距和橫軸傾斜角度;最后由LineAndShapeRenderer類的setBaseShapes-Visible()、setBaseLinesVisible()來決定最終折線圖是否顯示折點和折線。
主要的類及類與類之間的關(guān)系如圖10所示,選擇數(shù)據(jù)庫中的泄露率作為縱軸、壓強作為橫軸進行數(shù)據(jù)可視化的效果如圖11所示。
本文將主要運行于Windows版本的操作系統(tǒng)下的LTWin軟件功能移植至Android端。界面簡潔友好,布局符合邏輯,操作簡便,可以滿足針對測試電池包氣密性的工作人員的基本需求,使測試過程更加輕便,提高測試效率。但目前軟件可適配的氣密性檢測設(shè)備只有儀器S30,即可檢測氣密性的產(chǎn)品種類不多,故未來將會進一步適配其它儀器,以完善移植后的軟件。