蓝牙待处理的连接
点击查看代码
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->addr 是 IRK 密钥解析出来的真实身份地址
- 固定不变
- 是设备真正的唯一标识
- 用于匹配连接对象、绑定设备、自动重连
四、最关键的结论(考试/面试/写文档都能用)
1. keys->addr 地址类型:
蓝牙身份地址(Identity Address)
2. 在蓝牙所有地址分类中,属于:
公共设备地址(Public Device Address)
或
静态设备地址(Static Device Address)
3. 绝对不属于:
- 可解析私有地址 RPA
- 不可解析私有地址 NRPA
五、一句话总结(最精简)
keys->addr 是蓝牙设备的固定身份地址,属于公共地址/静态地址,不是临时变化的私有地址。
如果你需要,我可以帮你整理:
✅ 蓝牙4 种地址类型的完整区别
✅ 你的代码里地址匹配流程图
✅ 适合写进注释/文档的标准描述文字
你要哪个?
浙公网安备 33010602011771号