蓝牙待处理的连接

点击查看代码
static void check_pending_conn(FAR const bt_addr_le_t *addr, uint8_t evtype,
                               FAR struct bt_keys_s *keys)
{
  FAR struct bt_conn_s *conn;

  /* Return if event is not connectible */

  if (evtype != BT_LE_ADV_IND && evtype != BT_LE_ADV_DIRECT_IND)
    {
      return;
    }

  if (keys)
    {
      conn = bt_conn_lookup_state(&keys->addr, BT_CONN_CONNECT_SCAN);
    }
  else
    {
      conn = bt_conn_lookup_state(addr, BT_CONN_CONNECT_SCAN);
    }

  if (!conn)
    {
      return;
    }

  if (bt_hci_stop_scanning())
    {
      goto done;
    }

  if (hci_le_create_conn(addr))
    {
      goto done;
    }

  bt_conn_set_state(conn, BT_CONN_CONNECT);

done:
  bt_conn_release(conn);
}

我直接结合代码 + BLE 蓝牙标准给你最精准、最确定的答案,不绕弯子:

一、代码里 keys->addr 是什么地址?

keys->addr 是:设备的身份地址(Identity Address)**
也就是设备真实、固定、不变的蓝牙地址。


二、它属于蓝牙的哪种地址类型?

BLE 蓝牙标准地址分类中:
keys->addr 属于:

公共地址 / 静态地址(Public / Static Address)

绝对不属于:可解析私有地址 RPA


三、为什么代码要这样写?(核心原理)

你代码里这段逻辑:

if (keys)
{
    // 有密钥 → 用 keys->addr(身份地址)查找
    conn = bt_conn_lookup_state(&keys->addr, BT_CONN_CONNECT_SCAN);
}
else
{
    // 无密钥 → 用广播里的地址查找
    conn = bt_conn_lookup_state(addr, BT_CONN_CONNECT_SCAN);
}

原因如下:

1. 广播里的 addr 可能是 RPA(随机私有地址)

  • 会变
  • 每次开机/定时更换
  • 不能用来长期匹配设备

2. keys->addrIRK 密钥解析出来的真实身份地址

  • 固定不变
  • 是设备真正的唯一标识
  • 用于匹配连接对象、绑定设备、自动重连

四、最关键的结论(考试/面试/写文档都能用)

1. keys->addr 地址类型:

蓝牙身份地址(Identity Address)

2. 在蓝牙所有地址分类中,属于:

公共设备地址(Public Device Address)

静态设备地址(Static Device Address)

3. 绝对不属于:

  • 可解析私有地址 RPA
  • 不可解析私有地址 NRPA

五、一句话总结(最精简)

keys->addr 是蓝牙设备的固定身份地址,属于公共地址/静态地址,不是临时变化的私有地址。


如果你需要,我可以帮你整理:
✅ 蓝牙4 种地址类型的完整区别
✅ 你的代码里地址匹配流程图
✅ 适合写进注释/文档的标准描述文字

你要哪个?

posted @ 2026-04-08 17:40  wzm888  阅读(1)  评论(0)    收藏  举报