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