文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2014)01-0137-04
Android是一個開放性的開發(fā)平臺,由Google公司和開放手機(jī)聯(lián)盟開發(fā),基于Linux的自由及開放源代碼的操作系統(tǒng)[1]。主要應(yīng)用于移動設(shè)備,如智能手機(jī)和平板電腦。Android的系統(tǒng)架構(gòu)主要分為應(yīng)用程序?qū)印?yīng)用程序框架層、系統(tǒng)運(yùn)行庫層和Linux內(nèi)核層。
水產(chǎn)物聯(lián)服務(wù)系統(tǒng)AITSS(Aquaculture Internet Things Service System)是一個面向水產(chǎn)養(yǎng)殖行業(yè),應(yīng)用現(xiàn)代物聯(lián)技術(shù)[2]集成行業(yè)業(yè)務(wù)處理應(yīng)用系統(tǒng)的服務(wù)平臺。系統(tǒng)采用自然語言與計(jì)算機(jī)語言相融合的方法,使用豐富的命令集(管理命令、用戶命令、開發(fā)命令和短信命令),實(shí)現(xiàn)人-物-物之間的信息交流。系統(tǒng)的語音、視頻、短信、傳感、監(jiān)控等服務(wù)不受硬件、通信協(xié)議及方式的限制,集成的行業(yè)業(yè)務(wù)處理應(yīng)用系統(tǒng)運(yùn)行穩(wěn)定、維護(hù)簡單、更新方便、擴(kuò)展靈活。
本文基于Android平臺,設(shè)計(jì)并開發(fā)了水產(chǎn)物聯(lián)服務(wù)系統(tǒng)Android手機(jī)客戶端(AITSS for Android),將在線監(jiān)測、遠(yuǎn)程控制、設(shè)備遠(yuǎn)程維護(hù)等功能集成于本應(yīng)用軟件。
1 系統(tǒng)設(shè)計(jì)
根據(jù)用戶需求,系統(tǒng)能夠完成在線監(jiān)測、遠(yuǎn)程控制、設(shè)備管理、參數(shù)設(shè)置、外觀選擇等功能。系統(tǒng)功能結(jié)構(gòu)如圖1所示。
(1)在線監(jiān)測:在線監(jiān)測主要完成系統(tǒng)中所有管理區(qū)監(jiān)測設(shè)備(傳感器)的管理操作,包括設(shè)備開啟或關(guān)閉、查看設(shè)備運(yùn)行狀態(tài)、監(jiān)測指標(biāo)及監(jiān)測值等。
(2)遠(yuǎn)程控制:遠(yuǎn)程控制主要完成系統(tǒng)中所有管理區(qū)控制設(shè)備(控制器)的管理操作,包括設(shè)備的開啟或關(guān)閉、查看設(shè)備運(yùn)行狀態(tài)、設(shè)定控制設(shè)備的工作方式(控制模式)等。
(3)設(shè)備管理:設(shè)備管理主要完成水產(chǎn)物聯(lián)服務(wù)系統(tǒng)支持的系統(tǒng)成員的管理操作,主要包括系統(tǒng)成員的添加、刪除、查詢、系統(tǒng)作業(yè)的配置等。
(4)參數(shù)設(shè)置:參數(shù)設(shè)置主要完成服務(wù)器地址、端口號和系統(tǒng)刷新頻率的設(shè)置。
(5)外觀選擇:用于為用戶提供個性化的系統(tǒng)界面配色方案和外觀選擇。
2 開發(fā)環(huán)境
水產(chǎn)物聯(lián)服務(wù)系統(tǒng)的服務(wù)器操作系統(tǒng)使用FreeBSD進(jìn)行系統(tǒng)管理,使用MySQL 5.0數(shù)據(jù)庫進(jìn)行數(shù)據(jù)和配置的存儲。手機(jī)客戶端與AITSS交互流程如圖2所示。
在安裝有Windows操作系統(tǒng)的PC機(jī)進(jìn)行Android開發(fā)環(huán)境的搭建[1],需要Oracle公司的Java SE JDK和Java運(yùn)行環(huán)境(Java Runtime Environment),Eclipse IDE和Android SDK。
開發(fā)環(huán)境如下:
JAVA SE JDK:Java version 1.7.0_25;Java SE Runtime Envitonment <build 1.7.0_25-b16>。
Eclipse IDE:Eclipse Java IDE for Web Developers. Indigo Service Release 2。
Android SDK:Android 2.3.3(API 10)。
3 系統(tǒng)實(shí)現(xiàn)
3.1 網(wǎng)絡(luò)連接
使用Android3.0及以上版本訪問WebService會出現(xiàn)android.os.NetworkOnMainThreadException的問題[3],通過在Activity類添加onCreate( )方法中添加Strict代碼解決。核心代碼如下:
//解決Android3.0以上版本的Socket連接問題
StrictMode.setThreadPolicy(new StrictMode
.Threadpolicy.builder().detectDiskReads()
.detectDiskWrites().detectDiskNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode
.VmPolicy.builder().detectLeakedSqlLite
Objects().penaltyLog().penaltyDeath()
.build());
3.2 在線監(jiān)測
實(shí)現(xiàn)在線監(jiān)測功能需要解決監(jiān)測設(shè)備獲取、監(jiān)測數(shù)據(jù)獲取和繪制監(jiān)測曲線等系統(tǒng)需求。
3.2.1 獲取監(jiān)測設(shè)備
本程序在單獨(dú)線程中獲取水產(chǎn)物聯(lián)服務(wù)系統(tǒng),服務(wù)器端已完成配置的監(jiān)測地點(diǎn)和監(jiān)測設(shè)備詳情。根據(jù)Socket的返回值使用Android提供的ListView()組件顯示獲取到的信息。在處理Socket時,使用singleton模式[4](單例模式)獲取SocketHelper,代碼如下:
syncharonized(synObj){
if(socketHelper == null) {
socketHelper = new SocketHelper(context);
}
}
根據(jù)Socket返回值顯示加載有監(jiān)測地點(diǎn)和設(shè)備信息的彈出窗口popupwindow時,需要將其setFocusable屬性設(shè)置為true,否則無法獲取到彈出窗口里的焦點(diǎn),由此導(dǎo)致彈出窗口中可能存在輸入框等控件無法輸入。
3.2.2 獲取監(jiān)測數(shù)據(jù)
傳感設(shè)備監(jiān)測到的環(huán)境數(shù)據(jù)會通過數(shù)傳設(shè)備實(shí)時傳輸并儲存在服務(wù)器端。在使用手機(jī)客戶端進(jìn)行在線監(jiān)測時,需要使用monitorDataHandler( )方法對服務(wù)器端的數(shù)據(jù)進(jìn)行實(shí)時獲取,代碼如下:
//獲取每行監(jiān)測數(shù)據(jù)(格式為373737:34.44[時間整數(shù):監(jiān)測數(shù)據(jù)值])
String[] md = infos[i].split(Constants
.Command.COMMAND_SEPARATOR);
if (“”.equals(md[0].trim()))
continue;
date = MathHelper.getLong(md[0],0) * 1000;
value = MathHelper.round(Float.valueOf(md[1]),3);
series.addData(date,value);
實(shí)時獲取到的監(jiān)測數(shù)據(jù)將在監(jiān)測顯示容器TextView( )組件中進(jìn)行顯示和實(shí)時更新。
3.2.3 監(jiān)測曲線繪制
為便于用戶查看一定時間段內(nèi)的監(jiān)測指標(biāo)變化趨勢,設(shè)計(jì)開發(fā)了監(jiān)測曲線繪制功能。
監(jiān)測曲線的橫軸為實(shí)時時間參數(shù),表示服務(wù)器端獲取到該監(jiān)測值的時間點(diǎn),橫軸刻度根據(jù)時間變化實(shí)時更新,監(jiān)測曲線的為使用監(jiān)測值,表示對應(yīng)時間點(diǎn)的監(jiān)測指標(biāo)值;縱軸使用動態(tài)坐標(biāo),根據(jù)當(dāng)前數(shù)據(jù)的最大最小值進(jìn)行自動調(diào)節(jié),并在最大最小值相等時根據(jù)數(shù)據(jù)精度進(jìn)行上下縮放。
使用Android提供的TextView( )組件作為曲線顯示容器,定義并使用drawLine(Canvas canvas)函數(shù)進(jìn)行曲線繪制,關(guān)鍵代碼如下:
canvas.drawPoint(mChartRect.left,mChart.bottom - y0,this.mSeriesPaint);
canvas.drawLine(mChartRect.left + x0 *
mXSrawUnit, mChartRect.bottom - y0,
mChartRect.left+x1* mXDrawUnit,
mChartRect.bottom-y1, mSeriesPaint);
3.3 遠(yuǎn)程控制
遠(yuǎn)程控制主要對用于水產(chǎn)養(yǎng)殖生產(chǎn)的自動化設(shè)備進(jìn)行遠(yuǎn)程控制。設(shè)備控制模式根據(jù)生產(chǎn)需要分為人工控制、定時控制和自動控制三種。
3.3.1 選擇控制模式
系統(tǒng)根據(jù)用戶的需要,設(shè)計(jì)開發(fā)了三種控制模式:(1)人工模式,滿足用戶隨時隨地控制設(shè)備的需求;(2)定時模式,通過設(shè)置時間隊(duì)列,滿足設(shè)備定時控制;(3)自動模式,結(jié)合水產(chǎn)養(yǎng)殖專家系統(tǒng),進(jìn)行智能化決策及設(shè)備控制。在遠(yuǎn)程控制界面,選擇不同控制模式,顯示不同視圖View( )。選擇人工模式時,切換控制模式顯示視圖的代碼如下:
case R.id.chkManualControl:
startContent.setVisibility(Constants.Visibility.GONE);
endContent.setVisibility(Constants.Visibility.GONE);
break;
3.3.2 獲取設(shè)備狀態(tài)
準(zhǔn)確獲取設(shè)備當(dāng)前狀態(tài)是進(jìn)行設(shè)備遠(yuǎn)程控制的重要前提。本程序定義設(shè)備狀態(tài)變量devState為一個可進(jìn)行滑動操作的SlipButton對象[5]。賦值代碼為:
devState=(SlipButton)findViewById
(R.id.devstate)
獲取設(shè)備狀態(tài)代碼如下:
float open = MathHelper.getFloat(dev[1],0);
devState.setCheck(open>0);
paraZone.setVisibility(Constants.Visibility.VISIBLE);
3.3.3 定時控制
定時本文控制的原理是用戶根據(jù)需要自主設(shè)定改變控制設(shè)備狀態(tài)的起止時間點(diǎn)。如當(dāng)前增氧機(jī)狀態(tài)為開啟,用戶可以根據(jù)需要,設(shè)定在某一時間點(diǎn)將增氧機(jī)狀態(tài)更改為關(guān)閉,并在另一時間點(diǎn)再次開啟增氧機(jī)。關(guān)鍵代碼為:
String mode= oprMode==0?”auto”:(devdate
.isChecked()?”on”:”off”)
try{
String b= startTime.getText().toString();
long beginTime =DateHelper.convert2long(b,
“yyyy-MM-dd HH:mm”);
begin =(int)(beginTime- currentTime);
}
4 試驗(yàn)與結(jié)果分析
使用設(shè)計(jì)并開發(fā)的客戶端程序,進(jìn)行基于Android平臺的水產(chǎn)物聯(lián)服務(wù)系統(tǒng)的應(yīng)用試驗(yàn)。本實(shí)例使用安裝有Android4.0.3版本的手機(jī),在CDMA2000的3G網(wǎng)絡(luò)環(huán)境進(jìn)行。
軟件使用流程為:打開應(yīng)用程序,輸入用戶名和密碼,以默認(rèn)服務(wù)器地址和端口號登錄;手機(jī)根據(jù)用戶的手勢指令將信息發(fā)送到服務(wù)器,并將解析后的信息及時回送到手機(jī)端,經(jīng)應(yīng)用程序處理后顯示在手機(jī)上。用戶可以實(shí)時管理監(jiān)測設(shè)備,查看實(shí)時監(jiān)測數(shù)據(jù)和指標(biāo)變化曲線;通過遠(yuǎn)程控制命令進(jìn)行設(shè)備的人工開啟和關(guān)閉、定時開啟和關(guān)閉,也可連接到專家系統(tǒng)使用自動智能控制模式[6]。系統(tǒng)應(yīng)用實(shí)例如圖3、圖4所示。
程序的開發(fā)和應(yīng)用實(shí)驗(yàn)證明,客戶端軟件能夠完成與服務(wù)器端水產(chǎn)物聯(lián)服務(wù)系統(tǒng)的交互,實(shí)現(xiàn)水產(chǎn)養(yǎng)殖環(huán)境的在線監(jiān)測和水產(chǎn)養(yǎng)殖生產(chǎn)設(shè)備的遠(yuǎn)程控制。由于Android平臺對硬件配置的適應(yīng)性和平臺的開放性,用戶可以將已有視頻監(jiān)控設(shè)備移植到客戶端中,實(shí)現(xiàn)真正的實(shí)時在線監(jiān)控[7]?;贏ndroid平臺的客戶端程序易于獲取,通過網(wǎng)絡(luò)即可方便地下載安裝,享受物聯(lián)服務(wù)。
本文基于Android平臺,結(jié)合水產(chǎn)養(yǎng)殖行業(yè)所需的環(huán)境監(jiān)測指標(biāo)和生產(chǎn)設(shè)備,設(shè)計(jì)開發(fā)了一個開放式的智能手機(jī)客戶端平臺。該客戶端平臺與物聯(lián)服務(wù)系統(tǒng)服務(wù)器進(jìn)行交互,起到信息展示和發(fā)布的作用,而信息的處理和存儲皆由物聯(lián)服務(wù)系統(tǒng)完成。還可以根據(jù)用戶的不同需求配置不同的傳感監(jiān)測設(shè)備和控制設(shè)備,將該客戶端應(yīng)用于其他行業(yè), 設(shè)計(jì)出適用于各個領(lǐng)域的物聯(lián)服務(wù)系統(tǒng)。
此方案可以有效降低系統(tǒng)開發(fā)成本,延長系統(tǒng)存活周期,具有靈活、高效、可擴(kuò)展的特性,應(yīng)用前景較好。
參考文獻(xiàn)
[1] JACKSON W. Android apps for absolute beginners[M]. New York City:Apress,2011.
[2] 孫其博,劉杰,黎羴,等. 物聯(lián)網(wǎng):概念、架構(gòu)與關(guān)鍵技術(shù)研究綜述[J].北京郵電大學(xué)學(xué)報,2010,33(3):1-9.
[3] 鄧蕊.基于Android的視頻監(jiān)控的研究與實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2012.
[4] SHALLOWAY A, TROTT J R.設(shè)計(jì)模式解析[M].徐言聲譯.北京:人民郵電出版社,2006.
[5] 鄭云卿,黃琦.基于Android平臺的軟件自動化監(jiān)控工具的設(shè)計(jì)開發(fā)[J].計(jì)算機(jī)應(yīng)用與軟件,2013,30(2):235-238.
[6] 江燕良.基于Android智能終端的遠(yuǎn)程控制系統(tǒng)[J].電子技術(shù)應(yīng)用,2012,38(8):129-132.
[7] 李昂,宋海聲,蘇小蕓. 基于Android的視頻監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2012,38(7):138-143.