引言
随着科技的不断发展,以及人们对于高科技产品的依赖,智能可穿戴设备逐步发展起来,并正在进入人们的日常生活。智能手表、智能眼镜的问世为可穿戴设备的发展带来了新的方向,Android系统正广泛地应用于智能可穿戴设备、智能手机中。为了使可穿戴设备更好地与手机相互配合,满足人们的需求,本文研究了通过蓝牙远程控制功能实现具有远程控制功能的应用程序。由于通过蓝牙传送的数据能够被追踪窃取,发送数据的安全性就尤为重要,通过比较,本文采用RC4和RSA混合加密方式对发送的数据进行加密。
1 蓝牙模块设计
1.1 Android设备间建立蓝牙连接
实现通过蓝牙进行远程控制[1],最基本的操作是要先建立设备之间的蓝牙连接,Android SDK提供了功能完善的API,通过调用系统的API能够完成搜索附近蓝牙设备、返回远程设备的硬件地址、建立蓝牙连接、断开连接等工作。蓝牙连接的建立主要分为两个步骤。
(1) 搜索附近蓝牙设备
Bluetooth Adapter类中提供了本地蓝牙适配器的接口,所有的蓝牙交互都是从此API开始的,主要功能有开关蓝牙设备、扫描蓝牙设备、设置或获取蓝牙状态值、获取蓝牙名称、获取蓝牙Mac地址等。调用enable()打开本地蓝牙,然后调用startDiscovery()搜索附近设备,将所有搜索到的蓝牙地址存储在列表中。通过获得的远程蓝牙设备的地址,实例化一个蓝牙设备的语句如下:
BluetoothDevice device =BluetoothAdapter.getRemoteDevice(address)
(2) 建立蓝牙连接
建立蓝牙连接过程中的两个设备,分别充当了Server和Client。Server端通过UUID来创建一个BluetoothServerSocket,以收听来自其他设备的连接请求。当有远端设备发来建立连接的请求时,对请求进行响应从而实现蓝牙的连接。在程序中使用如下语句:
BluetoothServerSocket mmServerSocket =mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, Y_UUID_SECURE);
Client端使用第1步中实例化的蓝牙设备BluetoothDevice,通过 UUID创建一个BluetoothSocket,发送连接请求,并与Server端建立连接,从而来实现数据的接收和发送。在程序中使用如下语句:
BluetoothSocket mmSocket =device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
Server端BluetoothServerSocket代表一个打开服务器套接字侦听传入的请求,类似于一个TCP SeverSocket,当连接建立成功后,调用BluetoothServerSocket接口的accept()方法,返回一个BluetoothSocket对象。BluetoothSocket代表一个蓝牙套接字,类似于 TCP套接字,是应用程序的连接点,通过此接口可以实现蓝牙数据的接收和发送。调用BluetoothSocket接口中的方法,得到输入/输出流,在应用程序中向输出流中写数据实现蓝牙数据的发送,从输入流读取数据,实现蓝牙数据的接收。
1.2 自定义蓝牙远程控制协议
Android系统上的蓝牙连接过程通过1.1节中的两步即可完成,在应用中蓝牙使用仅限于数据的传送,对于数据的内容并不关心。然而这并不能满足用户的需求,用户更期望通过蓝牙实现远程控制功能[2]。当前蓝牙发送的数据并没有对内容进行考虑,仅仅是简单的数据传送,如果想实现蓝牙的远程控制,就需要自定义发送的数据结构。控制信息和普通数据信息均通过蓝牙在设备之间进行传送,若想对控制信息和数据信息进行区分,就要在已有的发送数据的首部添加头结点。设置头结点占用1字节的存储空间,作为控制位标识,用来标识传递信息的类型。1字节的头结点最多可以标识出256种不同的信息类型,在现阶段的使用过程中能够满足需求,如果控制类型增加,只需增加控制位的位数。
本应用程序实现了手机通过蓝牙远程控制另一部手机进行图片预览以及拍照功能[3],因此发送信息分为两类:一类发送的是图像的数据信息,在Android程序中定义控制位为“private static final byte DATA =(byte) 0”;另一类是拍照指令,在Android程序中定义控制位为“
private static final byte TAKE_PHOTO = (byte)1”。
如果欲实现更多的控制功能,可以自定义更多的控制位类别,在程序中进行相应地响应。
当Sever端收到数据以后,对于数据的头结点进行判断。通过判断控制位的类型来区分是数据信息还是控制信息,返回给主函数对其进行响应。如果接收到的数据包为数据信息,则调用图像显示功能,将接收的图片显示出来。如果收到的数据的是拍照指令,则可调用拍照功能模块,将拍摄的照片进行存储。
2 加密模块设计
虽然自定义的蓝牙数据结构满足了人们通过蓝牙远程控制的需求,但也存在着一定的安全性问题。在实际生活中,环境比较复杂,无线传输的信号会被他人通过一些工具监测并且窃取。如果传送的图片信息被他人截取,用户的隐私就会被轻易地泄露。然而这并不算最危险的,如果在程序中添加了很多控制信息,被他人截取并且掌握后,就会导致手机被他人控制,给用户带来更大的损失。
为了保证信息的安全性,需要对蓝牙发送的数据进行加密操作。数据的加密一般要经过复杂加密算法来实现,然而对于手机而言,运算效率不是很高,而且若要实时预览远程设备采集到的数据,就意味着要在极短的时间内加密和解密大量的数据,那么加密算法的加密效率就更加关键。
参考文献4通过使用一种基于AES和RSA的混合加密算法来保证蓝牙通信过程中的数据安全。AES算法以其在块加密高效的特点应用于蓝牙通信的数据信息加密上,RSA算法在秘钥管理上比较有优势,有很高的安全性,因此用来加密AES的秘钥信息。
参考文献5对RC4 和AES在设备CPU时间占用、内存消耗以及电池电量的消耗方面进行了分析对比,得出RC4更适合于大数据包的加密,而AES更适合于小数据包的加密。
经过多方面的综合比较,本文采用RC4和RSA混合加密的方式对数据进行加密。利用RC4对大数据包加密速度快的优势,
首先对数据使用RC4进行加密,由于RC4加密算法相对简单,其安全性也存在着一定的风险,因此采用混合加密的处理方式对数据进行操作。使用RC4加密算法加密完数据信息后进行第二次加密——加密RC4的秘钥信息。由于RC4秘钥的长度比较短可以采用运算过程相对复杂,
但是安全性较高的RSA加密算法。数据加密过程如图1所示。

图1 数据加密过程
加密的过程主要分为两步:第一步,对于原始数据用RC4秘钥来进行加密;第二步,对于RC4秘钥使用RSA进行加密,以保证此秘钥数据传输的安全性,降低信息被截取后RC4秘钥内容被破解的风险。解密过程如图2所示。

图2数据解密过程
解密过程同样分为两个步骤:第一步当应用程序收到发送来的数据后,读取RC4秘钥部分,通过RSA的私有秘钥进行解密,还原RC4秘钥;第二步,使用RC4秘钥对数据部分进行解密,还原出图像信息。
掌握了RC4加密算法和RSA加密算法后,即可实现混合加密算法。对发送的数据进行混合加密,保证用户数据的安全。
最终写入蓝牙输出流中的数据主要包含3部分,如下所示:

第一部分是数据长度。在Android程序中,为了将连续发送的图片的信息的每一帧识别出来,需要在头部添加一个数据信息长度,以便在数据被接收到后确定所要读取的字节数。
第二部分是RC4秘钥。RC4秘钥是被RSA加密后的结果,能够保证RC4的秘钥被窃取后也无法直接使用,在当今计算机的运算效率下,还不能够实现对RSA加密算法的破解。
第三部分是经RC4加密的数据信息。来自上层的应用程序欲发送的未加密数据进入此模块后要进行RC4加密,信息中保存所有用户操作的信息。这部分的数据长度根据情况来分配,长度信息由第一部分的数据长度进行记录。如果是控制信息,信息长度会非常短;如果是图片数据,信息长度会比较长。
3 蓝牙远程控制拍照程序设计
本程序是在基于Android操作系统的智能手机上构建的远程控制程序,包括蓝牙连接的建立、蓝牙数据的编码与发送、数据加密3部分,实现了通过手机实时显示另一部手机端摄像头采集到的数据,以及通过点击拍照键控制手机进行照片的拍摄。蓝牙远程控制程序的流程图如图3所示。

图3 蓝牙远程控制程序流程图
3.1 蓝牙连接建立
创建DeviceListActivity类用于蓝牙设备的搜索,返回选择的蓝牙设备的名称和地址。其功能流程略——编者注。
通过搜索设备功能可获得周围可见的蓝牙设备信息,以列表的形式显示所有搜索到的设备。用户根据需要选择所要连接的设备、DeviceListActivity类返回设备的名称以及MAC地址。
3.2 蓝牙数据编码与发送
根据 DeviceListActivity返回的远端蓝牙设备的名称和地址,调用Bluetooth API建立蓝牙设备的连接,当连接建立完成后便进入到主功能模块。
首先在onCreat()函数中完成参数的初始化工作,初始化发送标志位SendFlag=0,在此状态下,应用程序处于接收数据的状态。摄像头停止采集图像信息,不进行数据发送。接着初始化Button监听事件,应用程序中定义了两个Button,一个Button用来控制此Activity处于发送还是接收的状态,另一个Button用来控制是否对拍照功能予以响应。
Activity处于发送状态时,将Camera采集到的每一帧数据进行处理,由于图片比较大,蓝牙发送的数据速率是有限的,为了保证接收端收到的视频图像的连贯性,要对采集到的图片进行压缩处理。可调用Android API中 Matrix的postScale()方法设置缩放比例,实现图片的缩放。
接下来数据部分要添加信息头,如果是拍照的控制信息,添加第1节中设定的TAKE_PHOTO(为数值1);如果是照片信息,添加DATA(为数值0)。通过添加信息头,便实现了对于数据信息和控制信息的区分。最后,对数据进行加密。
3.3 数据加密
数据加密采用RC4与RSA混合加密方式,数据加密的流程如图4所示。

图4 数据加密流程图
在接收端,线程一直等待蓝牙发送的数据,当读取到数据时根据解密的方法依次去除加密信息。解密流程如图5所示。
对于解密出来的数据,要对其分析判断数据的类型,根据自定义的蓝牙数据结构可知,数据的第一位为数据类型位。进行数据类型判断的主要程序略——编者注。

图5 数据解密流程图
通过以上3个步骤,便实现了远程控制功能。在实际应用中,其中一部手机作为被控制端,实时地将照相机采集到的数据发送到另一部手机,控制端实时显示接收到的图像,当需要拍摄照片时,点击拍照按钮完成照片的拍摄,并将照片存储起来。系统运行的结果如图6所示,在图中左侧手机为被控制端,右侧手机为控制端。右侧手机能够实时显示左侧手机采集到的图像,并且能够控制其进行拍照,拍摄的照片如图7所示。

图6 系统运行结果
结语
本文实现了基于Android系统的蓝牙远程控制功能,大大地丰富了智能设备的功能。在数据传送的过程中,使用了混合加密算法对数据加密,保证了用户数据的安全和设备不被他人控制。本文中实现的远程控制拍摄照片的功能可移植到手表端,核心程序部分均不需要改动,只需在程序显示界面部分根据不同种类设备的分辨率进行相应地调整,便能实现通过蓝牙进行远程控制的功能。

图7 被控制端拍摄到的图片