第4章 BLE协议栈架构:Controller、Host、Application分层详解

做蓝牙开发这么多年,我见过不少新手一上来就怼着API猛写,结果遇到问题就抓瞎。为什么?说白了,就是没搞懂协议栈的分层结构。今天咱们就好好聊聊BLE协议栈的三大层——Controller、Host、Application。搞懂这个,你写驱动的时候心里就有谱了。

4.1 为什么BLE要分层?

你想想看,一个蓝牙设备要完成的事情太多了:发无线信号、组数据包、加密、配对、跑应用...如果全揉在一起,那代码得多乱?

分层的好处很明显:各层只管自己的事。Controller管物理层和链路层,Host管逻辑链路和应用协议,Application管你的业务逻辑。这样哪层出问题,就查哪层,互不干扰。

核心思想:分层是为了解耦。就像你写驱动,不会把GPIO操作和蓝牙协议写在一个文件里吧?

4.2 Controller层——最底层的"硬汉"

Controller层,说白了就是跟硬件打交道的部分。它包含两个子层:

  • 物理层(PHY):负责在2.4GHz频段上收发无线信号。调制方式、跳频、发射功率,都是它的事。
  • 链路层(LL):负责数据包的组装、拆解、重传、加密。还管着设备的五种状态:待机、广播、扫描、发起、连接。

我记得有一次调试一个低功耗设备,发现广播包老是发不出去。查了半天,结果是Controller层的发射功率设置得太低,信号根本出不了屏蔽箱。嗯,这种坑踩过一次就记住了。

实战建议:调试Controller层问题时,优先看射频参数和链路层状态机。别一上来就怀疑应用层代码。

4.3 Host层——协议栈的"大脑"

Host层跑在Controller上面,通常由软件实现。它包含的协议可就多了:

协议/层 功能 我踩过的坑
L2CAP 数据包的分段重组、通道管理 MTU没协商好,数据传不全
ATT 属性协议,读写数据的基础 句柄搞错,读回来的全是0xFF
GATT 基于ATT的服务发现和特征值操作 服务UUID写反了,手机死活连不上
SM 安全管理,负责配对和加密 配对失败,原来是IO能力没配好
GAP 通用访问规范,管广播和连接 广播间隔设太短,功耗飙升

你可能会问:这么多协议,我都要学吗?其实不用。做驱动开发,你重点掌握GAP和GATT就够了。L2CAP和ATT是底层机制,SM在需要加密时才碰。

4.4 Application层——你的业务代码

Application层,就是你自己写的那些逻辑。比如:

  • 收到温度数据后,判断是否超限
  • 按键按下时,发送一个通知
  • 手机发来配置指令,更新设备参数

这一层通过GATT Profile来组织数据。Profile里包含Service(服务),Service里包含Characteristic(特征值)。每个特征值有UUID、属性和值。

举个例子:你做一个心率计,就会定义一个"心率服务"(0x180D),里面包含"心率测量"特征值(0x2A37)。手机通过读写这个特征值,就能拿到心率数据。

4.5 三层之间的通信——HCI接口

Controller和Host之间怎么通信?靠HCI(主机控制器接口)。HCI定义了命令、事件、数据三种包格式。

我曾经调试过一个项目,Host发出去的连接请求,Controller就是不响应。用逻辑分析仪抓HCI包一看,原来是命令包格式错了,少了一个字节。这种问题,不看HCI日志根本查不出来。

// HCI命令包格式示例
typedef struct {
    uint16_t opcode;    // 操作码
    uint8_t  param_len; // 参数长度
    uint8_t  params[];  // 参数数据
} hci_cmd_pkt_t;

// 发送连接请求
hci_cmd_pkt_t cmd;
cmd.opcode = 0x040D;  // LE Create Connection
cmd.param_len = 25;
// 填充参数...
hci_send(&cmd);

注意:HCI接口是调试的利器。遇到Host和Controller配合的问题,先抓HCI包看看。别在应用层瞎猜。

4.6 实际开发中的分层思维

搞懂了分层,写代码的时候就要有分层意识:

  1. Controller层问题:看射频参数、看链路层状态、看HCI事件
  2. Host层问题:看GATT服务注册、看ATT读写响应、看配对流程
  3. Application层问题:看业务逻辑、看数据解析、看状态机

我个人的习惯是,先在Host层把GATT服务搭好,用手机App验证读写正常,再往上写应用逻辑。这样分层调试,效率高得多。

避坑指南:我曾经在一个项目里,把应用层的定时器和Host层的广播间隔搞混了。结果设备广播一会儿快一会儿慢,排查了两天才发现。所以,各层的资源要分开管理,别混用。

4.7 小结

BLE协议栈的三层架构,其实不复杂:

  • Controller:管硬件,管无线信号
  • Host:管协议,管数据组织
  • Application:管业务,管用户交互

搞懂这个,你写驱动的时候就知道问题出在哪一层。不会像无头苍蝇一样乱撞。下一章,咱们聊聊GAP层的广播机制,这可是BLE设备"刷存在感"的关键。