蓝牙技术的特点
现在的物联网技术中,常见的连接通信技术,包括蓝牙、Wifi、Zigbee、GPRS等。其中,蓝牙是一种起步早,也很成熟的技术。至今为止,蓝牙技术的广泛应用,已经到了4.0版本,提供了低功耗蓝牙(Bluetooth Low Energy,BLE)方案,能够长时间(以月计)工作,比如小米手环。
技术特点
蓝牙技术的本质,是在两台硬件之间,通过无线电波,建立通讯连接;可以将蓝牙与网络传输作对比,其特点包括:
-
速度不快,距离不长。速度最高也只是在Mb级别;蓝牙4.0的传输距离,理论上可以达到100m,但实际使用过程中,超过20m就很有可能会出问题(连接丢失、信号丢失等)。
-
信号是“对话”性质的。一组蓝牙连接,包括一个“Center”(中心)和一个“Peripheral”(外部设备)。其中peripheral提供自己的连接协议,center通过连接协议中提供的方式,搜索peripheral,与之建立联系,然后与之展开“对话”。
-
信号传输是异步的。也就是说,你跟我说一句话后,就要等着我回答。因此,蓝牙开发一般也是异步的,“说”和“听”是分开的,需要代理delegate来实现。这也是蓝牙开发比较繁琐的原因之一。
-
信号不稳定、不可靠。
在开发的时候,你不一定能搜索到蓝牙设备;
搜索到了也不一定能连接上;连接上了也不一定能发送信号出去;
发送了信号过去,对方也不一定能接收到;
对方接收到了,也不一定能有回应;
对方有了回应,你也不一定能接收到回应,也不知道是0.1s后收到,还是3s后收到;
现在连接上了,可能下一刻就会断开。
基于以上原因,在做蓝牙开发的时候,要做好搜索不到、连接不上、连接断开、接收不到信号等的处理和测试。
开发流程
- 拿到蓝牙协议文档和用于开发的硬件。这个是第一步,没有这2样东西,无法开始。这些都是设备提供商一定要提供的,可以理直气壮地索要。有时候,设备提供商想保密蓝牙协议,只提供了使用接口(比如iOS的.a、.h文件、Android的jar包),只要能用,也是可以的;但这时候就无法在微信小程序、Weex等需要协议的平台上开发了。
- 根据蓝牙协议文档,在手机上开发demo,目标是:连接上硬件,与之通信,得到所有数据,并正确解析之。
步骤其实很简单,实在没有什么好说的。但是在这个过程中,潜在的坑还不少。后面会讲到。
连接流程
- 打开手机上的蓝牙,开始搜索。首先要检测手机上的蓝牙有没有打开,如果没打开,要提示用户打开蓝牙。现在蓝牙版本一般都是4.0,有的老版本手机不支持,所以还要检测一下手机是否支持BLE4.0版本。
- 搜索到周围的蓝牙设备后,根据协议文件的描述,过滤无关设备,找到目标设备。一般都是通过蓝牙设备的名称来过滤,比如类似”SinoCare…“之类的,是有规律的。
- 连接上之后,搜索Services服务;
- 搜索到Service之后,搜索Service下的Characteristic特征;2个都搜索到后,将协议文档上,用于读、写的Characteristic UUID都保存下来;用于后面的使用;Characteristics相当于一个一个的通道,有的用于写数据,有的用于读数据。
- 监听需要监听的Characteristic;开始监听之后,这个Characteristic一有数据,手机端就能够得到最新数据了。
- 向用于向设备写数据的Characteritic里,写数据。一般用于进行设置和开始动作。比如,设置硬件的时间、计量单位等;或者让硬件开始工作等。本步骤可选,根据协议说明来。有的设备是主动式的,只要一连接就立马开始源源不断地发送数据;有的则是被动式的,戳一下动一下,不戳不动。
- 确定硬件开始工作后,接收数据,并解析数据。蓝牙的数据是二进制式数据,比如“0101 1010”,每一位都有自己的含义。需要按照协议文档,将之解析出来。有的协议比较复杂,流程多,或者进行了加密,这个时候的解析就比较复杂了,是一个考验心力的活。
- 解析出来之后,就可以显示在屏幕上啦!
常见的坑
-
文档不对、不全;正在开发过程中的硬件,这个很常见,因为硬件工程师的蓝牙协议,本身还在修改当中。这个时候要时刻注意,你的协议文档和硬件实际工作方式是否一致。如果在尝试的过程中发现有疑问的地方,要立即和硬件工程师联系确认。一个全面的文档需要包括以下信息:
名称 说明 蓝牙名称规律 没有蓝牙名称,怎么知道哪些蓝牙是目标? Service ID 一个设备可能有多个service Characteristic ID及类型、说明 一个service可能有多个Characteristic ID;每一个Characteristic都有特定的用途;Characteristic主要有3种:Write(向硬件写数据)、Read(读数据)、Notify(监听数据变化),也需要搞清楚 通信流程 有一些特定硬件会需要说明通信流程;比如对于血压计硬件,可能会有以下步骤:(1)手机向血压计发送信号,开始测血压;(2)血压计开始工作,并将数据实时传输给手机;(3)血压计完成测量,并将结果发送给手机(成功/失败,以及高、低压);有了通信流程,协议会更清晰,要不然可能需要自己猜 数据解析方法 获得一连串的”01”之后,怎么从中提取我们需要的数据?这就需要解析的方法 其它 有的时候,还需要有加密方式、数据完整性验证方法等的说明 -
硬件不稳定。硬件在开发过程中,不一定很稳定,可能会出现连接经常断开、发送数据无回应、死机等情况;这时候要和硬件开发工程师保持沟通,确定是软件还是硬件的原因,并帮助硬件工程师解决。
-
安卓手机的适配。有的安卓手机不支持4.0,有的手机蓝牙不稳定,这些都是常见的。所以一般在测试的时候,都用iPhone做测试。因为不做安卓开发,所以细节不太清楚。
-
安卓手机的权限问题。6.0以后版本的安卓手机要想使用蓝牙的话,不止要添加蓝牙权限,还需要添加定位功能。是的,就是这么坑爹。
-
信号干扰。蓝牙信号之间会相互干扰,在蓝牙设备多的地方,信号复杂,就容易出现搜索不到、连接不上、连接断开的情况。有条件的话,到一个远离人烟的地方调试吧。
-
搜索的时候,搜索结果也是回调方式。所以不要定时调用
getDevices()
之类的方法,而要监听didFoundDevice:
这样的回调。 -
搜索到了需要的硬件后,要及时调用
stopDiscovery()
停止搜索,节约资源和电量。
其它
- iPhone有一个经典的用来测试蓝牙的APP,叫LightBlue,做蓝牙开发,你值得拥有。(Android应该也有,自己搜吧)
- 各个平台基本上对蓝牙都有支持,iOS,Android,微信小程序,Weex(本人写了一个支持蓝牙的项目,点这里),包括网页端!
- 有的硬件不支持安卓设备的BLE4.0接口,会提供基于Socket的蓝牙通信方式,这里就不展开讲了。