1. 前言
本文是一些解决 BLE 广播相关问题的经验分享。对于用户常常遇到的一些问题,比如广播包最多能带多少用户数据,广播名字怎么设置,广播类型有哪些,为什么有些手机无法扫描到设备等问题,都将在本文得到解答。
2. BLE 广播最基础知识
随着 BLE 核心规范版本的更新,蓝牙广播增加了很多特性,如扩展广播,同步广播等。本文不对这些特性做展开,仅讨论传统广播的一些比较基础的知识。
传统广播包含了 4 种广播类型,这 4 种类型由两个问题推论得出,即,是否可扫描和是否可连接。四种广播类型的行为见图 1:
图1.广播类型
普通广播可扫描可连接,最多可带 62 字节用户数据,是最常见的广播类型。其缺点是空中交互的时间长,比较占信道资源,功耗也比较高。
Beacon 广播不可连接不可扫描,最多只能带 31 字节用户数据,常常用于标签类、资产追踪类设备中,优点是简单、占用信道资源少,功耗低。
直连广播用于异常断开的设备可快速恢复连接。它不能带自定义数据,只能带 6 字节的主机蓝牙地址。并且,它可以突破其它广播类型最低 20ms 的广播间隔的限制,可实现<10ms 的广播间隔。
可扫描广播主要为了解决了 Beacon 广播带数据量太小的问题。
BLE 的广播数据和响应广播数据格式如下图,是由一个接一个 AD structure 组成。
每个 AD structure = Length + AD Type + AD Data.
每个 AD type 和对应 AD Data 的详细内容可以在 Core Specification Supplement | Bluetooth® Technology Website 中查看。
详细 AD type 分配的具体数值可以在以下网址查找:Assigned Numbers (windows.net)
图2.广播数据和广播响应数据格式
3. 手机找不到设备的普通广播?
用户使用手机的系统蓝牙扫描周围设备时,系统蓝牙可以扫出一些设备,但自己的设备却没有扫描到?
先一句话概括:可能和手机的系统蓝牙的过滤机制有关。
首先应该确保设备已经正常运行(可通过 LOG 信息、电流波形等)。其次,使用手机的 BLE APP 对设备(假设是 STBLE_DEV)进行扫描,图 3 为 STBLE Toolbox 工具的扫描页面:
图3.STBLE Toolbox
当发现手机 BLE APP 可以扫描到我们的设备时,那么这个问题基本可以确定是被系统蓝牙过滤掉了。随着市面上 BLE 产品的增多,手机系统蓝牙设置一定的过滤机制是合理和必要的,这可以减少对用户的干扰以便用户可以比较快地在系统蓝牙页面找到需要连接的设备。关于手机系统蓝牙的过滤机制,目前暂未找到相关规范文档。而根据本人的应用经验,在广播设备中添加 HID 服务的 UUID 声明,在大多数手机上都能逃出过滤机制。相关代码见图 4:
图4.HID 服务 UUID 声明
再次使用系统蓝牙(iOS)进行扫描,设备出现在列表中,问题解决:
图5.iOS 系统蓝牙
关于广播字段中 ad type 列表和 UUID 申明列表的详细资料,可参阅文档:Assigned Numbers (windows.net)
4. 手机找不到设备的 Beacon 广播?
这个问题和找不到设备的普通广播的原因类似,可以先一句话概括:可能和手机系统蓝牙的过滤机制有关。解决的办法是找到一个可以扫描 Beacon 广播包的 APP,比如LightBlue 等。
5. 广播名显示异常
这个问题有以下几个场景:
- 使用 iOS 手机扫描设备,扫到“a”名字的设备,而当连接、断连一次该设备后,再次扫描,扫到了“b”名字的同一个设备。
- 工程师在开发过程中发现,固件上修改了设备名但无法修改成功,用 iOS 手机扫描出来一直是某个固定的名字,而当用 Android 手机扫描时,则一切正常。
一句话解答这个问题是:iOS 手机遵循完整的设备名扫描机制,并且会保留已连接设备的信息。
在谈论 BLE 设备的名字时,有的称之为广播名,有的称为设备名,有的称为本地名(local name),这些名字其实说的都是同一个东西,或者说同一个机制。该机制主要用于解决名字过长的问题。当名字过长时,由于广播数据包容量有限、无法承载,蓝牙核心规范采用的方法是,比如对于“STBLE_DEVELOPMENT_KIT”这个名字:
- 在广播包中存放“STBLE_DEV”
- 在连接成功后的 device name 特征中存放“STBLE_DEVELOPMENT_KIT”
对于这个方法,iOS 系统会以 device name 特征中的名字为准,从而具有以下处理逻辑:
- 通过蓝牙地址判断该设备是否连接过
- 当设备未连接过,扫描时显示的是广播包中的名字
- 当设备已经连接过,无论广播名如何更改,iOS 系统只显示 device name 特征中的名字。
安卓系统暂未发现遵循以上规范的手机。验证这个问题时,我们可以使用图 6 代码,将广播包的名字和 device name 特征中的名字设置的不一样。
图6.设备名异常
用 STBLE Toolbox 扫描并连接设备并断开。再次扫描时,APP 和系统蓝牙的名字将不相同,见图 7:
图7.APP 和系统蓝牙显示名字不同
6.小结
在开发过程中遇到和蓝牙广播相关的问题时,基于本人的经验可按下以下步骤进行逐一排查:
- 确认系统正确发出广播,可通过 LOG 信息和电流波形确认;
- 工程师在开发过程中修改蓝牙外设固件时,最好使用 Public 地址类型并且每次下载固件前都改一下蓝牙地址;
- 了解蓝牙的广播类型,有一些手机 APP 无法扫描 Beacon 类设备,建议使用STBLE Toolbox 工具或者 LightBlue 工具对设备进行扫描;
- 注意手机的系统蓝牙有过滤机制,本文档的第三章提及的解决方式,不能百分百逃过手机的过滤机制。当遇到有的手机无法扫描自己的 BLE 外设时,我们可以利用该手机系统蓝牙已扫出的设备,对其广播包进行解析,找出其被该手机识别的广播字段依据。
文档中所用到的工具及版本
• SDK :
STSW-BNRGLP-DK
• APP :
STBLEToolbox
本文档参考ST官方的《【应用笔记】LAT1297+蓝牙广播常见问题》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89028125