外观
为什么 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 就假定设备会返回它。
内容来源
- Android 智能硬件 SDK 技术 Wiki · 原条目
Q42