基于Android平台的智能蓝牙防丢器的设计
2018-10-10陈菁李昱钊
陈菁 李昱钊
摘要:本设计利用现在已普及的智能手机为载体,设计了一款基于Android平台和低功耗蓝牙技术的智能防丢器。防丢器由两部分组成,一部分是与物件绑定在一起的从机,一部分是用户所持有的主机。当从机和主机建立蓝牙连接以后,防丢系统便正式开始运行。从机部分采用支持蓝牙4.0BLE的CC2540芯片,主机部分是常见的Android手机。在安卓系统上完成对检测软件的编程。该软件能够通过手机与蓝牙芯片之间的信号强度值来进行报警。文章阐述了Android蓝牙连接的一些细节并对判断逻辑的实现做出解释。
关键词:低功耗蓝牙;防丢器;Android系统
中图分类号:TN925 文献标识码:A 文章编号:1007-9416(2018)07-0195-02
随着科技的进步以及各种新鲜事物的冲击,个人在单位时间内处理的任务和信息量相较于过去有显著的提高。在高强度的生活中,遗忘现象十分普遍。如何寻找遗忘的物件也成为人们生活中的一个难题,比如随手一放的钥匙,钱币,饰品,还有信用卡,个人证件,耳机等等物品。设计一款专门针对细小物件的防丢器非常实用,防丢器可以通过与细小物件绑定在一起,当物主和物件分离时提供报警,寻回等功能。本设计利用现在已普及的智能手机为载体,设计了一款基于Android平台和低功耗蓝牙技术的智能防丢器。
1 防丢器的功能实现
蓝牙防丢器由两部分组成。一部分为与物件捆绑在一起蓝牙设备从机,一部分为用户随身携带的蓝牙设备主机。用户与其防丢物件之间往往需要维持较近的距离,所以利用蓝牙短距离无线通信这一特点使设计非常便利。首先,从机和主机之间要建立了蓝牙配对连接,用户通过主机搜索到正在广播的从机,在主机的配对表里选择从机完成连接。当从机与主机建立连接后,主机周期性地得到一个主从机之间的信号强度值。当该信号强度值小于预设的信号强度阈值时,主机启动报警,提醒用户物件即将遗失。
当安卓手机检测到信号强度过弱并报警时,便通过GPS记录下此时的位置信息。若施主没有听到报警声,便可以根据这个位置记录找到失物的大致位置,并实现寻回。此位置信息还可以和一些地图软件的API相结合,在地图上更加直观地显示出失物的位置。
2 低功耗蓝牙从机设计
本设计的从机由CC2540蓝牙芯片组成,实现简单的蓝牙广播功能。随着智能手机的普及,市面上的大部分安卓手机都支持蓝牙,但不是所有的安卓手机都能支持基于蓝牙4.0的低功耗蓝牙。所以主机选用搭载支持低功耗蓝牙协议4.0的安卓手机(安卓4.3.1及以上)。每当蓝牙芯片向手机发送一个数据包,便会提供手机一个信号强度的估计值。本设计的主要过程便基于此实现[1-3]。
2.1 CC2540软件设计
CC2540蓝牙芯片的软件由OSAL操作系统抽象层和硬件抽象层HAL组成,OSAL操作系统抽象层是蓝牙4.0BLE协议栈内加入的一个小的操作系统。BLE协议栈、profile以及所有应用程序都是建立在OSAL的基础上。硬件抽象层HAL位于操作系统内核与硬件电路之间的接口。隐藏了硬件的具体细节,方便软件在各平台上的移植并使得软硬件测试功能成为可能[4]。
2.1.1 低功耗蓝牙协议栈的运行流程简析
在整个程序的main()函数中包含了整个程序的入口,低功耗蓝牙协议栈的运行流程大致如下:(1)初始化硬件。(2)初始化I/O板。(3)初始化HAL驱动。(4)初始化NV系统。(5)初始化操作系统。(6)使能中断。(7)最后初始化电路板。(8)运行OSAL操作系统。当系统初始化后即进入低功耗模式,若没有任务,则持续处于低功耗模式。若有任务加入,则唤醒系统,离开低功耗模式,任务处理完成后,回到低功耗模式。
2.1.2 低功耗蓝牙实现低功耗的主要方法
连接间隙:低功耗蓝牙设备使用跳频机制实现连接,即设备发送数据选用的信道是随时间变化而变化的。设备之间可以通过链路层的数据交换来维持连接,而不用通过数据的接受和发送。从一次信道切换后收发数据到下一次信道切换收发数据之间的时间间隔叫连接间隔。通过设置较大的连接间隔可以明显地节省功耗,而数据发送速度更慢。
从机延迟:当没有数据数据可发送时,从机便可以选择跳过连接间隙,直到有数据发送,跳过间隙的数量有一定的限制,但通过跳过有限的连接间隙便可以极大地减小功耗的消耗。
2.2 低功耗蓝牙防丢器从机的关键实现
(1)设备的配置以及蓝牙协议栈的初始化:选用CC2540模块主要是作为与随身物件绑定的跟踪器,故芯片模块的状态设为从机。初始化配置文件GAP为外部设备模式,设置从机为上电即广播。
(2)设置GAP参数的部分代码,设置GAP特性,信号强度值的更新速度,以及广播间隙的部分代码。
(3)根据Rssi信号强度值计算两设备之间的距离。根据大量的调查,发现只在有限范围内,两设备之间的距离才和信号强度值成不太标准的线性关系。计算距离的算法精确度并不高,而且距离比起信号强度值参考价值较低。所以经过计算得出的两设备之间的距离值只具有参考意义,并不运用于实际的报警判断。
(4)将获得的Rssi信号强度值经过处理后发送到主机(安卓手机设备),Rssi为信号强度值,是藍牙防丢器的主要参考数据。
3 安卓手机端设计——应用程序的实现
因为要用到只有Android 4.3以上版本才有的API,所以本设计软件选用Android4.3.1系统开发。而搭载Android4.3.1的设备可以是智能手机,智能手表,智能电视等。智能手机相对其他安卓设备而言更加普及、更加方便携带,本软件设计主要针对手机进行适配[5-7]。
3.1 手机软件界面
手机软件界面分为两部分:第一部分是主要是蓝牙设备的扫描,和连接的建立。我们把它叫做设备扫面界面。在此页面中,软件扫描外部可连接的蓝牙设备,建立一个可连接设备的设备目录,在其中显示每一个可连接设备的设备名,UUID地址,Rssi信号强度值和估算的距离值。界面中的显示设备的滚动目录通过定义ViewHolder类来辅助实现。目录通过getView方法来获取将要显示的项,而在getView方法中,主要通过findViewById方法来查找,findViewById是一个基于树的查找方法,对时间的消耗非常大,而且要从XML布局文件中生成View对象。所以当需要列出的项变得很多时,软件的运行速度将会大大降低。ViewHolder主要针对可以滚动显示的目录,通过优化当目录项滚动到屏幕外时的所进行的操作来大大降低系统消耗。
手机界面设计的第二部分:手机和蓝牙芯片建立连接后显示信号强度值,连接状态等信息:在上面的可连接设备目录中选择一个设备后,就进入正式的监测。该界面中主要显示的是一些监测得到的数据信息。该部分主要由一个可以滚动的ScrollView组成。在这个ScrollView中滚动显示一些实时检测到的数据。
3.2 Android手机中的Service和Activity
Activity包括用户正在访问的GUI和创建GUI时需要运行的程序,而GUI和这些程序是相互阻塞的。当一个Activity中运行的代码时间复杂度太大时,这段代码就会因为长期阻塞GUI而使界面崩溃。所以需要长时间运行的程序必须放入每个Activity所对应的Service当中。Service是独立于Activity运行的,两者可以相互通信。而蓝牙建立连接后不断传输数据的过程是一个长时间的过程。所以必须建立一个为蓝牙传输数据服务的Service。
3.3 手机端和设备蓝牙连接的建立[8-9]
BLE蓝牙通过GATT建立连接。建立连接后便开始数据的传输,蓝牙在后台传输得到的数据,通过传递消息控制Activity的实时更新。软件流程设计如下:(1)初始化蓝牙适配器;(2)打开蓝牙:在BlueToothClass类中,定义了一些回调函数,这些回调函数返回了手机和蓝牙设备之间的通信结果;(3)连接状态改变的回调,通过此回调可以得知设备是否连接:(4)发现服务的回调;(5)读操作的回调;(6)数据返回的回调:在BlueToothCalss类中连接状态回调函数onConnectionStateChange中打开TimerTask线程,周期性地读取Rssi信号强度值。蓝牙防丢器的从机会不断向主机发送Rssi的值,作为主机的手机通过Android的readRemoteRssi方法来实现对Rssi值的读取:(7)通过回调函数onReadRemoteRssi决定当收到Rssi值的时候该做什么工作;(8)在安卓中Intent对象负责完成在Activity和Service之间以及Activity之间的消息传递,该函数通过Intent将蓝牙进程得到的Rssi信息传给主进程Activity进行处理。
3.4 手机端报警的实现
接受蓝牙线程传输过来的Rssi值,当Rssi值大于允许范围时,手机便将此状态视作危险状态,开始报警。但这种方法存在很大的误差:第一,从机对Rssi值的估计存在一定的误差,很可能由于天气,温度等因素而发生较大的差异。第二,如果物品携带者正在移动,那么在手机和防丢物品之间就很有可能出现障碍物。障碍物将干擾设备报送的信号强度值,从而对判断产生影响。为了减少由上述原因造成的误差,当收到设备传送过来的Rssi值时我们并不立即对其做出判断。而是将每次收到的Rssi值存到一个缓存数组里面。当缓存数组存满十个值后。对这十个值取一个平均数,把这个平均值作为判断的主要依据。经过测试这样将极大地减少误差,使判断更加准确。当平均值超过指定的值时,打开音乐报警线程,当平均值在允许的范围内时,关闭报警线程。
4 防丢器的测试
CC2540芯片的程序编写在IAR Embedded Workbench中进行。这是一款由IAR公司提供的一款C语言编译器,支持众多的微处理器同时也支持CC2540低功耗蓝牙芯片,而手机端程序的编写与调试则是在eclipse平台上进行。eclipse是一款基于java的开源开发环境,通过安装Android系统的支持插件,结合Android SDK就可以开发安卓程序。
测试过程以及结果:将CC2540芯片通过配套仿真器烧录好程序,通上电以后与细小物件绑定在一起。智能手机用数据线与电脑连接,在eclipse上将调试好的程序下载到手机上进行安装。一切准备就绪后开始测试防丢器。通过手机在打开蓝牙的情况下打开软件,软件中出现滚动列表,显示搜索到的正在广播的蓝牙设备。选择我们的CC2540蓝牙芯片建立连接。几秒后,连接建立成功,手机进入监测报警模式。进入报警模式后,CC2540不断发送Rssi值到手机上。同时,手机屏幕上也滚动显示每一次收到的Rssi值以及根据Rssi值计算出来的距离值。移动手机,当手机在安全范围内时,不报警。将手机移动至远处,发现当手机与物件之间的距离过远时,手机开始报警。
5 结语
随着蓝牙4.0的发布,低功耗蓝牙便成为短距离无线通信的首要之选。低功耗蓝牙可以提高续航时间,而随身物品恰好也需要长时间和主人在一起,选用蓝牙技术提供的支持极大地方便了防丢器的设计。防丢器设计的关键问题是如何防丢,怎么判断物件是否处于遗失状态。我们选用手机与设备之间的信号强度值来判断,因为信号强度值随距离的增大而减弱,当物主与其物件之间的距离较远时,可以看作物主已经遗失了该物件,实验证明,通过这样一种信号弱则报警的简单判断是可以应对大多数的情况的,设计具有良好的实用性。
参考文献
[1]包健.基于安卓系统的智能蓝牙音箱设计研究[D].昆明理工大学,2013.
[2]霍丙乾.基于蓝牙4.0的防丢系统的研究与设计[D].北京邮电大学,2015.
[3]王磊,基于蓝牙4.0的防丢系统的研究与设计[D].太原理工大学,2013.
[4]叶冬,谢东力.无线防丢器设计[J].科技创新与应用,2017,(8):52.
[5]颜俊杰.基于WIFI的室内定位技术研究[D].华南理工大学,2013.
[6]罗玮.一种新兴的蓝牙技术—超低功耗蓝牙技术[J].现在电信科技,2010,(10):31-34.
[7]欧阳骏,陈子龙,黄宁淋.蓝牙4.0BLE开发完全手册—物联网开发技术实战[M].化学工业出版社,2016.
[8]李晓.基于Android平台的手持终端应用功能开发与设计[D].湖北大学,2010.
[9]王长青.Android智能穿戴设备开发指南[M].人民邮电出版社.