nrf52在未配对的情况下使用白名单广播,指定安卓手机允许连接

众所周知,安卓手机的蓝牙类型是随机可解析类型,即安卓蓝牙地址发在空中都是随机的。这个特性是为了保护安卓手机蓝牙的隐私性。当nrf52与安卓手机配对上之后,nrf52能够获得安卓手机的解析地址的key(IRK),以后就可以解析空中的随机地址了。

我们要想要在未配对时,通过白名单广播方式指定安卓手机才可连接,就要手动添加IRK。
在蓝牙协议中,IRK与安卓手机的真实地址(在手机设置中可以看到)是这么个关系:

小米8的IRK=>小米8的真实地址11:22:33:44:55:66
小米5的IRK=>小米5的真实地址aa:bb:cc:dd:ee:ff

当手机向nrf52发起连接时,IRK会对空中的安卓蓝牙地址addr_air进行计算,类似:

resoult=func(addr_air的高24位,IRK0);
if(resoult和addr_air的低24位相同)
{
	解析成功,允许连接。
}

我们可以看到,上述过程并没有手机的真实地址参与,白名单广播并不需要给定手机的真实地址。

以下给出nrf52在未配对的情况下使用白名单广播的程序代码:

ble_gap_id_key_t oneplus3_key;//全局变量,不需要给定手机的真实地址
ble_gap_id_key_t const * key_ptrs[BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT];//全局变量
ble_gap_addr_t const* whitelist_addrs_gap[BLE_GAP_WHITELIST_ADDR_MAX_COUNT];//全局变量

// 1.添加到identities_list
memmove(oneplus3_key.id_info.irk,[从手机获取的IRK],sizeof(ble_gap_irk_t));
key_ptrs[0]=&oneplus3_key;
sd_ble_gap_device_identities_set(key_ptrs,NULL,1);

// 2.添加到whitelist
whitelist_addrs_gap[0] = &oneplus3_key.id_addr_info;
err_code = sd_ble_gap_whitelist_set(whitelist_addrs_gap, 1);
APP_ERROR_CHECK(err_code);

你可能感兴趣的:(蓝牙)