万燕 李丽丽
摘 要:高科技电子行业的发展,引领了可穿戴设备的风潮,人们越发追求于其低功耗和稳定性。文章实现了一个基于Android和BLE的蓝牙通信系统,除了能通过蓝牙连接Android手机进行通信以及强大的低耗能优势以外,还对BLE连接流程进行了优化,提高了硬件和软件之间的蓝牙通信性能。
关键词:BLE;Android;蓝牙通信
中图分类号:TN925 文献标志码:A 文章编号:2095-2945(2018)16-0015-03
Abstract: The development of high-tech electronic industry leads the trend of wearable devices, and people increasingly pursue its low power consumption and stability. In this paper, a Bluetooth communication system based on Android and BLE is implemented. In addition to being able to communicate with Android mobile phone through Bluetooth and powerful low energy consumption advantage, the flow of BLE connection is optimized, improving Bluetooth communication performance between hardware and software.
Keywords: BLE; Android; Bluetooth communication
引言
自从“可穿戴设备”这个名词进入人们的视线,越来越多的消费者愿意去尝试这项新技术,在巨大利益的推动下,对可穿戴设备的研究也如火如荼地展开。目前可穿戴设备的技术还不够成熟,功能强大的设备无法独立使用,很多功能需要配合手机软件才能够完成,因此设备与App之间的通信成为人们重点关注的对象。目前,大多數的可穿戴设备和App的通信都是使用蓝牙作为数据传输方式,而Android系统亦是目前手机最流行的操作系统,故本文开发了一个基于Android的蓝牙通信系统。
蓝牙分为低功耗蓝牙和经典蓝牙,低功耗蓝牙,即BLE,对应的是蓝牙4.0及以上版本。经典蓝牙又分为传统蓝牙和高速蓝牙,高速蓝牙指的是3.0版本,蓝牙3.0以下版本属于传统蓝牙[1]。低功耗蓝牙与经典蓝牙相比,它的通信距离从10米扩展到100米,发送数据所需的时间也从100ms降至3ms,相应延时也从100ms降至6ms。虽然数据传输速率还无法与高速蓝牙相比,但在耗能方面,极大体现了低功耗蓝牙的价值,能够以极低的运行和待机功耗使一粒纽扣电池连续工作数年之久,此外,它还有低成本和跨厂商的互操作性[2],所以低功耗蓝牙将是可穿戴设备更好的选择。数据同步成功率是设备与App之间蓝牙通信性能的一大体现,很多网络上的Android App与各种设备的数据同步成功率不到80%,如何提高设备和App之间的蓝牙通信性能,也是BLE应用开发者关注的重点。
BLE在待机功耗和运行功耗上的特点符合当今可穿戴设备的发展需求,在未来一段时间,它将占据可穿戴设备通信的主流市场。本系统基于Android 4.3以上版本,利用Android SDK提供的BLE相关API进行蓝牙通信系统的开发,此系统能够适配任意基于BLE的可穿戴设备,为可穿戴设备提供一种更经济的蓝牙通信方案。在低耗能的基础上,对目前BLE相关应用数据同步成功率低的因素进行分析,优化BLE的连接流程,将App与设备的数据同步成功率提升至90%以上,提高蓝牙通信性能。
1 系统设计
1.1 设计方案
本文所实现的是基于Android和BLE的蓝牙通信系统,开发工具采用Android studio。BLE的通信功能主要利用了Android SDK中关于BLE的API,这些接口只存在于API 18及以上版本,限制了装载本系统的手机设备操作系统至少为Android 4.3版本[3]。由于Android操作系统的内核是基于Linux系统的,且主要使用Java作为开发语言[4],所以本系统采用Java语言进行各项功能的开发,用以控制系统的逻辑部分,界面部分使用XML文件进行布局,界面与逻辑分开的开发方式有助于各个部分的维护。
1.2 系统设计
蓝牙通信系统主要有四大功能,分别是设备搜索、设备连接、收发数据、保存数据。设备的搜索、连接以及收发数据功能主要依赖于系统蓝牙部分的开发,保存数据功能主要依靠存储设备的文件读写,后者的开发目的是用于测试蓝牙通信系统数据传输的正确性。
系统主要功能如图1所示。
2 系统实现与优化
2.1 系统实现
蓝牙传输系统最关键的部分,就是实现BLE通信功能。BLE通信和传统蓝牙通信的实现原理相同,即一个蓝牙主设备通过使用蓝牙芯片使设备能够在近距离内发送接收无线电信号,来找到另一个蓝牙从设备[5]。但在开发方式上,两者却存在很大不同。在传统蓝牙中,手机和BLE设备分别对应两种角色,一个是客户端,一个是服务器端。当客户端搜索并匹配到服务器端以后通过UUID建立Socket,之后才能进行网络通信。而UUID这个值,在传统蓝牙中是唯一的,且服务器端和客户端必须保持一致。在BLE中,手机和BLE设备分别对应为中心设备和外围设备[6]。开发BLE应用主要使用了GATT,GATT指的是蓝牙4.0最上层的应用框架,它提供了蓝牙设备间交互的各种接口,所有BLE应用都是基于GATT实现的。每个BLE设备都有多个Service,每个Service含有多个Characteris,每个Characteris拥有一个value和多个descriptor,而中心设备和外围设备的通信就是依靠Characteris进行的。不管是Service、Characteris还是descriptor,都拥有各自唯一的UUID。
开发时,若想要系统能够使用蓝牙的功能,首先需要在配置文件中声明蓝牙的权限,允许程序发现和配对蓝牙设备以及允许程序连接到已配对的蓝牙设备。蓝牙的开启方式有两种:一是发送蓝牙开启的请求,由用户自己选择是否打开;二是代码后台自动打开蓝牙。本系统采用的是前者,先获取本地蓝牙适配器,判断手机蓝牙是否已开启,若未开启则进行询问,当用户选择确定时,再从后台去启动蓝牙。
蓝牙成功开启后就可以搜索设备了,外围设备启动后会不断发送广播消息,中心设备使用注册的广播接收器捕捉外围设备发送的这些广播消息,然后广播接收器会将设备地址回调给中心设备。值得注意的是,需要给搜索设备这个行为设定一个终止条件,比如限定搜索时间或者搜索到设备的数量,否则搜索将不会停止,占用系统大量的资源,增加系统耗能。之后可以定义一个设备适配器的类,用于存储搜索到的蓝牙设备,并将之展现在界面上,供用户进行选择。当用户选定一个设备后,进行设备的配对和连接。BLE API中提供了连接设备的方法,可以直接进行调用。
当连接到BLE设备后,调用发现Service的函数,通过SERVICE_UUID获取目标Service。如果Service不为空,再通过CHARACTERISTIC_UUID获取Characteris,使用Characteris与BLE设备进行通信。如果BLE设备的Service和Characteris的UUID值未知,可以先获取设备所有的Service,然后再一个个尝试,获取最终需要的Service,同理,可获得最终需要的Characteris。在BLE通信中,接收数据的模式分为两种,一种是主动读取数据,一种是使用通知的方式。主动读取数据由中心设备控制读取数据的时机;而使用通知的方式,读取数据的时机则是由外围设备掌控,即只有当Characteris中数据有所变化,中心设备才会去读取新数据。若中心设备需要发送数据,则应先把数据写入Characteris,然后再将其传输给外围设备。
数据保存功能使用了File类和FileWriter类,这些是Java本身提供的类,用于文件和数据的读写。因为Characteris中数据格式是byte数组,当系统接收到新数据之后,需要先对数据进行转换,然后在系统的根目录下获取指定文本文件。若文件不存在,则创建文件并写入数据;若文件存在,则将新数据添加到文件末尾,以便查看数据接收记录。
蓝牙通信系统的工作流程图如下图2所示。
图2 系统工作流程图
2.2 BLE连接流程优化
相比于IOS手机App和其他设备的同步成功率,Android App与其他设备的同步成功率偏低,经过对数据同步失败情况的代码跟踪,发现大部分同步失败的原因是蓝牙连接失败。也就是说,很多情况下的数据同步失败,是因为蓝牙连接断开而重连失败导致的。在分析了Android BLE的API实现代码以后,发现开发BLE应用的时候,针对不同设备类型,开发者应该对重连函数的逻辑考虑得更全面才能提升数据同步成功率。
按照Android BLE的接口文档说明来看,在获取设备以后调用连接方法会返回一个BluetoothGatt,之后这个连接上的所有操作都在这个BluetoothGatt上执行,包括连接状态的变化、关闭连接、读写数据等等。官方给的重连函数例子是在连接失败以后直接继续调用连接函数去重新连接,但是实际上,这样的重连函数很少会起到应有的效果。BluetoothGatt在有异常发生以后,有很大可能性会关闭一端的连接,如果此时启用旧的BluetoothGatt就会导致连接失败,最优的方式是使用一个全新的BluetoothGatt。但是,什么时候重启一个新的BluetoothGatt,连接失败以后重启多少次合适,这就需要根据不同设备的不同需求来分析了。
在代码上,连接失败分两种,一种是返回超时,一种是返回错误结果。考虑到连接延时的情况,关闭旧连接和建立新连接之间也需要增加一个合适的时间间隔。所以,可以为重连函数设置四个参数,分别是总的运行时间、重试次数、单次超时时限以及重建连接间隔。代码流程如图3所示,在总的运行时间中返回错误结果或者等待结果超时,则等待连接延时之后重启一个BluetoothGatt进行连接。
3 系统测试
为了验证蓝牙通信系统是否达到预期目标,需进行系统测试。测试分为两部分,一是功能测试,二是性能测试。
3.1 功能测试
启动多个BLE设备,将APK文件传送至Android手机,安装完成之后打开软件。开启蓝牙以后搜索可用设备,所有BLE设备均被搜索到,故设备搜索功能可用;选定不同BLE设备进行配对连接,均连接成功, 故设备连接功能可用;由多个BLE设备连续发送二十组不同大小的数据块,范围从1字节到100字节,发送完毕后打开手机根据目录下的指定文本文件进行验证,得出以下结论:数据块大小在20字节以内的数据传输丢包率为零,数据准确无误;数据块大小在20字节以上的数据,数据块中大于20字节以后的数据全部丢失,20字节以内的数据准确无误。通过翻阅API文档,可知这是由于GATT做出的限制,故收发数据功能和数据保存功能可用。
3.2 性能测试
控制BLE设备不间断发送数据,携带装载蓝牙通信系统的手机远离BLE设备走动。经测试,在距离数据源10米半径范围内行走不影响数据的接收,蓝牙信号可穿透墙壁木门等障碍物而不丢包,可知此蓝牙通信系統有效通信距离长、连接稳定性强。在等量数据传输下,此蓝牙通信系统相较于基于经典蓝牙的通信系统耗能大大降低,前者只消耗了后者不到一半的电量,可知此蓝牙通信系统低耗能优势显著。在进行BLE连接流程优化之前,官方的重连函数成功率不到10%,使用优化后的重连函数,成功率提升至90%以上,从而间接提升了数据同步成功率,提高了系统的蓝牙通信性能。
4 结束语
本文实现了一个基于Android平台与BLE的蓝牙通信系统,能够连接手机和BLE设备进行通信,对BLE的连接流程进行了优化,提高了蓝牙通信性能。经测试,该系统可用于连接任意BLE设备,在10米范围内通过蓝牙收发数据无丢包情况,比传统蓝牙通信更省电,数据同步成功率更高,为可穿戴设备提供一种更可靠、更稳定、更经济的蓝牙通信方案。
参考文献:
[1]Shaikh Shahriar Hassan,Soumik Das Bibon,Md Shohrab Hossain,Mohammed Atiquzzaman. Security threats in Bluetooth technology[J]. Computers & Security,2017.
[2]陈冬云.浅谈蓝牙4.0“助力”物联网的发展[J].教师,2014(17):126.
[3]欧阳骏,陈子龙,黄宁淋.蓝牙4.0BLE 开发完全手册:物联网开发技术实战[M].北京:化学工业出版社,2013.
[4] 欧阳零.Android 核心技术与实例详解(第2版)[M].北京:电子工业出版社,2013.
[5]罗富财. 基于Android平台的蓝牙通信系统的研究与实现[D].华北电力大学,2013.
[6]熊小军,万辉勇,陈泓屹.基于Android的低功耗蓝牙通讯研究与实现[J].科技广场,2015(07):122-127.
[7]熊狮,吴效明.基于Android系统的生理数据蓝牙传输技术[J].中国医学物理学杂志,2012,29(06):3801-3803.