先搞懂它是什么
- BLE(低功耗蓝牙):从蓝牙 4.0 开始的一套低功耗无线协议,手机、手环、传感器都在用;Ai-WB2(BL602)内置 BLE 5.0。
- 广播与连接:设备先“喊话”(广播)让别人发现自己;连接建立后,双方按 GATT 规则交换数据。
- GATT(通用属性协议):连接后“数据怎么组织、怎么读写”的规矩——服务(Service)→ 特征(Characteristic)→ 值,就像“抽屉里的抽屉里的文件”。
- 为什么必学:BLE 面试常考 GATT 层级、MTU、通知 vs 指示;做手环/遥控器/传感器项目也绕不开。
层层拆解原理
1. 角色分层:从射频到应用
SDK 的 BLE 例程启动顺序正好对应这层架构:btble_controller_init(控制器)→ hci_driver_init(HCI)→ bt_enable(启动主机协议栈 GAP/GATT)。
2. 广播与连接(GAP)
- 广播(Advertising):未连接时,从机周期性发送广播包(含设备名、厂商数据、UUID 等),主机扫描后“看见”它。
- 连接(Connection):主机发起连接,双方建立链路;连接后广播停止,按连接参数(间隔、延迟、超时)定时通信。
- 角色:广播/等待连接的是 Peripheral(从机),扫描/发起连接的是 Central(主机);手机 App 通常扮演主机。
3. GATT 数据组织:服务 → 特征 → 值
| 层级 | 说明 | 例子 |
|---|---|---|
| 服务(Service) | 一组相关特征的集合,有 UUID | 电池服务 0x180F |
| 特征(Characteristic) | 一个数据点,含值 + 属性 | 电量值 0x2A19 |
| 描述符(Descriptor) | 特征的附加说明,如 CCCD 控制通知开关 | 客户端特征配置描述符 |
SDK 从机例程(peripheral)注册了一个测试服务,里面有多个特征,覆盖读/写/无应答写/通知/指示——正好用来理解这层结构。
4. ATT:句柄、属性与 MTU
- 每个属性(服务、特征、值)都有一个 句柄(Handle),GATT 操作按句柄寻址。
- MTU(最大传输单元):一次 L2CAP 报文最多能携带多少字节(默认 23 字节,可协商到更大)。大于 MTU 的数据要分多包。
- 通知(Notify)vs 指示(Indicate):
- 通知:从机直接推数据,主机不确认,速度快、可能丢。
- 指示:主机必须回确认(ACK),可靠但慢。
- 是否开启由主机的 CCCD(客户端特征配置描述符) 决定——这就是“订阅(subscribe)”的本质。
5. 广播与连接的安全机制
- 配对/绑定(Pairing/Bonding):交换密钥、加密链路。
- 常见加密算法:AES-CCM 加密数据;安全等级影响可用性。
- 连接参数更新:双方协商连接间隔,间隔越大越省电、延迟越高。
结合 SDK 看实现
- 相关例程页:Ai-WB2 BLE 简介、BLE 从机、BLE 主机
从机例程里注册测试服务的代码展示了“定义特征 → 建服务 → 注册”的 GATT 流程:
c
/* ble_tp_svc.h:测试服务 UUID 07af27a5-9c22-11ea-9afe-02fcdc4e7412 */
ble_tp_init(); /* 注册读/写/通知/指示等特征 */
bt_le_adv_start(¶m, adv_data, n, adv_rsp, m); /* 可连接广播 */主机侧则用 bt_le_scan_start 扫描、连接后 bt_gatt_discover 发现服务/特征,再用句柄读写或订阅——和手机 App 的操作一一对应。
常见考点 / 面试题
GATT、ATT、GAP 分别是什么关系?
GAP 管“发现与连接”(广播/扫描/角色);连接后由 GATT 定义“数据怎么组织”(服务/特征),GATT 建立在 ATT 属性表之上,ATT 又跑在 L2CAP 通道上。
服务、特征、描述符有什么区别?
服务是功能集合,特征是具体数据点(值+属性),描述符描述特征(如 CCCD 控制通知/指示开关)。主机按“发现服务→发现特征→读/写/订阅”的顺序使用。
通知和指示有什么区别?
通知不要求接收方确认,速度快但可能丢包;指示要求确认,可靠但慢。选择依据是数据的重要程度。
什么是 MTU?有什么用?
MTU 是单次 L2CAP 报文最多携带的字节数(默认 23 字节)。协商更大的 MTU(如 247)可减少分包,提高大块数据传输效率。
广播和连接能同时进行吗?
通常连接建立后从机停止广播;断开后可重新广播(SDK 从机例程在断开回调里自动恢复广播)。
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

