冯益斌
摘 要: 近年来搭载Android系统的智能可穿戴设备发展迅速,蓝牙通信技术广泛地应用在智能可穿戴设备中,使其能与手机之间相互通信,实现图片、视频、文件等数据传送功能。研究基于Android系统的蓝牙远程控制功能,通过建立的蓝牙连接,实现智能手表与手机之间的数据传送,为了保障数据的安全性,对传送的数据进行了混合加密。应用程序运行在搭载Android系统的GEAR智能手表和手机上,实现了通过GEAR手表实时预览手机摄像头采集到的图像,并且远程控制手机拍摄照片的功能。
关键词: 远程控制; 蓝牙; Android; 混合加密
中图分类号: TN92?34; TM417 文献标识码: A 文章编号: 1004?373X(2016)05?0089?04
0 引 言
基于蓝牙的远程控制功能能够使智能可穿戴设备更好地与手机相互配合起来。本文实现的远程控制功能应用于搭载Android系统的三星Gear智能手表与手机之间,通过发送自定义的蓝牙数据结构,实现了对控制信息和数据信息的区分,能够识别控制信息的类型,应用于Gear手表与手机之间,通过相互连接之后,Gear手表能够实时预览手机摄像头获取的数据,并且能够控制手机进行拍照。
然而考虑到安全性问题,蓝牙数据在传送的过程中容易被窃取[1],这将对用户的隐私造成极大的威胁。因此,对蓝牙数据进行加密也是尤为重要的。通过对加密算法的分析与研究,本文采用了混合加密算法。对于智能可穿戴设备这一类运算能力不是很强的设备,加密速度尤为重要,RC4加密算法在流加密上的优势,能够满足应用的需求,然而其安全性并不是最好,通过截获的数据容易分析出加密的秘钥。因此采用RSA非对称加密算法对RC4秘钥进行再一次的加密,由于秘钥信息比较短,加密算法的复杂度对加密速度的影响比较小,采用RSA安全度高的算法来保证RC4秘钥信息不被直接读取到更加重要[2]。
1 功能模块划分
Android应用程序由四大基本组件Activity,Service 服务,Content Provider内容提供者和BroadcastReceiver 广播接收器组成。四大组件通过相互之间的配合、数据传送,实现了应用程序的功能,完成了用户与系统之间的交互,满足了用户的实际需求[3]。
基于蓝牙的远程控制功能研究是为了使搭载Android系统的智能可穿戴设备与手机之间实现远程控制的功能。本研究要求创建Android应用程序,实现智能手表远程控制手机拍摄照片的功能。深入分析了基于蓝牙的远程控制功能的主要内容,将研究的内容划分为以下3大模块[4]:
(1) 蓝牙通信模块:通过对Android系统蓝牙模块的分析,调用AndroidSDK中的接口函数,实现了设备之间通过蓝牙协议来建立数据的连接,并且实现数据传送的功能[5]。
(2) 远程控制模块:此模块通过定义的数据包头来区分发送数据的类型是数据信息还是控制信息,使得Android设备之间可以通过传送数据信息和控制信息两种信息类型,从而实现了基于蓝牙的远程控制功能。
(3) 数据加密模块:此模块实现了RC4加密算法与RSA加密算法相结合的混合加密算法,应用于基于蓝牙的远程控制功能,保护了数据传送的安全性。在3大模块的基础上,最终设计并实现了一个运行在Android系统上的应用程序。应用程序运行在GEAR手表和Android手机上,实现了手表与手机之间蓝牙连接的建立,完成了通过远程控制来拍摄照片的功能。
2 蓝牙通信模块设计与实现
2.1 蓝牙协议数据传输
完整的蓝牙协议栈根据各协议所处的位置可分三大类,分别是底层协议、中间层协议和高层协议。
蓝牙底层协议实现了传输链路的建立,用于传送蓝牙信息数据流,是蓝牙协议体系的基础。蓝牙底层协议包括蓝牙射频协议(RadioFrequencyProtocol)、链路管理协议(LinkManagerProtocol,LMP)、蓝牙基带协议(BaseBandProtocol)和主机控制器接口协议(HostControllerInterfaceProtocol,HCI)。蓝牙射频协议决定了蓝牙通信的技术特点,使蓝牙工作在免许可的2.4 GHz ISM频段。蓝牙基带协议在蓝牙协议栈中位于蓝牙射频层之上,是设备之间通过蓝牙协议通信的关键程序,定义了微微网的创建过程以及如何通过蓝牙相连接。
蓝牙中间层协议的主要功能是数据帧的分解与重组、组提取、服务质量控制等。中间层协议为上层应用程序提供服务,提供底层协议的接口。
蓝牙高层协议包括对象交换协议(ObjectExchangeProtocol,OBEX)和无线应用协议(WirelessApplicationProtocol,WAP)。对象交换协议属于会话层协议,由红外数据协会制定,主要用于红外数据链路中数据对象的交换。使得基于红外链路的应用程序能够方便地移植到蓝牙协议上。
2.2 蓝牙功能接口概述
通过调用蓝牙协议栈接口,编写应用程序,从而实现蓝牙通信功能,使得应用程序能够实现蓝牙设备的搜索、请求蓝牙配对、建立RFCOMM通道、与其他设备相连接的功能。调用AndroidSDK提供的应用编程接口,可以实现蓝牙通信的基本功能,功能主要分为以下6大类:搜索蓝牙设备;查询本地蓝牙适配器配对的蓝牙设备;建立RFCOMM通道;通过服务发现并连接到其他设备;与其他设备之间传输数据;管理多个连接[6]。
2.3 蓝牙通信模块的实现
通过对蓝牙协议栈的分析,掌握了蓝牙协议栈中各协议的主要功能,掌握了数据在蓝牙通信过程中的传送过程以及设备之间建立蓝牙连接的完整步骤。通过对Android系统SDK提供的蓝牙协议栈接口的学习,掌握了基于Android系统开发蓝牙通信模块的基本步骤和实现方法。Android系统中蓝牙通信模块的实现主要包括4大部分:本机蓝牙模块的配置、蓝牙设备的搜索、蓝牙设备连接的建立和蓝牙设备通信的实现。
2.3.1 本机蓝牙模块的配置
AndroidSDK提供了一个核心类BluetoothAdapter,通过创建BluetoothAdapter实例对象来配置本机蓝牙模块的相关属性,在程序中的实现如下:
//实例化系统 BluetoothAdapter 对象
BluetoothAdapter mAdapter = Bluetooth Adapter. get DefaultAdapter();
//直接打开系统的蓝牙设置面板
Intent intent = new Intent (BluetoothAdapter.ACTION _REQUEST_ENABLE);
startActivityForResult(intent, 0x1);
2.3.2 蓝牙设备的搜索
配置了本地的蓝牙属性,开启蓝牙功能之后,接下来调用 BluetoothAdapter. startDiscovery()实现搜索附近设备功能。
startDiscovery()方法是一个异步方法,调用后会立即返回。该方法对附近可见的蓝牙设备进行搜索,该过程会持续12 s。当该方法被调用后,搜索过程在一个 System Service中完成,当搜索到需要连接的蓝牙设备可以通过调用cancelDiscovery()方法来停止搜索。调用startDiscovery()方法后,系统开始搜索蓝牙设备,此时系统会发送以下3个广播命令:
ACTION_DISCOVERY_START表示开始搜索;ACTION_DISCOVERY_FINISHED表示搜索结束;ACTION_FOUND表示找到设备。应用程序将搜索到的蓝牙设备以列表的形式展示给用户,供用户选择。
2.3.3 蓝牙设备连接的建立
蓝牙设备连接的建立,是以服务器端与客户端的机制来实现的。两个蓝牙设备在同一个RFCOMMchannel下分别获得一个连接的BluetoothSocket,便可建立蓝牙设备的通信连接。客户端向实例化的device发出建立连接的请求,即通过createRfcommSocketTo ServiceRecord()方法来请求建立一个连接,当连接创建成功后,返回一个BluetoothSocket类型数据:
BluetoothSocket mSocket = device. createRfcommSocketTo ServiceRecord(MY_UUID_SECURE);
服务器端通过UUID创建BluetoothServerSocket来接收来自其他设备的连接请求:
BluetoothServerSocket mServerSocket=mAdapter.listen UsingWithServiceRecord(NAME_SECURE, UUIDE);
当接收到蓝牙设备的连接请求时,调用mServerSocket的accept()方法,实现服务器端BluetoothSocket的初始化。
2.3.4 蓝牙设备通信的实现
已经建立了蓝牙连接的Android设备通过调用BluetoothSocket的getInputStream()方法来获得输入流,调用getOutputStream()方法获得输出流。输入流用于接收已连接的蓝牙设备发送过来的数据,从输入流中读取数据,即可实现数据的接收。输出流用来发送数据到已连接的蓝牙设备上,向输出流写数据,即可实现数据的发送。数据的发送和接收过程如图1所示。
3 远程控制模块的研究与实现
3.1 远程控制功能研究
Android系统中,蓝牙协议栈在AndroidSDK中实现,蓝牙数据底层解析的过程是应用程序不可见的。对于两个通过蓝牙协议连接的智能设备,运行在手表端和手机端的应用程序,仅能够对输入流和输出流进行操作,向输出流写数据便能够实现数据的发送,从输入流中读数据便能够实现数据的接收。
3.2 数据结构定义
通过分析设定包头的大小为1 B,包头的数值范围为0~255,最多能够表示256种不同的数据类型,此应用程序的数据类型有两种,即数据信息和控制信息,因此可以选取0和1分别表示。其余的数值表示,可用于程序的扩展,当所要区分的数据类型增多后,可使用保留的数值来表示。对于本应用程序用数值0来表示普通数据信息,数值1表示控制信息。
确定了数据包头的数据大小,以及各数据类型的表示后,定义一个发送数据的结构,管理发送和接收的数据,定义的数据结构如下:
class SendData
{ //定义字节类型的control包头 public byte control;
//数据部分为字节数组 public byte[]; data; }
3.3 远程控制功能实现
设计的应用程序将基于Android的远程控制功能应用于手机与智能手表之间,实现手表控制手机拍摄照片。在Android应用程序中实现远程控制的功能,首先要对包头信息进行定义。根据远程控制功能的分析以及数据结构的定义可知此应用程序中发送信息分为两类,一类发送的是图像的数据信息,在Android程序中定义静态变量:
Private static final byte DATA=(byte)0;
发送图像信息时,用来对发送数据结构的包头进行赋值,标明发送的数据图像信息。另一类是拍摄照片的控制信息,在Android程序中定义静态变量:
Private static final byte TAKE_PHOTO=(byte)1;
发送拍摄照片的控制信息时,对发送数据结构的包头进行赋值,标明发送的数据为拍摄照片控制指令。
应用程序中,已经建立蓝牙连接的两个蓝牙设备,一个充当主控端,另一个充当被控端。被控端发送的数据为摄像头采集到的图像信息。
4 数据加密解密模块研究与实现
4.1 加密解密算法的选择
本功能模块采用了混合加密的加密算法,通过RC4对原始数据进行第一次加密,由于RC4加密算法相对简单,安全性上存在着一定的风险,而且在传输过程中要传输加密数据的秘钥,这将极大地威胁到通信的安全。为了把这种风险降低,采用RSA加密算法进行第二次加密,第二次加密的数据仅仅是第一次加密算法RC4的秘钥信息。整个的加密过程如图2所示。
4.2 RC4算法实现
Android应用程序编写使用的是Java语言的软件开发工具包,即JDK。JDK中提供了对于加密算法的支持,因此在本应用中可以直接调用JDK提供的RC4加密算法的接口,实现对数据的加密解密过程。首先生成秘钥程序为:
public static Key getKey()
{ Key key = null;
KeyGenerator kg = KeyGenerator.getInstance("RC4");
kg.init(128); //产生秘钥
key = kg.generateKey(); return key; }
首先通过KeyGenerator定义秘钥产生变量kg,通过getInstance方法构造出RC4加密算法的秘钥产生器。然后初始化秘钥的大小,init(intkeysize)方法中参数的数值指定了秘钥的长度。
图2 加密过程
4.3 混合加密算法实现
在程序中,通过返回字节数组的length数值得到数据信息的长度,长度信息为int类型的数值。int类型数据占用4 B空间,int转换byte类型的函数为:
public static byte[] intToBytes(int n)
{ byte[] b = new byte[4];
for(int i = 0;i < 4;i++)
{ b[i] = (byte)(n >> (24- i * 8)); } return b; }
程序中RC4与RSA混合加密过程的主要程序:
public synchronized void write(byte[] buffer)
{??
byte[] encr= RC4.encrypt(buffer,key_send);
byte[] encodedData=RSAUtils.encryptByPublic Key(key_ send, publicKey);
int sum = intToBytes(encr.length);
byte[] send=new byte[4+encodedData.length+encr.length];
System.arraycopy(sum, 0, send, 0, 4);
System.arraycopy(encodedData, 0, send, 4, 128);
System.arraycopy(encr, 0, send, 132, encr.length);
?? }
首先使用RC4加密算法来加密数据buffer,秘钥为key_send。然后使用RSA加密算法加密RC4的秘钥信息key_send。接着,计算出buffer经过RC4加密后的数据长度。将上述的三部分信息按着定义的结构依次写入欲发送的字节数组send中。最后,将字节数组send写入到通过BluetoothSocket获得的输出流中,即可实现蓝牙数据的发送。
5 蓝牙远程控制拍照实现
蓝牙远程控制的相机拍照程序是基于Android系统的蓝牙远程控制研究的一个实际应用程序。通过蓝牙通信模块的实现、远程控制功能模块的实现、混合加密算法的实现,将三部分结合起来,应用于远程控制照片的拍摄上,实现了通过GEAR手表来控制手机进行照片的拍摄。
6 结 论
通过分析国内外基于蓝牙的远程通信研究现状以及发展趋势。对比多种对称加密算法和非对称加密算法的优势和劣势,最后选择通过混合加密算法对发送的数据进行加密和解密。本文完成了蓝牙远程控制功能的研究,采用混合加密的方式对数据进行加密解密。将蓝牙远程控制功能的研究应用在拍照程序上,实现了通过智能手表远程控制手机拍摄照片的功能。
参考文献
[1] 赵姗姗,杨臻,徐奉,等.基于Android平台的高可靠远程控制系统[J].网络新媒体技术,2013(7):12?14.
[2] 李忠慧,李秀梅.Android系统的安全分析及策略[J].福建电脑,2013(1):112?113.
[3] 盖索林,王世江.Google Android开发入门指南[M].北京:人民邮电出版社,2009:43?55.
[4] 陆继翔,李映.Android应用程序的性能优化分析与研究[J].机械设计与制造工程,2013(3):82?85.
[5] 蔡罗成.Android后台监听实现机制浅析[J].信息安全与通信保密,2010(6):39?41.
[6] 浩明.基于安卓系统的手机防盗设计与实现[J].现代电子技术,2014,37(14):36?39.