具有数据加密的Android蓝牙远程控制
随着科技的不断的发展,以及人们对于高科技产品的依赖,智能可穿戴设备逐步的发展起来,走进了人们的日常生活。智能手表、智能眼镜的问世为智能可穿戴设备的发展带来了新的方向,Android系统广泛的应用于智能可穿戴设备、智能手机中。为了使智能可穿戴设备更好的与手机相互配合,满足于人们的需求,本文研究了蓝牙远程控制功能,实现了具有远程控制功能的应用程序。由于通过蓝牙传送的数据能够被追踪窃取到,发送数据的安全性也尤为重要,通过比较本文采用RC4和RSA混合加密方式对发送的数据进行加密。为了适应不同品牌的智能手表,首先实现了在手机之间的远程控制功能。程序应用在手表上时,只需对显示界面的长宽比例根据手表的分辨率进行修改,即可满足功能性的需求。
本文引用地址://m.amcfsurvey.com/article/201610/309256.htm1 蓝牙模块设计
1.1 Android设备间建立蓝牙连接
实现通过蓝牙的远程控制,最基本的操作是要先建立设备之间的蓝牙连接,Android SDK提供了功能完善的API,通过调用系统的API能够实现对附近蓝牙设备搜索、返回远程设备的硬件地址、建立连接、断开连接等工作。蓝牙连接的建立主要分为以下两个步骤:
(1)搜索附近蓝牙设备
BluetoothAdapter 类中提供了本地蓝牙适配器的接口,所有的蓝牙交互都是从此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 字节的头结点最多可以标识出256种不同的信息类型,在现阶段的使用过程中能够满足需求,当然如果控制类型增加,只需增加控制位的位数。定义的数据结构如下所示:
![自定义蓝牙远程控制协议](http://m.amcfsurvey.com/editerupload/fetch/20160912/309256_1_0.jpg)
本应用程序实现了手机通过蓝牙远程控制另一部手机进行图片预览以及拍照功能。因此发送信息分为两类,一类发送的是图像的数据信息,在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数据加密过程](http://m.amcfsurvey.com/editerupload/fetch/20160912/309256_1_1.jpg)
图 1数据加密过程
加密的过程主要分为两步:
第一步,对于原始数据 Original Message用RC4秘钥来进行加密。
第二步,对于RC4秘钥使用RSA进行加密,保证了此秘钥在数据传输安全性。防止了信息被截取后,容易分析出RC4秘钥内容的风险。
解密过程如图2所示。
![图2数据解密过程](http://m.amcfsurvey.com/editerupload/fetch/20160912/309256_1_2.jpg)
图2数据解密过程
解密过程同样分为两个步骤,当应用程序收到发送来的数据后,第一步读取RC4秘钥部分,通过RSA的私有秘钥进行解密,还原RC4秘钥。第二步,使用RC4秘钥对数据部分进行解密,还原出图像信息。
掌握了RC4加密算法和RSA加密算法后,即可实现混合加密算法。对发送的数据进行混合加密,保证用户数据的安全性。
最终写入蓝牙输出流中的数据主要包含3部分,如下所示:
![最终写入蓝牙输出流中的数据](http://m.amcfsurvey.com/editerupload/fetch/20160912/309256_1_3.jpg)
第一部分,数据的长度,在Android程序中,为了将连续发送的图片的信息,每一帧识别出来,还需要在头部添加一个数据信息长度。以便在数据被接收到后,能够确定所要读取的字节数。
第二部分是RC4秘钥,这部分中RC4的秘钥是被RSA所加密后的结果,能够保证RC4的秘钥再被窃取到后也不能够直接使用,在当今计算机的运算效率下,还不能够实现对RSA加密算法的破解。
第三部分是经RC4加密的数据信息。来自上层的应用程序欲发送的未加密的数据到了此模块,要进行RC4加密。信息中保存着所有的用户操作的信息。这部分的数据长度是根据情况来分配。如果是控制信息,那么信息长度会非常短。如果是图片数据,那么信息长度会比较长。这个长度信息由第一部分的数据长度进行记录。
3.蓝牙远程控制拍照程序设计
本程序是在基于Android操作系统的智能手机上构建的一个远程控制程序。程序中包括着蓝牙连接的建立、蓝牙数据的编码与传送、数据加密3部分。实现了通过手机实时显示另一部手机端摄像头采集到的数据,通过点击程序中的拍照键即可控制手机进行照片的拍摄。程序的流程图如图3所示。
![图3蓝牙远程控制程序流程图](http://m.amcfsurvey.com/editerupload/fetch/20160912/309256_1_4.jpg)
图3蓝牙远程控制程序流程图
3.1 建立蓝牙连接
创建DeviceListActivity类用于蓝牙设备的搜索,返回选择的蓝牙设备的名称和地址。
其功能流程如图4所示。
![图4蓝牙连接建立流程图](http://m.amcfsurvey.com/editerupload/fetch/20160912/309256_1_5.jpg)
图4蓝牙连接建立流程图
通过搜索设备功能可获得周围可见的蓝牙设备信息,以列表的形式显示所有搜索到的设备。用户根据需要,选择所要连接的设备,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混合加密方式,再上一节中详细的予以阐述。数据加密的流程如图5所示。
![图5 数据加密流程图](http://m.amcfsurvey.com/editerupload/fetch/20160912/309256_1_6.jpg)
图5 数据加密流程图
在接收端,线程一直等待蓝牙发送的数据,当读取到数据,便根据解密的方法,依次去除加密信息。解密的顺序与加密构成逆过程。解密流程如图6所示。
![图6 数据解密流程图](http://m.amcfsurvey.com/editerupload/fetch/20160912/309256_1_7.jpg)
图6 数据解密流程图
对于解密出来的数据,要对其分析判断数据的类型,根据自定义的蓝牙数据结构可知,数据的第一位即为数据类型位。进行数据类型判断的主要程序如下所示:
switch(decr[0]) {
case TAKE_PHOTO:
mHandler.obtainMessage(MainActivity.MESSAGE_READ, -1,TAKE_PHOTO , buffer).sendToTarget();
break;
case DATA:
mHandler.obtainMessage(MainActivity.MESSAGE_READ, decr.length,DATA, decr).sendToTarget();
break;
}
通过以上3个步骤,便实现了远程控制的功能。在实际应用中,其中一部手机作为被控制端,实时的将照相机采集到的数据发送到另一部手机。控制端实时显示接收到的图像,当需要拍摄照片时候,点击拍照按钮,即可实现远程控制的功能,完成照片的拍摄,并将照片存储起来。
结语
本文实现了基于Android系统的蓝牙远程控制功能。极大的丰富用户对于智能设备功能的需求。在数据传送的过程中,使用了混合加密算法对数据加密,保证了用户数据的安全以及保证了设备不被他人控制。在方便人们生活的同时也保护了用户的隐私。随着智能可穿戴设备的发展,智能设备通过蓝牙相互连接和相互控制的应用也会比较广泛,智能可穿戴设备的主要以搭载Android系统为主。本文中实现的远程控制拍摄照片的功能,移植到手表端,核心的程序部分均不需要改动,在程序显示界面部分根据不同种类设备的分辨率进行相应的调整,便能实现通过蓝牙进行远程控制的功能。
评论