引言
随着智能系统的高速发展和智能移动终端的普及,在政府部门和企事业单位,员工使用Android系统的智能终端(包括手机和平板电脑)办公越来越多,利用网络对移动终端进行控制和管理,十分必要,目前的远程控制大多基于应用层实现,只能对特定的一些应用或者上层的一些权限进行管理和控制,不能对Android终端实现真正意义上的完全控制。另外,这些远程控制只是基于单个网络实现,不能保证远程控制的稳定实现。
本文研究的这种控制系统,可以采用多种网络进行通信,包括WiFi、GPRS和GSM三种网络。利用Android底层基于Linux系统实现的特性,在Linux底层建立一个Agent,获取系统签名,能够执行需要获取到root权限的shell命令,实现对整个系统的完全控制。
1无线远程控制系统构架
基于多网络(GPRS、WiFi、GSM)进行通信、通过Linux代理实现操作的无线远程控制系统,主要对多种网络通信方式进行适应性设计,以及对Android智能终端的系统设置、文件系统以及设备进行控制。
系统基本功能包括:自动注册、发送消息、发送文件、管理应用程序、发送shell命令控制设备等。
基于Linux代理的Android智能终端无线远程控制系统主要由3部分组成:控制端、被控终端和通信网络。系统的架构图如图1所示。
2 无线远程控制系统设计
2.1 多网络通信设计
Android智能终端目前支持的网络有:GPRS无线网络和WiFi无线网络。WiFi无线网络的优点是网速快,缺点是有范围和信号强度的要求。而GPRS的优缺点和WiFi无线网络正好相反。目前,GPRS的2G网络传输速率在50 kb/s左右,3G网络速度更快,如果采用WiFi网络接入到Internet,速度甚至可以达到1 Mb/s。速度上完全可以达到远程控制中传输命令的速率要求。
本系统采用多网络方式:优先选择WiFi无线网络,其次采用GPRS网络,最后采用GSM发送短消息控制。采用WiFi无线网络和GPRS网络的时候,Android终端之间通过Socket进行通信。
如果该系统只是应用在局域网内,就只能使用WiFi无线网络;如果应用在远程或者广域网上,就可以使用WiFi无线网络和GPRS网络两者相结合的方式;如果没有WiFi和GPRS,才使用GSM网络。
在广域网内使用时,当被控终靖启动系统的时候,会采用UDP方式向广域网发送登录广播,或者采用TCP协议向特定的控制端IP发送注册信息。控制端接收到信息后,注册到本机,然后通过TCP方式发送控制命令进行远程控制。
在没有WiFi和GPRS的情况下,也可以采用GSM网络发送短消息命令进行一些简单的控制操作,例如:打开WiFi、打开GPRS网络等,使其可以使用上述两种网络进行控制。使用GSM网络的前提条件是需要知道被控终端的SIM号码。
2. 2 控制端设计
Android控制端在使用WiFi和GPRS网络时,通过Socket进行通信,可以实现全部的命令;在使用GSM网络时,通过短消息发送命令进行控制,只能发送部分操作指令,不能进行的操作包括发送文件、应用程序等需要通过IP地址进行通信的操作。
Sqlite数据库保存被控终端的信息数据和操作日志。Linux文件系统保存需要发送的文件和应用程序等。Android控制端具体功能设计如下:
①自动注册:编写Java程序通过接口调用MulticastSocket发送请求注册广播,并监控端口,接收被控终端的注册广播。
②发送消息:通过已注册的被控终端IP地址,编程调用Socket接口发送消息到被控终端,并监听端口,接收反馈消息。
③发送文件:编写监控程序调用Socket端口进行通信,调用Android文件系统,读取存储在SD卡上的文件进行发送。
④发送控制命令:有两种方式,一种通过Socket发送控制命令到被控终端IP;另一种通过GSM网络发送特定格式的短消息到被控终端手机,实现命令控制设备。
2.3 被控终端设计
Android被控终端没有监控界面,只有一个后台服务和一个Agent代理,该代理也是一个后台服务,不过这个服务是集成在Android系统版本中的。
本地后台服务会随系统启动而启动,启动后会建立一个线程(Thread),线程通过Socket监听本机的通信端口;同时,还会建立一个广播接收器(BroadcastReceiver),用于接收通过GSM网络发来的短消息广播。当Socket端口监听线程监听到数据时,先判断其是否为控制端的注册请求。如果是,则反馈信息到控制端注册;如果不是,则判断是否为命令。如果是命令,则交给Agent代理执行;如果不是,再判断其是否为消息。如果是消息,则调用Android的Activity显示消息;如果不是,则继续判断其是否为文件。如果是文件,则保存文件到文件系统中;如果不是,则退出,丢弃该消息。当广播接收器接收到GSM短信时,后台服务对消息进行判断,看其是否为控制命令。如果是命令,则GSM短信会被截断,被控终端用户不会提示收到短消息,然后,将命令传递给Agent代理进行执行,调用Android系统接口对应的功能模块执行。最后,将执行结果通过Socket反馈给控制端。其对应的功能模块设计流程图如图2所示。
3 具体实现
3.1 多网络通信实现
该系统的总体设计思路是;一定数量的Android终端用户群之间,有一个作为控制端,其余的是被控终端,通过WiFi无线网、GPRS网络进行通信,控制端发送命令到被控终端执行,采用C/S结构。
(1) GPRS网络和WiFi网络通信实现
首先,在控制终端和被控端都建立一个TCP端口监听线程。分别建立一个ServerSocket,能各自监听自己的TCP端口,端口地址分别为:控制端为10000,被控终端10001。被控终端监听控制端发送命令信息,命令放在报头中,而文件等内容放在数据流中;命令会被执行并保存到数据中,文件会保存到SD卡上,等待被命令调用执行,在此,完成TCP通信。另外,控制端和被控端各自创建一个MulticastSocket对象,并加入一个组播地址,地址为234.0.0.1,控制端的端口为10002,被控终端端口为10003。控制端用以监听被控终端发送的登录广播信息;被控终端监听控制端发送的连接请求;当接收到组播UDP包后,取得源IP地址和源ID,将信息保存到本地数据库中,完成通信。
(2) GSM网络通信实现
如果在GPRS和WiFi都不通的情况下,使用GSM短信发送命令。具体如下:在被控制端建立一个Broadcast Receiver,接收系统短信广播,并将优先级设置为2147483674最高级别,这样会优先于其他方式先对短信内容进行处理。当有短信进入被控终端时,Broadcast Receiver会优先截取到短信内容,首先判断该短信是否为控制命令。如果是,则将命令发送到Service执行,同时截断广播,这样手机收件箱就不会收到该条短信。
3.2 控制端实现
控制端包括5个大的模块:操作界面、自动注册、发送消息、发送文件、应用管理。
操作界面:操作界面是基于应用层和应用框架层实现的。调用Android组件库中的Activity组件和ListActivity组件显示操作列表;点击列表按钮等组件用来调用操作命令;通过界面操作生成对应的命令发送到被控终端,并显示反馈结果。
自动注册:启动后,通过组播地址,每隔30 s向网络中发送一次心跳包,报文为“regist‖ask”,通知网络中的被控终端进行注册。监听UDP端口和TCP端口,当接收到被控终端发送的注册信息后,取出源IP地址和ID,保存到数据库中,完成注册。
发送消息:通过界面操作输入文本内容,向被控终端IP发送消息。报文为“sendMassage‖content”,第一部分是命令,第二部分是消息内容。
发送文件:选择本地文件向被控终端IP发送。采用Socket发送报文“sendfile‖filename//filePath”。该报文第1部分是命令,表示发送文件,第2部分是文件名,第3部分是文件保存路径。通过发送路径,可以替换被控终端上的文件,实现数据更新等功能。文件内容在Socket连接的输入/输出流中,保存的文件名和路径从报头中获取。
应用管理:首先,向被控终端IP发送命令,获取被控终端应用列表;然后,选择对应操作发送命令,在被控终端接收到命令后,调用Android接口和Agent代理执行命令。该命令包括4个:install、start、stop、uninstall。例如:报文“install ‖file.apk”,通过Socket发送file.apk应用到被控端的sdcard/apk目录下,然后,通过agent代理执行install安装命令安装该应用。此外,start、stop和uninstall三个命令中,只是调用接口执行,不传送文件。
3.3 被控终端实现
自动登录:被控终端启动的时候,也会建立两个线程和一个BroadCastReceiver。一个线程监听组播连接请求的消息,另一个线程监听TCP端口的命令;广播接收器接收GSM网络发送的短信命令。第一个线程中,组播端口监听到控制端发送的请求后,取得IP地址,然后,发送带有自己ID的Socket包,报文内容为"regist ‖IMEI号”,包括注册命令regist和IMEI号(Android终端唯一标识)。第二个线程中,创建一个ServerSocket,监听控制端发送的TCP消息。BroadCastReeeiver接收到短消息广播后,传递给服务进行判断,看其接收到的是否是命令,如果是命令则执行对应操作。
接收消息:在被控终端,Socket接收到控制端的消息后,会调用NotificationManager,在Android终端通知栏显示消息,点击通知会显示详细信息。
接收文件:Socket后台接收文件,保存在/sdcard/download文件夹下,然后通过Agent命令执行copy命令,将文件复制到命令里面指定的路径下。文件名和保存路径通过报头获取。
管理应用:安装应用分两步实现,第一步接收文件,第二步执行安装。第一步实现与上面所讲的接收文件相同,只是报文为"install‖n ame.apk”。默认保存到SD卡上的mnt/sdcard/apk路径下,然后,调用agent执行shell安装命令install mnt/sdeard/apk/name.apk。卸载应用时,直接执行接收到的命令uninstall packagename。启动应用时,通过Android系统接口Intent实现,停止和卸载都是通过被控终端上的Agent代理实现。“start‖appName”启动应用的时候,通过本地包管理获取到appName对应的包名packageName,新建一个Intent,启动包含该包的应用。代码如下:
通过shell命令执行kill PID。PID是应用进程号,通过ActivityManager可以获取到。
设备控制:可以通过命令例如“shell‖reboot”直接控制重启。
3.4 Agent代理实现
在编译系统内核的时候,将agent_server编入到路径/data/agentserver/agent_server下,用以接收命令。调用的时候,通过建立一个本地Socket,通过数据流发送shell命令到agent_setwer所在路径,实现通信。当agent_server接收到命令后,执行shell命令。
4 测试结果
设计的系统在ZTE U880手机上连接WiFi进行测试。图3为控制端界面,图4为控制端发送消息,图5为被控终端接收消息,图6为发送文件,图7为远程安装应用软件,图8为远程卸载应用软件,图9为shell命令界面。测试结果表明,系统能够实现发送消息、发送文件、安装和卸载应用,以及执行shell命令实现系统重启功能。
结语
本文设计了一个采用C/S模式实现的Android远程控制系统。控制端与被控终端之间采用Socket进行网络通信,在知道对方SIM卡号的情况下,也能通过GSM发送短信通信,能够实现多种网络的稳定通信。通过Linux代理能够实现root权限的操作,理论上可以实现对Android系统的完全远程控制。