在 BLE(低功耗蓝牙)开发中,“手机扫描不到设备”“广播名显示异常” 是高频痛点。本文基于 ST 官方 LAT1297 应用笔记,从广播基础认知、核心问题拆解到实操解决方案,系统梳理传统 BLE 广播的开发要点,助力工程师快速避坑、高效落地。
1. BLE 广播基础知识:类型与数据格式
1.1 4 种传统广播类型(核心特性对比)
传统 BLE 广播按 “是否可扫描”“是否可连接” 分为 4 类,适配不同应用场景:
| 广播类型 | 关键特性 | 最大用户数据量 | 适用场景 |
|---|---|---|---|
| 普通广播(ADV_IND) | 可扫描、可连接 | 62 字节(广播包 31 + 响应包 31) | 多数蓝牙设备(如智能硬件、穿戴设备) |
| Beacon 广播(ADV_NONCONN_IND) | 不可扫描、不可连接 | 31 字节 | 信标、资产追踪标签(低功耗优先) |
| 直连广播(ADV_DIRECT_IND) | 不可扫描、可快速连接 | 6 字节(仅主机蓝牙地址) | 异常断开后快速重连 |
| 可扫描广播(ADV_SCAN_IND) | 可扫描、不可连接 | 31 字节 | 需多带数据的不可连接场景(补充 Beacon 数据量不足) |
1.2 广播数据格式
广播包与响应包均由多个
AD Structure组成,单个结构格式为:Length(1 字节) + AD Type(1 字节) + AD Data(Length 字节)
- Length:后续 AD Type+AD Data 的总字节数;
- AD Type:定义数据类型(如设备名、服务 UUID 等),详细类型可参考蓝牙官方 “Assigned Numbers” 文档;
- AD Data:实际业务数据(如广播名、UUID 列表等)。
2. 核心问题解析:现象→根源→解决方案
问题 1:手机系统蓝牙扫不到普通广播
现象
手机系统蓝牙能扫描到其他 BLE 设备,却找不到自己开发的普通广播设备;但用 BLE 专用 APP(如 STBLE Toolbox)可正常扫描到。
根源
手机系统蓝牙存在过滤机制—— 为减少用户干扰,会过滤掉 “无明确服务标识” 的广播设备,仅显示常见用途(如耳机、外设)的设备。
解决方案:添加 HID 服务 UUID 声明
在广播包中添加 HID(人机交互设备)服务 UUID(0x1812),多数手机会识别为 “常用外设”,避免被过滤。核心代码示例:
uint8_t Sensor_DeviceInit() {
uint8_t ret;
uint16_t service_handle;
uint8_t device_name[] = {'S', 'T', 'B', 'L', 'E', '_', 'D', 'E', 'V'};
// 添加HID服务UUID(0x1812)到广播包,突破系统过滤
uint8_t adv_data[] = {
2, AD_TYPE_FLAGS, FLAG_BIT_LE_GENERAL_DISCOVERABLE,
2, AD_TYPE_16BIT_SERV_UUID_COMPLETE_LIST, 0x12, 0x18 // HID服务UUID
};
// 设置发射功率、初始化GATT/GAP等(省略其他常规配置)
aci_hal_set_tx_power_level(0, 24);
ret = aci_gatt_srv_init();
return ret;
}
问题 2:手机扫不到 Beacon 广播
现象
Beacon 广播设备正常发射信号,但手机系统蓝牙或普通 BLE APP 无法扫描到。
根源
Beacon 广播的 “不可连接、不可扫描” 特性,导致部分手机系统蓝牙和普通 APP 不支持扫描此类广播包,仅适配专用扫描工具。
解决方案:使用 Beacon 专用扫描 APP
无需修改设备固件,仅需更换扫描工具:
- 推荐工具:LightBlue、STBLE Toolbox(支持扫描所有广播类型);
- 验证逻辑:用专用 APP 扫描,若能识别设备,则确认是工具兼容性问题,无需修改硬件 / 软件。
问题 3:iOS 手机广播名显示异常
现象
- iOS 手机首次扫描显示广播包中的名字(如 “STBLE_DEV”),连接断开后再次扫描,显示固定名字(如旧名字 “TEST”),即使固件修改了广播名也无效;
- Android 手机扫描显示正常,仅 iOS 出现异常。
根源
iOS 遵循 BLE 核心规范的 “设备名优先级机制”,逻辑如下:
- 未连接过:显示广播包中的 “本地名(Local Name)”;
- 已连接过:优先显示 GATT 层 “device name 特征” 中的名字,且会缓存该名字,忽略后续广播名修改。
解决方案:保持广播名与 device name 一致性
- 确保广播包中的本地名与 GATT 层 device name 特征的名字完全一致;
- 开发阶段若需修改名字,建议同时更新广播包和 device name 的配置,核心代码示例:
uint8_t device_name[] = {'S', 'T', 'B', 'L', 'E', '_', 'D', 'E', 'V'}; // 统一名字
// 1. 设置广播包中的本地名
uint8_t adv_data[] = {
sizeof(device_name) + 1, AD_TYPE_SHORTENED_LOCAL_NAME, // 短本地名类型
device_name[0], device_name[1], ..., device_name[8] // 填充统一名字
};
// 2. 设置GATT层device name特征
Gap_Profile_Set_Dev_Name(0, sizeof(device_name), device_name);
- 测试阶段:iOS 手机需忘记设备后重新扫描,或修改设备蓝牙地址(避免缓存影响)。
3. 通用排查步骤:快速定位广播问题
遇到 BLE 广播相关问题时,可按以下步骤逐一验证,高效定位根源:
- 确认设备正常广播:通过串口 LOG、电流波形判断设备是否已启动广播(广播时电流会有周期性波动);
- 更换扫描工具:用 STBLE Toolbox、LightBlue 等专用 APP 扫描,排除手机系统过滤或工具兼容性问题;
- 检查广播类型适配:Beacon 广播需用专用 APP,普通广播需确认是否可扫描、可连接;
- 规范设备地址:开发阶段使用 Public 地址类型,每次下载固件后修改蓝牙地址,避免手机缓存干扰;
- 解析参考设备广播包:若某款手机扫不到目标设备,可解析该手机能识别的其他 BLE 设备广播包,参考其 AD Type 配置(如添加常用服务 UUID)。
BLE 广播开发的核心痛点集中在 “手机兼容性” 和 “规范配置”:
- 扫描不到设备:多为手机系统过滤或广播类型与工具不匹配,优先添加常用服务 UUID(如 HID)或更换专用 APP;
- 广播名异常:iOS 缓存机制导致,关键是保持广播名与 device name 特征一致;
- 排查关键:先确认设备正常广播,再按 “工具→配置→兼容性” 逐步验证。
该方案适用于信标、智能穿戴、工业传感器等各类传统 BLE 广播场景,无需复杂修改,即可快速解决高频问题。
阅读全文
769