周剛
(四川理工學(xué)院計(jì)算機(jī)學(xué)院,四川自貢643000)
基于網(wǎng)頁(yè)數(shù)據(jù)提取的灌溉監(jiān)控Android客戶端系統(tǒng)
周剛
(四川理工學(xué)院計(jì)算機(jī)學(xué)院,四川自貢643000)
為了解決移動(dòng)灌溉監(jiān)控中用戶體驗(yàn)不佳,達(dá)不到良好移動(dòng)監(jiān)控效果的問(wèn)題,提出并設(shè)計(jì)了基于Android平臺(tái)的灌溉監(jiān)控客戶端系統(tǒng)。所設(shè)計(jì)系統(tǒng)規(guī)避了網(wǎng)站無(wú)數(shù)據(jù)接口的問(wèn)題,采用數(shù)據(jù)間接訪問(wèn)方式實(shí)現(xiàn)數(shù)據(jù)獲取。給出了數(shù)據(jù)獲取原理,分析了Android灌溉監(jiān)控客戶端功能,并給出實(shí)現(xiàn)的具體方法。經(jīng)過(guò)測(cè)試表明,系統(tǒng)具有良好的用戶體驗(yàn),滿足了移動(dòng)灌溉監(jiān)控的需要,具有良好的實(shí)用價(jià)值和推廣價(jià)值。
網(wǎng)頁(yè)數(shù)據(jù)提取;Android;灌溉監(jiān)控;客戶端
隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)和無(wú)線通信技術(shù)的發(fā)展,遠(yuǎn)程智能灌溉已經(jīng)廣泛的應(yīng)用于溫室種植、城市綠地節(jié)水灌溉,實(shí)現(xiàn)了現(xiàn)場(chǎng)的無(wú)人值守,同時(shí),隨著Android智能手機(jī)的普及,用戶也多了一種遠(yuǎn)程監(jiān)控的方式,即移動(dòng)監(jiān)控。然而,雖然用戶可以通過(guò)手機(jī)瀏覽器來(lái)對(duì)灌溉監(jiān)控網(wǎng)站進(jìn)行訪問(wèn),但在實(shí)際使用中由于手機(jī)屏幕大小受限,灌溉監(jiān)控網(wǎng)頁(yè)元素過(guò)多,會(huì)導(dǎo)致用戶體驗(yàn)不佳,達(dá)不到良好的移動(dòng)監(jiān)控效果,這也正是為什么要定制新浪微博、淘寶等Android客戶端軟件的原因[1]。
鑒于此,提出了基于Android平臺(tái)的灌溉監(jiān)控客戶端系統(tǒng)。系統(tǒng)不僅要實(shí)現(xiàn)用戶在有網(wǎng)絡(luò)通信的情況下,隨時(shí)隨地對(duì)現(xiàn)場(chǎng)情況進(jìn)行監(jiān)控,還要具有良好的用戶體驗(yàn),做到真正的無(wú)人值守遠(yuǎn)程監(jiān)控。
基于Android平臺(tái)的灌溉監(jiān)控客戶端系統(tǒng)屬于網(wǎng)站客戶端軟件,這類(lèi)軟件最突出的特點(diǎn)就是,先有網(wǎng)站再有客戶端軟件,通過(guò)手機(jī)客戶端軟件來(lái)改善用戶體驗(yàn)。目前大多Android網(wǎng)站客戶端開(kāi)發(fā)是通過(guò)服務(wù)端開(kāi)放相應(yīng)的數(shù)據(jù)API接口,經(jīng)過(guò)OAuth認(rèn)證授權(quán),來(lái)獲取數(shù)據(jù)庫(kù)后臺(tái)數(shù)據(jù),一般是一些面向公眾的平臺(tái),如:豆瓣網(wǎng)、騰訊微博等[2_3]。
本文中的遠(yuǎn)程灌溉監(jiān)控網(wǎng)站在開(kāi)發(fā)時(shí)沒(méi)有開(kāi)發(fā)服務(wù)端的任何數(shù)據(jù)接口,同時(shí)為保證后臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的安全,限制了訪問(wèn)權(quán)限,因此不能直接從網(wǎng)站數(shù)據(jù)庫(kù)獲取數(shù)據(jù)。然而對(duì)于灌溉監(jiān)控Android客戶端而言,監(jiān)控網(wǎng)頁(yè)中顯示的數(shù)據(jù)才具有實(shí)際意義,因此我們可以從網(wǎng)頁(yè)中把需要的數(shù)據(jù)提取出來(lái),只要網(wǎng)頁(yè)中能看到的數(shù)據(jù),客戶端都能獲取到。即基于網(wǎng)頁(yè)數(shù)據(jù)提取的Android客戶端開(kāi)發(fā)模式。
網(wǎng)頁(yè)數(shù)據(jù)提取,其實(shí)質(zhì)是對(duì)數(shù)據(jù)庫(kù)的間接訪問(wèn)。其原理是在Android客戶端模擬瀏覽器執(zhí)行POST或GET請(qǐng)求,通過(guò)對(duì)服務(wù)器返回的嵌套了返回?cái)?shù)據(jù)的靜態(tài)html頁(yè)面進(jìn)行解析,提取指定標(biāo)簽的數(shù)據(jù),對(duì)應(yīng)顯示到Android客戶端。
圖1所示為灌溉監(jiān)控系統(tǒng)網(wǎng)站的主頁(yè)面。
圖1灌溉監(jiān)控系統(tǒng)主頁(yè)面
從該頁(yè)面可以看出灌溉監(jiān)控系統(tǒng)主要實(shí)現(xiàn)監(jiān)控點(diǎn)數(shù)據(jù)的查詢、監(jiān)控時(shí)間間隔設(shè)置、數(shù)據(jù)的實(shí)時(shí)刷新、工作模式設(shè)定(手動(dòng)/自動(dòng))、電磁閥開(kāi)關(guān)設(shè)定、土壤水分上下限設(shè)定。在Android客戶端設(shè)計(jì)上,由于智能手機(jī)屏幕大小受限,為了達(dá)到良好的用戶體驗(yàn),我們把最重要的、常用的關(guān)鍵功能提取出來(lái),舍去一些不常用的功能,進(jìn)行簡(jiǎn)化設(shè)計(jì),如時(shí)間間隔設(shè)置和土壤水分上下限設(shè)定一般是固定的,因此可以省略,以節(jié)約屏幕空間;另灌溉監(jiān)控客戶端主要關(guān)心實(shí)時(shí)數(shù)據(jù)的變化,以及由此產(chǎn)生的相應(yīng)控制操作,因此對(duì)于歷史數(shù)據(jù)的查詢意義不大。固在監(jiān)控客戶端設(shè)計(jì)上主要實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)的報(bào)警,以及相應(yīng)的控制功能和工作模式的設(shè)定。通過(guò)前文分析,對(duì)于實(shí)時(shí)數(shù)據(jù)的監(jiān)測(cè)其本質(zhì)是實(shí)現(xiàn)網(wǎng)頁(yè)數(shù)據(jù)的實(shí)時(shí)提取,因此灌溉監(jiān)控Android客戶端的核心是如何從服務(wù)器返回的靜態(tài)頁(yè)面中提取請(qǐng)求返回的數(shù)據(jù)。
2.1 監(jiān)控?cái)?shù)據(jù)提取流程分析
監(jiān)控?cái)?shù)據(jù)提取流程如圖2所示。
首先根據(jù)目標(biāo)地址實(shí)例化POST或GET方法來(lái)模擬瀏覽器執(zhí)行POST或GET請(qǐng)求,其目標(biāo)地址即為圖1所示網(wǎng)頁(yè)的地址;然后為請(qǐng)求添加相應(yīng)的鍵值對(duì),如圖1中的地點(diǎn)選擇下拉選項(xiàng)、工作模式選擇和電磁閥開(kāi)關(guān)控制,設(shè)定好以后,進(jìn)行提交,WEB服務(wù)器響應(yīng)返回包裹了請(qǐng)求數(shù)據(jù)的一個(gè)靜態(tài)html頁(yè)面,頁(yè)面中監(jiān)測(cè)數(shù)據(jù)是用table標(biāo)簽的單元格來(lái)顯示,即查詢返回的數(shù)據(jù)包裹在html頁(yè)面中的td標(biāo)簽里。html頁(yè)面其本質(zhì)可以看作是由字符流組成,因此轉(zhuǎn)化成對(duì)字符流解析操作。
解析工作借助于JsouP。JsouP是一個(gè)Java開(kāi)源html解析器(來(lái)自org.jsouP包)[4_5],支持Document類(lèi),一個(gè)Document又由elements組成,可以在Document中通過(guò)它的select方法獲取指定的elements,如在html代碼中查找以“tr”開(kāi)頭的標(biāo)簽,通過(guò)document.select(“tr”)來(lái)完成,找到后以elements數(shù)據(jù)類(lèi)型進(jìn)行保存,形成tr元素群,通過(guò)元素群進(jìn)行進(jìn)一步的數(shù)據(jù)解析,如在tr元素群中,查找指定表格行的單元格,通過(guò)elements的get()方法和select()方法來(lái)完成,實(shí)例如:trs.get(i+2). select(“td”),即從每個(gè)tr中選出td標(biāo)簽元素群,最后通過(guò)elements的html()方法來(lái)獲取指定標(biāo)簽括起來(lái)的內(nèi)容,這樣就完成了數(shù)據(jù)的解析。
圖2網(wǎng)頁(yè)數(shù)據(jù)獲取流程圖
2.2 灌溉監(jiān)控Android客戶端功能設(shè)計(jì)
灌溉監(jiān)控Android客戶端分為控制頁(yè)面和數(shù)據(jù)監(jiān)控頁(yè)面以及報(bào)警控制??刂祈?yè)面包括工作模式的設(shè)定和電磁閥的開(kāi)關(guān)控制,這些操作是一次性請(qǐng)求,沒(méi)有返回?cái)?shù)據(jù),直接通過(guò)無(wú)線網(wǎng)絡(luò)對(duì)現(xiàn)場(chǎng)控制設(shè)備進(jìn)行控制,由相應(yīng)的嵌入控制程序來(lái)完成。
數(shù)據(jù)監(jiān)控頁(yè)面負(fù)責(zé)實(shí)時(shí)的展示現(xiàn)場(chǎng)數(shù)據(jù),是一個(gè)動(dòng)態(tài)的、實(shí)時(shí)的數(shù)據(jù)讀取過(guò)程,即要求Android客戶端根據(jù)監(jiān)測(cè)頻率重復(fù)的模擬瀏覽器POST或GET操作,因此把數(shù)據(jù)讀取做成Service形式,在Android后臺(tái)運(yùn)行[3]。監(jiān)控頁(yè)面只負(fù)責(zé)數(shù)據(jù)的顯示。
報(bào)警控制用于土壤水分傳感器數(shù)據(jù)超限時(shí),模擬啟動(dòng)電磁閥開(kāi)關(guān),無(wú)需界面展示,而是以消息窗的形式進(jìn)行提示,數(shù)據(jù)超限監(jiān)控也是實(shí)時(shí)、動(dòng)態(tài)的,在后臺(tái)運(yùn)行,故也做成Android的Service。
從前面的分析中,可以得知灌溉監(jiān)控Android客戶端的核心是網(wǎng)頁(yè)數(shù)據(jù)獲取并解析的過(guò)程,因此只要完成這一過(guò)程,客戶端系統(tǒng)就已基本實(shí)現(xiàn)。開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)工具選用EcliPse3.5+JDK1.6+SDK+ADT,開(kāi)發(fā)平臺(tái)選用Android2.2版本,并借助HtmlWatchhtml代碼觀察器來(lái)輔助開(kāi)發(fā)[6]。
實(shí)現(xiàn)過(guò)程劃分為兩步進(jìn)行:第一步,模擬瀏覽器執(zhí)行POST或GET請(qǐng)求;第二步,數(shù)據(jù)解析與顯示。
3.1POST或GET請(qǐng)求實(shí)現(xiàn)
模擬瀏覽器POST或GET請(qǐng)求通過(guò)HttPClient類(lèi)來(lái)實(shí)現(xiàn),實(shí)現(xiàn)中導(dǎo)入HttPClient的4個(gè)包:commons-co_ dec、commons-httPclient、commons-logging、log4j[7]。首先實(shí)例化一個(gè)HttPClient對(duì)象,設(shè)置Host地址和端口號(hào),即請(qǐng)求頁(yè)面地址,用目標(biāo)地址實(shí)例化一個(gè)POST或GET方法,寫(xiě)出所需要的鍵值對(duì),如:地點(diǎn)選擇,然后調(diào)用HttPClient實(shí)例對(duì)象的executeMethod方法,提交POST或GET方法,返回的html以流的形式讀入,存放在一個(gè)buffer緩沖字節(jié)數(shù)組中,格式化String類(lèi)型保存,最后釋放連接。示例代碼如下:
//例化HttPClient
HttPClientclient=newHttPClient();
//設(shè)置Host地址端口是S0
client.getHostConfiguration().setHost(“httP:// ggjkxt.com”,S0);
//用目標(biāo)地址實(shí)例一個(gè)POST方法
PostMethodPost=newPostMethod(“httP://ggjkxt. com/IlaswebBib”)
//將需要的鍵值對(duì)寫(xiě)出來(lái)
NameValuePairsubmit=newNameValuePair(“submit”,“刷新數(shù)據(jù)”));
NameValuePairvName=newNameValuePair(“v_ name”,“0”);
//給POST方法加入上述鍵值對(duì)
Post.setRequestBody(newNameValuePair[]{submit,vName});
//執(zhí)行POST方法
client.executeMethod(Post);
//將POST返回的數(shù)據(jù)以流的形式讀入,再把輸入流流至一個(gè)buff緩沖字節(jié)數(shù)組
//StreamTool類(lèi)是自己寫(xiě)的一個(gè)工具類(lèi),用于數(shù)據(jù)流讀取
byte[]buff=StreamTool.readInPutStream(Post. getResPonseBodyAsStream());
//將返回的內(nèi)容格式化為String存在html中
Stringhtml=newString(buff);
//任務(wù)完成,釋放連接
Post.releaseConnection();
將該段代碼功能復(fù)制到Service的執(zhí)行方法中,設(shè)定Service監(jiān)控頻率即可。
3.2 數(shù)據(jù)解析與顯示
在客戶端采用ListView(列表組件)來(lái)呈現(xiàn)數(shù)據(jù),客戶端數(shù)據(jù)顯示界面如圖3示。
ListView中的數(shù)據(jù)由AdaPter(適配器)提供,AdaPter需要傳一個(gè)特殊容器(包含HashMaP的ArrayList),解析得到的數(shù)據(jù)就存放在這個(gè)ArrayList(數(shù)組列表)的HashMaP中,HashMaP是Android中的一種數(shù)據(jù)類(lèi)型,用于存放鍵值對(duì),如在該系統(tǒng)中的土壤水分含量數(shù)據(jù)。HashMaP構(gòu)建好后,將其綁定到ArrayList,最后通過(guò)Li_ stView來(lái)顯示[S]。示例代碼如下:
List>list=newArrayList>();
//將html轉(zhuǎn)化成Document
圖3客戶端數(shù)據(jù)顯示界面圖
Document document=JsouP.Parse(htm l);
//選擇”tr”開(kāi)頭的標(biāo)簽,存入trs元素群中
Elements trs=document.select(“tr”);
//得到整個(gè)HTML中包含tr的標(biāo)簽的個(gè)數(shù)
int total Trs=trs.size();
if(total Trs>0)
for(int i=0;i<total Trs;i++)
{
//從每個(gè)tr中選出td標(biāo)簽元素群
Elements tds=trs.get(i).select(“td”);
//得到每個(gè)tr中td的個(gè)數(shù)
int total Tds=tds.size();
//臨時(shí)的Hash MaP,里面是String-Object鍵值對(duì)
MaPmaP=new Hash MaP();
//j是一個(gè)標(biāo)識(shí)數(shù)
for(int j=0;j<total Tds;j++)
{
switch(j){
//html()方法得到標(biāo)簽括起來(lái)的內(nèi)容
case 0:
maP.Put(“ad_name”,tds.get(j).html().to String());
break;
case 1:
//獲取土壤水分?jǐn)?shù)據(jù)
maP.Put(“water”,tds.get(j).html().to String());
MaP里即為存放的提取土壤水分含量等數(shù)據(jù)。
灌溉監(jiān)控Android客戶端是一個(gè)具有時(shí)效性的系統(tǒng),與原有灌溉監(jiān)控網(wǎng)站相比,采用的是無(wú)線傳輸網(wǎng)絡(luò)(Wifi或移動(dòng)通信),這里對(duì)數(shù)據(jù)監(jiān)控的時(shí)效性與原有網(wǎng)站的時(shí)效性進(jìn)行對(duì)比測(cè)試,采用不同型號(hào)的Android手機(jī)分別基于Wifi和移動(dòng)通信兩種通信方式來(lái)進(jìn)行測(cè)試,測(cè)試結(jié)果見(jiàn)表1。
表1各手機(jī)參數(shù)與延時(shí)對(duì)比
從測(cè)試結(jié)果來(lái)看,在Wifi通信情況下,較高性能的手機(jī)產(chǎn)生的數(shù)據(jù)刷新延時(shí)比低配置手機(jī)略小,這主要受制于手機(jī)硬件本身;另采用Wifi通信的方式略好于移動(dòng)通信方式,這主要是移動(dòng)通信方式信號(hào)不穩(wěn)所致。總體情況來(lái)看,其延時(shí)都在幾秒之內(nèi),對(duì)于灌溉監(jiān)控這種實(shí)時(shí)性要求不高(采集頻率一般以小時(shí)計(jì)算)的系統(tǒng),在實(shí)際使用中基本沒(méi)有影響。
灌溉監(jiān)控Android客戶端系統(tǒng),通過(guò)網(wǎng)頁(yè)數(shù)據(jù)提取的方式規(guī)避了原監(jiān)控網(wǎng)站無(wú)API數(shù)據(jù)接口的問(wèn)題,滿足了灌溉監(jiān)控移動(dòng)辦公需要,取締了遠(yuǎn)程無(wú)人值守,其具體的實(shí)現(xiàn)過(guò)程具有一定的借鑒意義。良好的用戶體驗(yàn)和較高的時(shí)效性,使得灌溉監(jiān)控更具有時(shí)效性和便捷性,具有很大的實(shí)用價(jià)值。
[1]汪永松.Android平臺(tái)開(kāi)發(fā)之旅[M].北京:機(jī)械工業(yè)出版社,2010.
[2]李興華.名師講壇:Android開(kāi)發(fā)實(shí)戰(zhàn)經(jīng)典[M].北京:清華大學(xué)出版社,2011.
[3]李剛.瘋狂Android講義[M].北京:電子工業(yè)出版社,2011.
[4]吳建華,徐浩,丁月華.移動(dòng)網(wǎng)絡(luò)手機(jī)實(shí)時(shí)監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(10): 2196_2198.
[5]Bailey J.Live video streaming from Android_enabled devices to Web browsers[D].Florida,USA:University of South Florida,2011.
[6]周剛,王小玲.氣田移動(dòng)監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].四川理工學(xué)院學(xué)報(bào):自然科學(xué)版,2013,26(1):43_46.
[7]閆偉,葉建栲.多線程技術(shù)在Android手機(jī)開(kāi)發(fā)中的應(yīng)用[J].信息通訊,2012(1):46_47.
[8]賈文杰,孫志峰.基于Android平臺(tái)的智能導(dǎo)游系統(tǒng)[J].機(jī)電工程,2011,28(10):1257_1259.
Irrigation Monitoring Android Client System Based on Webpage Data Acquisition
ZHOU Gang
(School of ComPuter Science,Sichuan University of Science&Engineering,Zigong 643000,China)
In order to resolve the Problem of Poor user exPeriencewhichmakes themobilemonitoring effect satisfied not better in mobile irrigationmonitoring,an irrigationmonitoring client system based on android is ProPosed and then designed. The designed system avoids the Problem that have no data interface in existing website,and acquires data by using indirect ways of access to data.The theory of data acquisition is given,the function of android irrigation monitoring client system is analysed,and the concrete realizationmethod is Produced.According to a system test,the system has good user exPerience,meets the needs ofmobile irrigation monitoring,and has good Practical value and Promotional value.
WebPage data acquisition;Android;irrigation monitoring;client
TP311.52
A
1673_1549(2014)02_0051_05
10.11863/j.suse.2014.02.11
2013_10_29
人工智能四川省重點(diǎn)實(shí)驗(yàn)室開(kāi)放基金項(xiàng)目(2012RYY01)
周剛(197S_),男,四川南充人,講師,碩士,主要從事人工智能與移動(dòng)應(yīng)用方面的研究,(E_mail)tanker197S@126.com