Nordic nRF52840(Zephyr)外设未收到Android中央解绑通知问题咨询
问题背景
设备信息
- 外设:Nordic nRF52840芯片搭配Zephyr系统
- 中央设备:Android智能手机
已成功创建绑定,外设的pairing_complete回调已触发。但当在Android智能手机端通过“蓝牙>[外设设备]取消配对”手动删除绑定时,外设无法收到通知。
相关回调注册代码
BT_CONN_CB_DEFINE(conn_callbacks) = { .connected = connected, .disconnected = disconnected, }; struct bt_conn_auth_cb cb = { .cancel = cancel, .oob_data_request = NULL, .pairing_confirm = NULL, .passkey_confirm = pass_confirm, .passkey_display = pass_display, .passkey_entry = NULL, }; bt_conn_auth_cb_register(&cb); struct bt_conn_auth_info_cb info_cb = { .bond_deleted = bond_deleted, // 中央删除配对时未被调用 .pairing_complete = pairing_complete, .pairing_failed = pairing_failed, }; bt_conn_auth_info_cb_register(&info_cb);
咨询问题
- 为何外设的
bond_deleted回调未收到中央解绑的通知? - 是否存在其他方式获取该解绑通知?
- 这是否属于BLE的固有概念?
补充说明
disconnected回调会被正常触发- 断开连接后,若其他中央设备发起连接,外设会在绑定前触发
bond_deleted回调
问题解答
1. bond_deleted回调未触发的原因
BLE协议本身没有定义中央设备主动删除绑定后通知外设的机制。Android端取消配对时,仅在本地删除绑定信息,不会向外设发送任何告知解绑的指令。而Zephyr中bond_deleted回调的触发场景仅包括:
- 外设主动调用
bt_conn_bond_delete()等接口删除自身存储的绑定信息 - 新的中央设备发起配对,外设需要清理旧绑定信息时(即补充说明中提到的场景)
因此中央端单方面删除绑定的操作,外设无法感知,也就不会触发该回调。
2. 获取解绑通知的替代方案
没有直接获取中央端主动解绑通知的方式,但可以通过间接手段判断:
- 连接时验证绑定状态:当中央设备再次发起连接时,若原本存在绑定但连接未使用绑定信息(触发重新配对流程),可推断中央端已删除绑定。
- 定期清理过期绑定:为绑定信息设置有效期,定期清理长时间未连接的绑定条目,同时执行自定义的解绑处理逻辑。
- 监听连接失败原因:若中央设备连接时因“无有效绑定信息”导致配对失败,可作为解绑的间接判断依据。
3. 是否属于BLE固有概念
是的,这属于BLE的固有设计。BLE的绑定信息由两端各自独立存储,协议不要求一端删除绑定后必须通知另一端。这种设计既简化了协议逻辑,减少了额外通信开销,也考虑到了两端可能处于离线状态、通知无法送达的情况。
内容的提问来源于stack exchange,提问作者Samir
相关产品推荐
相关产品推荐

