張日旺,鄺美琪,李幸梓,崔港仔
(廣州新華學院信息科學學院,東莞 523133)
Android是一個專門為移動終端設備設計的操作系統平臺,憑借自身良好的穩定性、可移植性和開放性,迅速占據了大部分的移動電子設備市場[1]。合作企業方給出的LTWin軟件是為指定儀器(本文中的應用主要適配電池包氣密測試設備S30)提供豐富功能的工具,在移植前LTWin軟件已可運行在Windows XP、Windows 7、Windows 10操作系統的電腦上,而將該LTWin軟件從Windows端移植到Android端,不但讓測試者在不攜帶較重的電腦的情況下可以使用該軟件對產品進行參數測試,且可實時觀察到產品在儀器中的情況和檢測返回的數據變化情況。
將LTWin軟件移植至Android端,系統采用C/S架構,服務端與客戶端基于Android開發,通信主要在TCP/IP網絡通信協議的基礎上進行,使用socket進行實現。根據已有的PC端的LTWin軟件功能進行需求分析,逐步地將功能移植至Android端。
對已給出的PC端LTWin軟件測試功能后,得知移植到Android端的應用軟件具有以下功能需求:
(1)實現客戶端到服務端的連接,從客戶端發送包含指令的數據包到服務端,服務端可以正常接收。同時客戶端也能接收到服務端返回來的數據,以實現設置儀器參數的功能,以及能控制儀器進行測試并查看測試結果的功能;
(2)軟件在接收到結果數據時,能在本地存儲數據的存儲需求,當數據達到一定量時刪除舊數據,確保不會占用大量的存儲空間。此外,能查看、查詢本地數據,能實現根據條件搜索數據的查詢需求;
(3)能選定某些數據,而后生成折線圖,實現數據可視化需求。
對于非功能需求而言,界面設計應簡潔友好。
根據1.1中對軟件功能的需求分析,可以得到該應用系統需要完成的功能子模塊主要有三個:通信模塊、數據庫模塊和數據可視化模塊。系統功能模塊圖如圖1所示。
本系統的整體架構是以服務器作為橋梁,硬件設備由支持TCP/IP通信協議的通信模塊組成;S30儀器通過Socket與服務器連接。Android端與氣密性檢測設備同時連接服務器,從而實現遠程通信和數據傳輸。系統總體架構如圖2所示。
S30儀器的遠程控制系統主要包括三個部分,分別是手機終端、公司網關服務器和S30儀器。用戶使用智能手機通過網絡連接到公司網關服務器,然后公司網關服務器連接到S30儀器,用戶發送帶有指令的數據包給公司網關服務器,然后公司網關服務器將數據包發送給S30儀器,S30儀器執行相關的操作,將執行結果返回到公司網關服務器,公司網關服務器再將結果通過網絡返回到手機終端,以此實現對S30儀器的控制與管理[2]。本文主要實現手機終端的設計。
由于已有PC端的軟件,因此本項目的UI界面設計主要仿照PC端的軟件操作界面進行類似功能的分類設計,即將類似的功能放在一個頁面中進行管理,這樣測試者可以依據需要的功能來尋找相應的頁面即可找到相應的功能,方便用戶進行操作,提高工作效率。這就涉及到頁面間的跳轉以及各頁面的控件布局設計。
2.1.1 頁面跳轉的設計與實現
本app主要有四大主頁面,分別是設置查詢、單機測試、聯機測試以及數據查詢。要實現在這四個頁面中進行跳轉,本項目采用了Android Jetpack程序庫中的Navigation組件進行實現,在完成Navigation的基本配置之后,由于在Navigation里頁面跳轉是交給NavController處理的,因此需要獲取NavController,獲取到之后通過navigate方法傳入Action的id,實現跳轉。四大頁面依次如圖3的(a)、(b)、(c)、(d)所示。
2.1.2用戶主控界面的設計與實現
用戶的主控界面含有大量的操作,其中在設置查詢中包含了八分頁,分別是首頁、時間/單位、壓力參數、測試參數、通訊設置、綜合設置、儀器信息和S20C配置,另外三個頁面無分頁。本研究使用ViewPager來設置查詢頁面的分頁,利用Android Jetpack程序庫中的Animation組件實現分頁間切換的頁面滑動動畫效果,頁面中的布局文件均采用LinerLayout作為整體布局,采用RelativeLayout作為內部各組件的布局,利用ScrollView實現頁面的上下滾動,利用EditText實現測試參數的輸入,利用Text顯示測試的結果,采用Button來觸發各功能的具體操作。部分分頁界面如圖4的(a)、(b)、(c)、(d)所示。
2.2.1 控制功能設計
當用戶打開功能界面時,設置好參數,點擊相應的功能進行測試,然后系統會查詢是否連接到了公司網關服務器,若已連接,則將帶有指令和數據的數據包發送給服務器端,服務端接收到數據包,解析之后發送給S30儀器進行檢測;如果系統檢測未連接公司網關服務器,則會提示用戶需要連接公司網關服務器,要求用戶輸入網關的IP地址和要控制的儀器的端口號,然后進行連接,連接成功,再進行已連接公司網關服務器時的相應操作。
2.2.2 手機終端與公司網關服務器建立連接
實現手機終端和公司網關服務器之間連接涉及到了Socket通信[3]。Socket又被稱為“套接字”,是一種抽象層,被用來實現網絡上兩個設備之間的收發數據,每一個Socket由一個IP地址和一個端口號唯一確定,通常被用來實現服務端和客戶端的連接[3]。
服務端實現步驟如下:
(1)服務端創建服務端的Socket服務,即ServerSocket,開始監聽來自客戶端的連接請求;
(2)當接收到連接請求時,調用accept方法進行連接,客戶端Socket連接到服務端的ServerSocket;
(3)創建OutputStream和InputStream的對象實例,利用write方法和read方法與客戶端進行通信[4];
(4)當結束通信時,調用Socket的close方法關閉連接。
客戶端實現步驟如下:
(1)建立客戶端的Socket服務;
(2)客戶端調用connect方法與服務端進行Socket連接;
(3)創建OutputStream和InputStream的對象實例,利用write方法和read方法與服務端端進行通信;
(4)當結束通信時,調用Socket中的close方法關閉連接。
客戶端(或服務端)獲取Socket中的輸出流,將數據寫入到輸出流,通過網絡發送到服務端(或客戶端)。獲取Socket中的輸入流,讀取里面的數據,即完成一次通信。
服務端和客戶端的連接通信過程如圖5所示。
客戶端與服務器連接效果展示如圖6、圖7和圖8所示。
針對測試過程中存在數據查詢麻煩、接收的數據難以存儲等問題,該本地存儲數據模塊以Android為基礎,利用SQLite數據庫技術設計,實現測試結果信息的快速獲取和顯示,提高查詢效率,并實現當數據達到一定量時刪除舊數據,來確保不會占用大量存儲空間。
該模塊采用數據層、邏輯層和應用層三層體系結構,其中數據層是此部分的基礎,主要負責測試結構數據的存儲檢索;邏輯層負責鏈接數據層和應用層;應用層是應用界面,將邏輯層獲取的請求信息展示給用戶。
在此我們需要使用到基本的操作——增刪改查,因此需要重寫這些操作,將其封裝到繼承了SQLiteOpenHelper的dbHelper類里。
操作步驟如下:
(1)創建一個數據庫:先創建一個DatabaseHelper對象,使用這個對象調用getWritableDatabase方法創建一個可讀寫的數據庫;
(2)創建表格:自定義一個數據庫子類db-Helper繼承SQLiteOpenHelper,重寫里面的onCreate和onUprade方法,在onCreate方法中寫好sql語句,并且采用execSQL(sql)方法運行sql語句,實現創建表格的操作;
(3)插入數據庫:創建ContentValues對象,取名叫values,使用put方法向該對象中插入鍵值對,最后調用sqliteDatabase的insert方法插入數據庫;
(4)修改數據庫:創建ContentValues對象,取名叫values,使用put方法向該對象中插入鍵值對,最后調用sqliteDatabase的update方法插入數據庫;
(5)刪除數據:調用sqliteDatabase的delete方法刪除數據;
(6)查詢數據:調用sqliteDatabase的query方法遍歷查詢數據。
實現了基本操作之后,還要根據本系統的需求再定義一些操作。
當數據達到2000條時,我們需要刪除舊數據,然后才能繼續添加新數據,SQL語句如下所示:
//刪除testinfo表里的數據
DELETE FROM testinfo
//當數據條數大于2000行時
WHERE id>=2000 IN
//選擇其中的前100條進行刪除
(SELECT id FROM testinfo ORDER BY id LIMIT 100);
處理流程如圖9所示。
表1為檢測結果表,Id字段為主鍵,用其存儲檢測結果數據信息。

表1 檢測結果表
該模塊將根據得到的數據進行可視化,數據可視化是將數據用圖形化的方式來表示,可以幫助企業迅速明白某些數據的重要性,理解數據的背后含義。數據可視化通常是理解和交流分析的第一步,因為當數據以圖形方式而非數字方式呈現時,更利于人們理解數據,而且還可以實現多維度的數據比較。
本研究中使用折線圖來進行數據可視化。折線圖可以顯示隨時間(根據常用比例設置)而變化的連續數據,因此非常適用于顯示在相等時間間隔下的數據變化趨勢。在折線圖中,類別數據沿水平軸均勻分布,所有值數據沿垂直軸均勻分布,可以使用戶更直觀地看到隨時間推移的檢測情況,能直接知道在多長時間、什么條件下氣密性達到了一個閾值,以便進行改進。
接收到輸入的數據之后,首先調用JFreeChart類的createLineChar(t)和setBackgroud-Pain(t)以及getTitle()方法,來設置折線圖的名稱、字體和顏色;其次則是CategoryPlot類的setDomainGridlinesVisible()、setRangeGridlines-Visible()、setDomainGridlinePaint()、setRange GridlinePain(t)方法實現x軸、y軸是否可見,以及網格橫豎線的顏色,setNoDataMessage()方法則表示當沒有數據顯示時的文字說明。
隨后即是NumberAxis類的setStandardTick-Units()、setUpperMargin()、setAutoRangeIncludesZero()、setLabelAngle()方法來設置數據軸顯示的格式,數據范圍,是否包含0。然后到CategoryAxis類的setTickLabelFont()、setLabel-Font()、setCategoryLabelPositions()、setLower-Margin()、setUpperMargin()方法設置x軸坐標和標題的文字,左右邊距和橫軸傾斜角度;最后由LineAndShapeRenderer類的setBaseShapes-Visible()、setBaseLinesVisible()來決定最終折線圖是否顯示折點和折線。
主要的類及類與類之間的關系如圖10所示,選擇數據庫中的泄露率作為縱軸、壓強作為橫軸進行數據可視化的效果如圖11所示。
本文將主要運行于Windows版本的操作系統下的LTWin軟件功能移植至Android端。界面簡潔友好,布局符合邏輯,操作簡便,可以滿足針對測試電池包氣密性的工作人員的基本需求,使測試過程更加輕便,提高測試效率。但目前軟件可適配的氣密性檢測設備只有儀器S30,即可檢測氣密性的產品種類不多,故未來將會進一步適配其它儀器,以完善移植后的軟件。