引言
隨著智能系統(tǒng)的高速發(fā)展和智能移動終端的普及,在政府部門和企事業(yè)單位,,員工使用Android系統(tǒng)的智能終端(包括手機和平板電腦)辦公越來越多,,利用網(wǎng)絡(luò)對移動終端進行控制和管理,十分必要,,目前的遠程控制大多基于應(yīng)用層實現(xiàn),,只能對特定的一些應(yīng)用或者上層的一些權(quán)限進行管理和控制,不能對Android終端實現(xiàn)真正意義上的完全控制,。另外,,這些遠程控制只是基于單個網(wǎng)絡(luò)實現(xiàn),不能保證遠程控制的穩(wěn)定實現(xiàn),。
本文研究的這種控制系統(tǒng),,可以采用多種網(wǎng)絡(luò)進行通信,,包括WiFi、GPRS和GSM三種網(wǎng)絡(luò),。利用Android底層基于Linux系統(tǒng)實現(xiàn)的特性,,在Linux底層建立一個Agent,獲取系統(tǒng)簽名,,能夠執(zhí)行需要獲取到root權(quán)限的shell命令,,實現(xiàn)對整個系統(tǒng)的完全控制。
1 無線遠程控制系統(tǒng)構(gòu)架
基于多網(wǎng)絡(luò)(GPRS,、WiFi,、GSM)進行通信、通過Linux代理實現(xiàn)操作的無線遠程控制系統(tǒng),,主要對多種網(wǎng)絡(luò)通信方式進行適應(yīng)性設(shè)計,,以及對Android智能終端的系統(tǒng)設(shè)置、文件系統(tǒng)以及設(shè)備進行控制,。
系統(tǒng)基本功能包括:自動注冊,、發(fā)送消息、發(fā)送文件,、管理應(yīng)用程序,、發(fā)送shell命令控制設(shè)備等。
基于Linux代理的Android智能終端無線遠程控制系統(tǒng)主要由3部分組成:控制端,、被控終端和通信網(wǎng)絡(luò),。系統(tǒng)的架構(gòu)圖如圖1所示。
2 無線遠程控制系統(tǒng)設(shè)計
2.1 多網(wǎng)絡(luò)通信設(shè)計
Android智能終端目前支持的網(wǎng)絡(luò)有:GPRS無線網(wǎng)絡(luò)和WiFi無線網(wǎng)絡(luò),。WiFi無線網(wǎng)絡(luò)的優(yōu)點是網(wǎng)速快,,缺點是有范圍和信號強度的要求。而GPRS的優(yōu)缺點和WiFi無線網(wǎng)絡(luò)正好相反,。目前,,GPRS的2G網(wǎng)絡(luò)傳輸速率在50 kb/s左右,3G網(wǎng)絡(luò)速度更快,,如果采用WiFi網(wǎng)絡(luò)接入到Internet,,速度甚至可以達到1 Mb/s。速度上完全可以達到遠程控制中傳輸命令的速率要求,。
本系統(tǒng)采用多網(wǎng)絡(luò)方式:優(yōu)先選擇WiFi無線網(wǎng)絡(luò),,其次采用GPRS網(wǎng)絡(luò),最后采用GSM發(fā)送短消息控制,。采用WiFi無線網(wǎng)絡(luò)和GPRS網(wǎng)絡(luò)的時候,,Android終端之間通過Socket進行通信。
如果該系統(tǒng)只是應(yīng)用在局域網(wǎng)內(nèi),就只能使用WiFi無線網(wǎng)絡(luò),;如果應(yīng)用在遠程或者廣域網(wǎng)上,,就可以使用WiFi無線網(wǎng)絡(luò)和GPRS網(wǎng)絡(luò)兩者相結(jié)合的方式;如果沒有WiFi和GPRS,,才使用GSM網(wǎng)絡(luò),。
在廣域網(wǎng)內(nèi)使用時,當被控終靖啟動系統(tǒng)的時候,,會采用UDP方式向廣域網(wǎng)發(fā)送登錄廣播,,或者采用TCP協(xié)議向特定的控制端IP發(fā)送注冊信息??刂贫私邮盏叫畔⒑?,注冊到本機,然后通過TCP方式發(fā)送控制命令進行遠程控制,。
在沒有WiFi和GPRS的情況下,,也可以采用GSM網(wǎng)絡(luò)發(fā)送短消息命令進行一些簡單的控制操作,例如:打開WiFi,、打開GPRS網(wǎng)絡(luò)等,,使其可以使用上述兩種網(wǎng)絡(luò)進行控制。使用GSM網(wǎng)絡(luò)的前提條件是需要知道被控終端的SIM號碼,。
2. 2 控制端設(shè)計
Android控制端在使用WiFi和GPRS網(wǎng)絡(luò)時,,通過Socket進行通信,,可以實現(xiàn)全部的命令,;在使用GSM網(wǎng)絡(luò)時,通過短消息發(fā)送命令進行控制,,只能發(fā)送部分操作指令,,不能進行的操作包括發(fā)送文件、應(yīng)用程序等需要通過IP地址進行通信的操作,。
Sqlite數(shù)據(jù)庫保存被控終端的信息數(shù)據(jù)和操作日志,。Linux文件系統(tǒng)保存需要發(fā)送的文件和應(yīng)用程序等。Android控制端具體功能設(shè)計如下:
①自動注冊:編寫Java程序通過接口調(diào)用MulticastSocket發(fā)送請求注冊廣播,,并監(jiān)控端口,,接收被控終端的注冊廣播。
②發(fā)送消息:通過已注冊的被控終端IP地址,,編程調(diào)用Socket接口發(fā)送消息到被控終端,,并監(jiān)聽端口,接收反饋消息,。
③發(fā)送文件:編寫監(jiān)控程序調(diào)用Socket端口進行通信,,調(diào)用Android文件系統(tǒng),讀取存儲在SD卡上的文件進行發(fā)送。
④發(fā)送控制命令:有兩種方式,,一種通過Socket發(fā)送控制命令到被控終端IP,;另一種通過GSM網(wǎng)絡(luò)發(fā)送特定格式的短消息到被控終端手機,實現(xiàn)命令控制設(shè)備,。
2.3 被控終端設(shè)計
Android被控終端沒有監(jiān)控界面,,只有一個后臺服務(wù)和一個Agent代理,該代理也是一個后臺服務(wù),,不過這個服務(wù)是集成在Android系統(tǒng)版本中的,。
本地后臺服務(wù)會隨系統(tǒng)啟動而啟動,啟動后會建立一個線程(Thread),,線程通過Socket監(jiān)聽本機的通信端口,;同時,還會建立一個廣播接收器(BroadcastReceiver),,用于接收通過GSM網(wǎng)絡(luò)發(fā)來的短消息廣播,。當Socket端口監(jiān)聽線程監(jiān)聽到數(shù)據(jù)時,先判斷其是否為控制端的注冊請求,。如果是,,則反饋信息到控制端注冊;如果不是,,則判斷是否為命令,。如果是命令,則交給Agent代理執(zhí)行,;如果不是,,再判斷其是否為消息。如果是消息,,則調(diào)用Android的Activity顯示消息,;如果不是,則繼續(xù)判斷其是否為文件,。如果是文件,,則保存文件到文件系統(tǒng)中;如果不是,,則退出,,丟棄該消息。當廣播接收器接收到GSM短信時,,后臺服務(wù)對消息進行判斷,,看其是否為控制命令。如果是命令,,則GSM短信會被截斷,,被控終端用戶不會提示收到短消息,,然后,將命令傳遞給Agent代理進行執(zhí)行,,調(diào)用Android系統(tǒng)接口對應(yīng)的功能模塊執(zhí)行,。最后,將執(zhí)行結(jié)果通過Socket反饋給控制端,。其對應(yīng)的功能模塊設(shè)計流程圖如圖2所示,。
3 具體實現(xiàn)
3.1 多網(wǎng)絡(luò)通信實現(xiàn)
該系統(tǒng)的總體設(shè)計思路是;一定數(shù)量的Android終端用戶群之間,,有一個作為控制端,,其余的是被控終端,通過WiFi無線網(wǎng),、GPRS網(wǎng)絡(luò)進行通信,,控制端發(fā)送命令到被控終端執(zhí)行,采用C/S結(jié)構(gòu),。
(1) GPRS網(wǎng)絡(luò)和WiFi網(wǎng)絡(luò)通信實現(xiàn)
首先,,在控制終端和被控端都建立一個TCP端口監(jiān)聽線程。分別建立一個ServerSocket,,能各自監(jiān)聽自己的TCP端口,,端口地址分別為:控制端為10000,被控終端10001,。被控終端監(jiān)聽控制端發(fā)送命令信息,,命令放在報頭中,而文件等內(nèi)容放在數(shù)據(jù)流中,;命令會被執(zhí)行并保存到數(shù)據(jù)中,,文件會保存到SD卡上,等待被命令調(diào)用執(zhí)行,,在此,,完成TCP通信,。另外,,控制端和被控端各自創(chuàng)建一個MulticastSocket對象,并加入一個組播地址,,地址為234.0.0.1,,控制端的端口為10002,被控終端端口為10003,??刂贫擞靡员O(jiān)聽被控終端發(fā)送的登錄廣播信息;被控終端監(jiān)聽控制端發(fā)送的連接請求,;當接收到組播UDP包后,,取得源IP地址和源ID,,將信息保存到本地數(shù)據(jù)庫中,完成通信,。
(2) GSM網(wǎng)絡(luò)通信實現(xiàn)
如果在GPRS和WiFi都不通的情況下,,使用GSM短信發(fā)送命令。具體如下:在被控制端建立一個Broadcast Receiver,,接收系統(tǒng)短信廣播,,并將優(yōu)先級設(shè)置為2147483674最高級別,這樣會優(yōu)先于其他方式先對短信內(nèi)容進行處理,。當有短信進入被控終端時,,Broadcast Receiver會優(yōu)先截取到短信內(nèi)容,首先判斷該短信是否為控制命令,。如果是,,則將命令發(fā)送到Service執(zhí)行,同時截斷廣播,,這樣手機收件箱就不會收到該條短信,。
3.2 控制端實現(xiàn)
控制端包括5個大的模塊:操作界面、自動注冊,、發(fā)送消息,、發(fā)送文件、應(yīng)用管理,。
操作界面:操作界面是基于應(yīng)用層和應(yīng)用框架層實現(xiàn)的,。調(diào)用Android組件庫中的Activity組件和ListActivity組件顯示操作列表;點擊列表按鈕等組件用來調(diào)用操作命令,;通過界面操作生成對應(yīng)的命令發(fā)送到被控終端,,并顯示反饋結(jié)果。
自動注冊:啟動后,,通過組播地址,,每隔30 s向網(wǎng)絡(luò)中發(fā)送一次心跳包,報文為“regist‖ask”,,通知網(wǎng)絡(luò)中的被控終端進行注冊,。監(jiān)聽UDP端口和TCP端口,當接收到被控終端發(fā)送的注冊信息后,,取出源IP地址和ID,,保存到數(shù)據(jù)庫中,完成注冊,。
發(fā)送消息:通過界面操作輸入文本內(nèi)容,,向被控終端IP發(fā)送消息。報文為“sendMassage‖content”,,第一部分是命令,,第二部分是消息內(nèi)容,。
發(fā)送文件:選擇本地文件向被控終端IP發(fā)送。采用Socket發(fā)送報文“sendfile‖filename//filePath”,。該報文第1部分是命令,,表示發(fā)送文件,第2部分是文件名,,第3部分是文件保存路徑,。通過發(fā)送路徑,可以替換被控終端上的文件,,實現(xiàn)數(shù)據(jù)更新等功能,。文件內(nèi)容在Socket連接的輸入/輸出流中,保存的文件名和路徑從報頭中獲取,。
應(yīng)用管理:首先,,向被控終端IP發(fā)送命令,獲取被控終端應(yīng)用列表,;然后,,選擇對應(yīng)操作發(fā)送命令,在被控終端接收到命令后,,調(diào)用Android接口和Agent代理執(zhí)行命令,。該命令包括4個:install、start,、stop,、uninstall。例如:報文“install ‖file.a(chǎn)pk”,,通過Socket發(fā)送file.a(chǎn)pk應(yīng)用到被控端的sdcard/apk目錄下,,然后,通過agent代理執(zhí)行install安裝命令安裝該應(yīng)用,。此外,,start、stop和uninstall三個命令中,,只是調(diào)用接口執(zhí)行,,不傳送文件。
3.3 被控終端實現(xiàn)
自動登錄:被控終端啟動的時候,,也會建立兩個線程和一個BroadCastReceiver,。一個線程監(jiān)聽組播連接請求的消息,,另一個線程監(jiān)聽TCP端口的命令,;廣播接收器接收GSM網(wǎng)絡(luò)發(fā)送的短信命令。第一個線程中,,組播端口監(jiān)聽到控制端發(fā)送的請求后,,取得IP地址,,然后,發(fā)送帶有自己ID的Socket包,,報文內(nèi)容為"regist ‖IMEI號”,,包括注冊命令regist和IMEI號(Android終端唯一標識)。第二個線程中,,創(chuàng)建一個ServerSocket,,監(jiān)聽控制端發(fā)送的TCP消息。BroadCastReeeiver接收到短消息廣播后,,傳遞給服務(wù)進行判斷,,看其接收到的是否是命令,如果是命令則執(zhí)行對應(yīng)操作,。
接收消息:在被控終端,,Socket接收到控制端的消息后,會調(diào)用NotificationManager,,在Android終端通知欄顯示消息,,點擊通知會顯示詳細信息。
接收文件:Socket后臺接收文件,,保存在/sdcard/download文件夾下,,然后通過Agent命令執(zhí)行copy命令,將文件復(fù)制到命令里面指定的路徑下,。文件名和保存路徑通過報頭獲取,。
管理應(yīng)用:安裝應(yīng)用分兩步實現(xiàn),第一步接收文件,,第二步執(zhí)行安裝,。第一步實現(xiàn)與上面所講的接收文件相同,只是報文為"install‖n ame.a(chǎn)pk”,。默認保存到SD卡上的mnt/sdcard/apk路徑下,,然后,調(diào)用agent執(zhí)行shell安裝命令install mnt/sdeard/apk/name.a(chǎn)pk,。卸載應(yīng)用時,,直接執(zhí)行接收到的命令uninstall packagename。啟動應(yīng)用時,,通過Android系統(tǒng)接口Intent實現(xiàn),,停止和卸載都是通過被控終端上的Agent代理實現(xiàn)。“start‖appName”啟動應(yīng)用的時候,,通過本地包管理獲取到appName對應(yīng)的包名packageName,,新建一個Intent,啟動包含該包的應(yīng)用,。代碼如下:
通過shell命令執(zhí)行kill PID,。PID是應(yīng)用進程號,,通過ActivityManager可以獲取到。
設(shè)備控制:可以通過命令例如“shell‖reboot”直接控制重啟,。
3.4 Agent代理實現(xiàn)
在編譯系統(tǒng)內(nèi)核的時候,,將agent_server編入到路徑/data/agentserver/agent_server下,用以接收命令,。調(diào)用的時候,,通過建立一個本地Socket,通過數(shù)據(jù)流發(fā)送shell命令到agent_setwer所在路徑,,實現(xiàn)通信,。當agent_server接收到命令后,執(zhí)行shell命令,。
4 測試結(jié)果
設(shè)計的系統(tǒng)在ZTE U880手機上連接WiFi進行測試,。圖3為控制端界面,圖4為控制端發(fā)送消息,,圖5為被控終端接收消息,,圖6為發(fā)送文件,圖7為遠程安裝應(yīng)用軟件,,圖8為遠程卸載應(yīng)用軟件,,圖9為shell命令界面。測試結(jié)果表明,,系統(tǒng)能夠?qū)崿F(xiàn)發(fā)送消息,、發(fā)送文件、安裝和卸載應(yīng)用,,以及執(zhí)行shell命令實現(xiàn)系統(tǒng)重啟功能,。
結(jié)語
本文設(shè)計了一個采用C/S模式實現(xiàn)的Android遠程控制系統(tǒng)??刂贫伺c被控終端之間采用Socket進行網(wǎng)絡(luò)通信,,在知道對方SIM卡號的情況下,也能通過GSM發(fā)送短信通信,,能夠?qū)崿F(xiàn)多種網(wǎng)絡(luò)的穩(wěn)定通信,。通過Linux代理能夠?qū)崿F(xiàn)root權(quán)限的操作,理論上可以實現(xiàn)對Android系統(tǒng)的完全遠程控制,。