摘 要: 基于Android智能操作系統(tǒng)開(kāi)發(fā)平臺(tái),以移動(dòng)通信網(wǎng)為載體,利用短信方式和GPRS方式實(shí)現(xiàn)在系統(tǒng)客戶端信息采集與傳輸、進(jìn)行數(shù)據(jù)分析處理等功能的物聯(lián)網(wǎng)無(wú)線測(cè)控系統(tǒng)。用戶通過(guò)Android設(shè)備終端,可以隨時(shí)隨地查看環(huán)境數(shù)據(jù)并進(jìn)行實(shí)時(shí)檢測(cè)與控制,實(shí)現(xiàn)物聯(lián)網(wǎng)嵌入式的無(wú)線測(cè)控功能。
關(guān)鍵詞: Android OS;GPRS;SMS;物聯(lián)網(wǎng);無(wú)線測(cè)控
目前無(wú)線通信處于3G/4G時(shí)代,中國(guó)移動(dòng)GPRS業(yè)務(wù)全面投入運(yùn)營(yíng),無(wú)線數(shù)據(jù)通信的發(fā)展和應(yīng)用向著愈來(lái)愈廣泛和深入的領(lǐng)域發(fā)展[1]。遠(yuǎn)程測(cè)控技術(shù)并不是一項(xiàng)新的技術(shù),然而由于移動(dòng)通信網(wǎng)的介入,使之煥發(fā)出新的光輝。因此,隨著智能手機(jī)的迅速發(fā)展,Android操作系統(tǒng)作為最流行的操作平臺(tái),充分利用無(wú)線通信的現(xiàn)有資源,開(kāi)展遠(yuǎn)程物聯(lián)控制是遠(yuǎn)程控制充滿活力的發(fā)展方向,網(wǎng)絡(luò)遠(yuǎn)程控制技術(shù)也是物聯(lián)網(wǎng)建設(shè)的基本方向之一[2]。
本系統(tǒng)是基于Android操作系統(tǒng)平臺(tái),將傳統(tǒng)的遠(yuǎn)程控制技術(shù)向基于無(wú)線通信網(wǎng)的移動(dòng)終端設(shè)備的方向轉(zhuǎn)變,實(shí)現(xiàn)了一種為移動(dòng)客戶端提供遠(yuǎn)程無(wú)線測(cè)控的方案。該方案能夠?qū)h(yuǎn)程數(shù)據(jù)進(jìn)行實(shí)時(shí)監(jiān)控,提高工作效率,也增加了遠(yuǎn)程控制的靈活性。
1 Android操作系統(tǒng)平臺(tái)
Android操作系統(tǒng)是谷歌發(fā)布基于Linux平臺(tái)的開(kāi)源手機(jī)操作系統(tǒng)。該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成,是首個(gè)為移動(dòng)終端打造的真正開(kāi)放移動(dòng)軟件,其開(kāi)放的平臺(tái)允許任何人在終端設(shè)備上開(kāi)發(fā)[3]。Android所包含的功能如下:
?。?)APPLICATIONS(應(yīng)用程序?qū)樱篈ndroid裝配了一個(gè)核心應(yīng)用集合,包括短信、日歷、地圖、通信錄等。所有應(yīng)用程序都是用Java語(yǔ)言編寫的。
?。?)APPLICATION FRAMEWORK(應(yīng)用程序框架層):Android具有強(qiáng)大的應(yīng)用層API和豐富的傳感器功能,所有的應(yīng)用程序其實(shí)是一組服務(wù)和系統(tǒng),主要包括如下內(nèi)容:視圖(View);內(nèi)容提供者(Content Providers);資源管理器(Resource Manager); 通知管理器(Notification Manager);活動(dòng)管理器(Activity Manager)。
?。?)LIBRARIES(庫(kù)):Android包含一個(gè)C/C++庫(kù)的集合,用來(lái)提供給Android系統(tǒng)多種組件使用,這些功能通過(guò)Android的應(yīng)用程序框架來(lái)提供給開(kāi)發(fā)者。
(4)ANDROID RUNTIME(Android運(yùn)行時(shí)):Android包含一個(gè)核心庫(kù)的集合,提供大部分在Java編程語(yǔ)言核心類庫(kù)中可用的功能。每一個(gè)Android應(yīng)用程序是Dalvik虛擬機(jī)中的實(shí)例,運(yùn)行在自己的進(jìn)程中。
?。?)LINUX KERNEL(Linux內(nèi)核):Android基于Linux2.6提供核心系統(tǒng)服務(wù),例如安全、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)堆棧、驅(qū)動(dòng)模型等。作為硬件和軟件之間的抽象層,它隱藏具體硬件細(xì)節(jié)而為上層提供統(tǒng)一的服務(wù)[4]。
2 硬件平臺(tái)
該物聯(lián)網(wǎng)無(wú)線測(cè)控系統(tǒng)的硬件平臺(tái)主要由STC12C5A60S2單片機(jī)、WISMO228無(wú)線通信模塊、I/O測(cè)控接口、本地串行通信接口等資源組成。硬件總體框架設(shè)計(jì)如圖1所示。
微控制器選用8 bit STC12C5A60S2系列單片機(jī),其指令格式完全兼容8051,但速度要快8~12倍。GPRS模塊選用基于GSM/GPRS的工業(yè)級(jí)無(wú)線通信模塊WISMO228,可直接由單片機(jī)串行口連接并通過(guò)AT命令控制等特性,能很好地適應(yīng)物聯(lián)網(wǎng)對(duì)遠(yuǎn)程測(cè)控的要求。以太網(wǎng)控制器選擇高度集成的全雙工以太網(wǎng)接口芯片RTL8019AS。
固件程序的主要功能包括初始化228模塊、生成短消息、解析短消息、有線和無(wú)線網(wǎng)絡(luò)的通信、控制I/O設(shè)備等。
3 終端應(yīng)用程序開(kāi)發(fā)
3.1 系統(tǒng)方案
?。?)系統(tǒng)開(kāi)發(fā)環(huán)境:本系統(tǒng)使用Android 應(yīng)用開(kāi)發(fā)工具和API 接口,基于JDK + Eclipse + ADT插件 + SDK的開(kāi)發(fā)環(huán)境。
?。?)系統(tǒng)設(shè)計(jì)流程:系統(tǒng)通過(guò)Activity管理相應(yīng)功能。首先進(jìn)入LOGO界面,然后跳轉(zhuǎn)到登錄界面,驗(yàn)證成功即可進(jìn)入TabView界面,創(chuàng)建異步任務(wù),進(jìn)行異步操作,這樣能夠提高處理速度,使軟件更加健全可靠。軟件系統(tǒng)架構(gòu)如圖2所示。
?。?)模塊化設(shè)計(jì):系統(tǒng)客戶端軟件主要包括界面模塊、數(shù)據(jù)庫(kù)模塊和功能控制模塊3個(gè)部分。
3.2 設(shè)計(jì)與實(shí)現(xiàn)
3.2.1 UI布局實(shí)現(xiàn)
Activity是Android的核心類,是一個(gè)用來(lái)提供屏幕與用戶交互的應(yīng)用組件[5]。Activity類通過(guò)onCreat()方法來(lái)初始化,由setContentView()方法指定一個(gè)布局(layout)文件,顯示布局文件的內(nèi)容。UI布局實(shí)現(xiàn)如下:
?。?)賬戶管理界面
在Android中,ListView是一個(gè)比較難于使用的控件,一個(gè)ListView通常有兩種功能,一是將數(shù)據(jù)填充到布局;二是處理用戶的選擇點(diǎn)擊等操作[8]。ListView以列表的形式展示具體內(nèi)容,并且能夠根據(jù)數(shù)據(jù)的長(zhǎng)度自適應(yīng)顯示。一個(gè)ListView的創(chuàng)建需要3個(gè)元素:ListView中的每一列的View;填入View的數(shù)據(jù)或者圖片等;連接數(shù)據(jù)域ListView的適配器[9]。
在本系統(tǒng)中設(shè)計(jì)了account_item.xml和account_manager.xml兩個(gè)布局文件,分別用來(lái)實(shí)現(xiàn)ListView中每個(gè)item對(duì)應(yīng)的View和管理賬戶界面AccountManagerActivity對(duì)應(yīng)的布局。本視圖通過(guò)自定義AccountManagerActivity繼承BaseAdapter實(shí)現(xiàn)數(shù)據(jù)綁定、accountList與ListView列表項(xiàng)一一對(duì)應(yīng)。其代碼如下:
accountList=(ListView)findViewById(R.id.lvAccountList);
adapter=new AccountManagerAdapter(this,users);
tabHost=getTabHost();
tabHost.addTab(tabHost.newTabSpec("GPRS")
.setIndicator("GPRS",getResources().getDrawable
(R.drawable.gprs))
.setContent(new Intent(this, GPRSActivity.class)));
控制器1完成對(duì)電視機(jī)的控制功能。當(dāng)設(shè)定的定時(shí)時(shí)間點(diǎn)擊確定按鈕,即開(kāi)始對(duì)電視機(jī)進(jìn)行開(kāi)機(jī)或關(guān)機(jī)操作;獲取控制器的響應(yīng)信息,顯示定時(shí)完成狀態(tài);在獲取控制器響應(yīng)信息之前,顯示正在定時(shí)狀態(tài)(如控制器2對(duì)冰箱的啟動(dòng)或關(guān)閉狀態(tài)控制)。
3.2.2 數(shù)據(jù)庫(kù)設(shè)計(jì)
本系統(tǒng)在使用過(guò)程中會(huì)頻繁對(duì)數(shù)據(jù)進(jìn)行操作,而對(duì)存儲(chǔ)卡文件進(jìn)行增、刪、改、查操作。為了提高效率,這里采取占用資源小的SQLite數(shù)據(jù)庫(kù)機(jī)制[10]。但數(shù)據(jù)庫(kù)并不能自身進(jìn)行操作,只有通過(guò)一個(gè)繼承了SQLiteOpenHelper的類對(duì)象調(diào)用相應(yīng)的函數(shù)進(jìn)行操作。這里定義了一個(gè)DBHelper繼承SQLiteOpenHelper。為了代碼重用,對(duì)賬戶管理操作和終端數(shù)據(jù)操作分別寫了兩個(gè)基類UserInfoServices和RmcsInfoServices來(lái)處理最底層的訪問(wèn);數(shù)據(jù)庫(kù)里的每一行記錄與UI列表的每一項(xiàng)一一對(duì)應(yīng)。
根據(jù)需求分析,本系統(tǒng)涉及兩個(gè)表:UserInfo、RmcsInfo,分別用于保存賬戶信息和終端數(shù)據(jù)信息,其數(shù)據(jù)結(jié)構(gòu)分別如表1和表2所示。這兩個(gè)表分別由UserInfoServices和RmcsInfoServices類管理。在DBHelper類的onCreate方法中通過(guò)執(zhí)行數(shù)據(jù)庫(kù)execSQL方法動(dòng)態(tài)創(chuàng)建這兩個(gè)表。其代碼如下:
db.execSQL(DBInfo.Table.SQL_CREATE_USER_INFO_TABLE);
db.execSQL(DBInfo.Table.SQL_CREATE_RMCS_INFO_TABLE);
另外,在UserInfoServices中主要封裝對(duì)賬戶的增、刪、改、查操作;在RmcsInfoServices中主要封裝對(duì)終端數(shù)據(jù)的相應(yīng)操作。主要采用的數(shù)據(jù)庫(kù)操作方法如下:
?。?)db.insert(table,nullColumnHack,values)向數(shù)據(jù)庫(kù)中插入一條記錄。
?。?)db.delete(table,whereClause,whereArgs)從數(shù)據(jù)庫(kù)中刪除一條記錄。
?。?)db.update(table,values,whereClause,whereArgs)更新數(shù)據(jù)庫(kù)中的一條記錄。
?。?)db.query(table,columns,selection,selectionArgs, groupBy,having,orderBy) 在數(shù)據(jù)庫(kù)中 查詢一條記錄,該方法返回的是一個(gè)Cursor對(duì)象。
3.2.3 GPRS通信模塊設(shè)計(jì)
物聯(lián)網(wǎng)無(wú)線測(cè)控系統(tǒng)的嵌入式微控制器與本地電器終端設(shè)備進(jìn)行數(shù)據(jù)通信,以獲得電器設(shè)備的運(yùn)行狀態(tài)參數(shù),通過(guò)GPRS模塊發(fā)送到GPRS網(wǎng)絡(luò)中。手機(jī)終端的GPRS接收模塊可以接收經(jīng)無(wú)線網(wǎng)絡(luò)傳遞進(jìn)來(lái)的數(shù)據(jù)進(jìn)行處理,同時(shí)還可以由GPRS發(fā)送模塊將封裝后的測(cè)控?cái)?shù)據(jù)傳送到終端設(shè)備,從而在物聯(lián)網(wǎng)平臺(tái)上對(duì)電器終端設(shè)備的開(kāi)關(guān),實(shí)現(xiàn)定時(shí)、排除異常、報(bào)警等監(jiān)控功能。
具體設(shè)計(jì)如下:
?。?)首先判斷是否接入網(wǎng)絡(luò)。在Android手機(jī)中可以通過(guò)ConnectivityManager類的isAvailable()方法判斷是否已聯(lián)網(wǎng),查看返回結(jié)果判斷網(wǎng)絡(luò)連接是否有效,如果為true,則表示當(dāng)前Android手機(jī)已經(jīng)聯(lián)網(wǎng);為false則表示沒(méi)有聯(lián)網(wǎng)。其代碼如下:
ConnectivityManager cManager=(ConnectivityManager)get System Service(Context.CONNECTIVITY_SERVICE); NetworkInfo info=cwjManager.getActiveNetworkInfo();
?。?)使用過(guò)程中必須建立GPRS連接,其代碼如下:
DataConnection conn=DataConnection.getInstance();
if(connectMode==0){
ret=conn.openConnection(mContext,"cmwap",
"cmwap","cmwap");
}else {ret=conn.openConnection(mContext,"cmnet","
","");}
?。?)Android平臺(tái)的網(wǎng)絡(luò)應(yīng)用絕大部分都是基于Java的編程接口,這里同樣采用了基于標(biāo)準(zhǔn)的Java接口。步驟如下:創(chuàng)建URL以及URLConnection/HttpURLConnection對(duì)象,設(shè)置連接參數(shù),連接到服務(wù)器,向服務(wù)器讀、寫數(shù)據(jù)等通信控制。其代碼如下:
URL url=new URL(Values.REQUEST_URL);
HttpURLConnection http
=(HttpURLConnection)url.openConnection();
connection.connect();
InputStream in=connection.getInputStream();
OutputStream outStream=connection.getOutputStream();
?。?)最后要在AndroidManifest.xml文件中加入權(quán)限:
<uses-permission
android:name="android.permission.ACCESS_NETWORK_ STATE"/>?
<uses-permission android:name="android.permission.INTERNET"/>
3.2.4 SMS通信模塊設(shè)計(jì)
?。?)Android SDK提供了用于直接發(fā)送短信的SmsManager類[11]。通過(guò)sendTextMessage方法可以指定目標(biāo)電話號(hào)碼和短信內(nèi)容。其代碼如下:
SmsManager sms=SmsManager.getDefault();
sms.sendTextMessage(number, null, str, null, null);
?。?)Android系統(tǒng)只要接收到短信,就會(huì)發(fā)一個(gè)廣播。因此,這里定義SMSReceiver繼承廣播接收器BroadcastReceiver,重寫onReceive()方法,用來(lái)監(jiān)聽(tīng)手機(jī)接收到的短信。此時(shí)要在AndroidManifest.xml文件中定義這個(gè)廣播接收器。其代碼如下:
<receiver android:name=".SMSReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
?。?)最后在配置文件中設(shè)置如下權(quán)限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
4 測(cè)試與結(jié)論
應(yīng)用程序設(shè)計(jì)完成后,就可以在Android SDK提供的AVD虛擬機(jī)上成功運(yùn)行,并且在基于Android平臺(tái)的移動(dòng)終端上測(cè)試運(yùn)行。本測(cè)試環(huán)境下使用的移動(dòng)終端采用華為C8650,該機(jī)型采用Android2.3.3系統(tǒng)版本。
將完成的應(yīng)用程序中的RMCSoftware.apk文件安裝在手機(jī)中,即可運(yùn)行程序。經(jīng)多次測(cè)試,手機(jī)客戶端能夠通過(guò)GPRS模塊和SMS模塊分別檢測(cè)和控制終端設(shè)備的運(yùn)行狀態(tài),并能夠正確地發(fā)送和接收數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行封裝和處理,可在較短的時(shí)間內(nèi)實(shí)現(xiàn)對(duì)設(shè)備的定時(shí)、排除異常等功能,應(yīng)用程序運(yùn)行良好,滿足了無(wú)線測(cè)控系統(tǒng)的功能需求。
參考文獻(xiàn)
[1] 王瑩.物聯(lián)網(wǎng)為嵌入式帶來(lái)的機(jī)遇[J].電子產(chǎn)品世界,2010(5).
[2] 劉強(qiáng),崔莉,陳海明,等.物聯(lián)網(wǎng)關(guān)鍵技術(shù)與應(yīng)用[J].計(jì)算機(jī)科學(xué).2010(6).
[3] 裴佳迪,馬超,孫仁貴,等.Google Android應(yīng)用開(kāi)發(fā)全程實(shí)錄[M].北京:人民郵電出版社,2012.
[4] 姚昱旻,劉衛(wèi)國(guó).Android的框架與應(yīng)用開(kāi)發(fā)研究[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008(11).
[5] 孟小華,陳傳凱.Android平臺(tái)手機(jī)來(lái)電及短信防火墻關(guān)鍵技術(shù)研究[C].2010 3rd International Conference on Power Electronics and Intelligent Transportation System. 2010.
[6] 張仕成.基于Google Android平臺(tái)的應(yīng)用程序開(kāi)發(fā)與研究[J].電腦知識(shí)與技術(shù),2009(28).
[7] 趙亮,張維.基于Android技術(shù)的界面設(shè)計(jì)與研究[J].電腦知識(shí)與技術(shù),2009(29).
[8] 韓超,梁泉.Android系統(tǒng)原理及開(kāi)發(fā)要點(diǎn)詳解[M].北京:電子工業(yè)出版社,2010.
[9] 耿東久,文軍.基于Android手機(jī)的遠(yuǎn)程訪問(wèn)和控制系統(tǒng)[J].計(jì)算機(jī)應(yīng)用,2011,31(2).
[10] Android如何使用SQLiteOpenHelper[EB/OL]. http://www.cnblogs.com/skynet/archive/2010/06/14/1758284.html<br>.
[11 魏化勇.基于3GAndroid的SMS應(yīng)用研究[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2011(11):191-183.