You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

咨询问题

  1. 为何外设的bond_deleted回调未收到中央解绑的通知?
  2. 是否存在其他方式获取该解绑通知?
  3. 这是否属于BLE的固有概念?

补充说明

  • disconnected回调会被正常触发
  • 断开连接后,若其他中央设备发起连接,外设会在绑定前触发bond_deleted回调

问题解答

1. bond_deleted回调未触发的原因

BLE协议本身没有定义中央设备主动删除绑定后通知外设的机制。Android端取消配对时,仅在本地删除绑定信息,不会向外设发送任何告知解绑的指令。而Zephyr中bond_deleted回调的触发场景仅包括:

  • 外设主动调用bt_conn_bond_delete()等接口删除自身存储的绑定信息
  • 新的中央设备发起配对,外设需要清理旧绑定信息时(即补充说明中提到的场景)
    因此中央端单方面删除绑定的操作,外设无法感知,也就不会触发该回调。

2. 获取解绑通知的替代方案

没有直接获取中央端主动解绑通知的方式,但可以通过间接手段判断:

  • 连接时验证绑定状态:当中央设备再次发起连接时,若原本存在绑定但连接未使用绑定信息(触发重新配对流程),可推断中央端已删除绑定。
  • 定期清理过期绑定:为绑定信息设置有效期,定期清理长时间未连接的绑定条目,同时执行自定义的解绑处理逻辑。
  • 监听连接失败原因:若中央设备连接时因“无有效绑定信息”导致配对失败,可作为解绑的间接判断依据。

3. 是否属于BLE固有概念

是的,这属于BLE的固有设计。BLE的绑定信息由两端各自独立存储,协议不要求一端删除绑定后必须通知另一端。这种设计既简化了协议逻辑,减少了额外通信开销,也考虑到了两端可能处于离线状态、通知无法送达的情况。

内容的提问来源于stack exchange,提问作者Samir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:35:28