EDN China > 设计实例 > 嵌入式系统 > 操作系统 > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

(多图)具有数据加密的Android蓝牙远程控制

魏菲?? 李允俊?? 金华?? 延边大学工学院?? 2015年03月24日 ?? 收藏1
随着科技的不断的发展,以及人们对于高科技产品的依赖,智能可穿戴设备逐步的发展起来,走进了人们的日常生活。智能手表、智能眼镜的问世为智能可穿戴设备的发展带来了新的方向,Android系统广泛的应用于智能可穿戴设备、智能手机中。为了使智能可穿戴设备更好的与手机相互配合,满足于人们的需求,本文研究了蓝牙远程控制功能,实现了具有远程控制功能的应用程序。由于通过蓝牙传送的数据能够被追踪窃取到,发送数据的安全性也尤为重要,通过比较本文采用RC4和RSA混合加密方式对发送的数据进行加密。为了适应不同品牌的智能手表,首先实现了在手机之间的远程控制功能。程序应用在手表上时,只需对显示界面的长宽比例根据手表的分辨率进行修改,即可满足功能性的需求。

1 蓝牙模块设计

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种不同的信息类型,在现阶段的使用过程中能够满足需求,当然如果控制类型增加,只需增加控制位的位数。定义的数据结构如下所示:

自定义蓝牙远程控制协议

本应用程序实现了手机通过蓝牙远程控制另一部手机进行图片预览以及拍照功能。因此发送信息分为两类,一类发送的是图像的数据信息,在Android程序中定义控制位为:

private static final byte DATA =(byte) 0;

另一类是拍照指令,在Android程序中定义控制位为:

private static final byte TAKE_PHOTO = (byte)1;

如果欲实现更多的控制功能,可以自定义更多的控制位类别,在程序进行相应的响应,即可实现更多的控制功能。

当Sever端收到数据以后,对于数据的头结点进行判断。通过判断控制位的类型来区分出是数据信息还是控制信息,返回给主函数对其响应。如果接收到的数据包为数据信息,则调用图像显示功能,将接收的图片显示出来。如果收到的数据的是拍照指令,即可调用拍照功能模块,将拍摄的照片进行存储。

【分页导航】


上一页123下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

远程控制? 蓝牙? Android? 加密?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈