LAT1297 蓝牙广播常见问题
1.前言
本文引用地址://www.cazqn.com/article/202311/452783.htm本文是一些解决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. 广播名显示异常
这个问题有以下几个场景:
1. 使用 iOS手机扫描设备,扫到“a”名字的设备,而当连接、断连一次该设备后,再次扫描,扫到了“b”名字的同一个设备。
2. 工程师在开发过程中发现,固件上修改了设备名但无法修改成功,用iOS手机扫描出来一直是某个固定的名字,而当用Android手机扫描时,则一切正常。
一句话解答这个问题是:iOS手机遵循完整的设备名扫描机制,并且会保留已连接设备的信息。
在谈论BLE设备的名字时,有的称之为广播名,有的称为设备名,有的称为本地名(local name),这些名字其实说的都是同一个东西,或者说同一个机制。该机制主要用于解决名字过长的问题。当名字过长时,由于广播数据包容量有限、无法承载,蓝牙核心规范采用的方法是,比如对于“STBLE_DEVELOPMENT_KIT”这个名字:
1. 在广播包中存放“STBLE_DEV”
2. 在连接成功后的device name 特征中存放“STBLE_DEVELOPMENT_KIT”
对于这个方法,iOS系统会以device name 特征中的名字为准,从而具有以下处理逻辑:
1. 通过蓝牙地址判断该设备是否连接过
2. 当设备未连接过,扫描时显示的是广播包中的名字
3. 当设备已经连接过,无论广播名如何更改,iOS系统只显示device name 特征中的名字。
安卓系统暂未发现遵循以上规范的手机。验证这个问题时,我们可以使用图6代码,将广播包的名字和device name特征中的名字设置的不一样
图6. 设备名异常
用STBLE Toolbox扫描并连接设备并断开。再次扫描时,APP和系统蓝牙的名字将不相同,见图7:
图7. APP和系统蓝牙显示名字不同
6. 小结
在开发过程中遇到和蓝牙广播相关的问题时,基于本人的经验可按下以下步骤进行逐一排查:
1. 确认系统正确发出广播,可通过LOG信息和电流波形确认;
2. 工程师在开发过程中修改蓝牙外设固件时,最好使用 Public地址类型并且每次下载固件前都改一下蓝牙地址;
3. 了解蓝牙的广播类型,有一些手机APP无法扫描Beacon类设备,建议使用STBLE Toolbox工具或者LightBlue工具对设备进行扫描;
4. 注意手机的系统蓝牙有过滤机制,本文档的第三章提及的解决方式,不能百分百逃过手机的过滤机制。当遇到有的手机无法扫描自己的BLE外设时,我们可以利用该手机系统蓝牙已扫出的设备,对其广播包进行解析,找出其被该手机识别的广播字段依据。
文档中所用到的工具及版本
• SDK : STSW-BNRGLP-DK
• APP : STBLEToolbox
版本历史
评论