HCI 功能规范【5.1. Correctness】
这部分内容属于HCI data formats章节中的Correctness主要讲的是在 HCI 层中Controller 返回给 Host 的参数值必须是“正确的”也就是说Controller 上报的事件参数、返回参数必须真实、准确地反映当前发生的事情。一、原文含义原文大意是Controller 应当设置返回参数和事件参数的值使这些参数能够正确表示正在报告的数据或情况。例如在HCI_Connection_Completeevent 中Link_Type参数的值必须正确表示当前被报告的连接类型。二、这部分想表达的核心知识这部分不是在讲某一个具体 HCI Command 或 Event 的格式而是在讲HCI 数据格式的基本原则HCI Event 或 Command Complete 返回的数据不能随便填必须与实际情况一致。Host 依赖这些参数判断 Controller 当前的状态、连接类型、操作结果等。如果 Controller 返回的参数不准确Host 后续的协议栈行为就可能出错。三、关键信息 1Controller 负责填写 return parameters 和 event parametersHCI 中有两类常见的数据返回方式1. return parameters也就是命令返回参数。比如 Host 发送某个 HCI Command 给 ControllerController 通过Command Complete Event返回执行结果和相关参数。例如Host - Controller: HCI_Read_BD_ADDR command Controller - Host: Command Complete Event Return Parameters: - Status - BD_ADDR这里的BD_ADDR就必须是真实的本机蓝牙地址不能乱填。2. event parameters也就是事件参数。Controller 在某些事情发生时会主动通过 HCI Event 通知 Host。例如Controller - Host: HCI_Connection_Complete event Event Parameters: - Status - Connection_Handle - BD_ADDR - Link_Type - Encryption_Enabled这些参数描述的是“当前发生了一个连接完成事件”所以里面的每个字段都必须正确反映这个连接的真实情况。四、关键信息 2参数值必须正确表示被报告的数据或情况这句话的重点是HCI 参数不是单纯的字节字段而是 Host 判断协议状态的依据。例如 Controller 上报连接完成事件时Host 会根据事件参数判断连接是否成功 连接句柄是多少 对端设备地址是多少 这是 ACL 连接、SCO 连接还是 eSCO 连接 当前是否启用了加密如果 Controller 上报的参数错误Host 的状态机就会被带偏。比如连接本来是 ACL 连接但Link_Type错误填成 SCO那么 Host 就可能按照语音链路的逻辑处理这个连接这显然是不正确的。五、关键信息 3以 HCI_Connection_Complete event 为例原文中特别举了这个例子HCI_Connection_Complete event 中 Link_Type 参数必须正确指示被报告连接的类型。HCI_Connection_Complete event是经典蓝牙 BR/EDR 连接完成时常见的事件。它的作用是告诉 HostController 已经完成了一次连接建立流程。其中Link_Type用来说明连接类型比如0x00: SCO connection 0x01: ACL connection 0x02: eSCO connection所以如果 Controller 建立的是 ACL 数据连接那么Link_Type就应该填写 ACL 对应的值而不能填成 SCO 或 eSCO。六、为什么这个 Correctness 很重要HCI 是 Host 和 Controller 之间的接口。可以简单理解为Host 负责上层协议逻辑 Controller 负责底层无线控制 HCI 是两者之间的通信接口Host 本身并不能直接知道 Controller 底层到底发生了什么它只能通过 HCI Event 和返回参数来判断。所以 Controller 上报的数据必须准确否则 Host 就会基于错误信息做出错误处理。例如Controller 实际建立了 ACL 连接 ↓ 但 HCI_Connection_Complete event 中 Link_Type 填错 ↓ Host 误判连接类型 ↓ 后续 L2CAP、RFCOMM、SDP 或其他上层逻辑可能异常七、这部分可以总结为这部分内容强调的是 HCI 数据格式的正确性原则Controller 在返回 HCI Command 结果或上报 HCI Event 时参数值必须真实、准确地反映实际发生的数据或状态。Host 会依赖这些参数进行后续协议处理因此这些参数不能随意填写也不能与实际情况不一致。换句话说HCI 不只是“字节格式对了就行”还要求字段语义必须正确。