Skip to content
阅读进度

为什么 BLE SDK 常用状态机和串行操作队列? ​

返回 网络与设备通信 目录

标准回答 ​

连接、服务发现、特征读写等操作是异步完成的,回调到达时间可能晚于用户下一步操作。状态机限定当前允许做什么,队列控制可并发范围,让初始化和命令按协议有序推进。

机制解释 ​

常见状态有 Idle、Scanning、Connecting、Discovering、Subscribing、Authenticating、Ready、Disconnecting。一次 API 返回“已受理”不等于完成;对需要串行的 GATT 操作,应等对应回调或明确失败后再推进。每一阶段都要有超时、取消和清理入口。

**代码练习三 连接与命令状态设计:**下面是设计规则,不是可直接调用的 Android API。实现时把状态修改集中到一个串行执行器。

text
connect
  创建新的 sessionId 并进入 Connecting
onConnected
  校验当前 GATT 实例与会话 然后进入 Discovering
onServicesReady
  排队订阅与握手 全部完成后进入 Ready
sendCommand
  仅 Ready 接收 建立 requestId 超时与业务确认条件
onDisconnectOrClose
  结束会话 失败回调未完成请求 释放 GATT 与监听

延伸追问 ​

某次写超时后直接发下一条可以吗?要谨慎。系统回调不一定带应用自定义请求 ID,迟到回调可能被误认成下一条的结果。无法可靠区分时,应结束或重建会话;业务回包则通过协议序号匹配,不能只在本地发明一个 ID 就假定设备会返回它。

内容来源 ​

用完整回答理解机制,用真实证据解释项目。