我有一个带有STM BlueNRG-MS芯片的BLE外设。我使用bluenrg API。外围设备通常应该是可发现的,但是应该只允许连接已知的设备。
我认为我可以通过检查EVT_LE_CONN_COMPLETE
回调中中心设备的bdaddr
来实现这一点,并根据地址是否已知,我将允许连接。此外,我将有一个配对模式,我接受所有传入的连接请求,并将新的中心设备添加到已知设备列表中。
case EVT_LE_CONN_COMPLETE:
{
evt_le_connection_complete *cc = (void *)evt->data;
/*TODO: check if peer address is listed or if HMI accepts new pairing
* If in pairing mode, add device to the list and accept connection, otherwise
* go through list and if not found, refuse connection.*/
if(acceptNewPairing){
LOG("CR from %d:%d:%d:%d:%d:%d", cc->peer_bdaddr[0], cc->peer_bdaddr[1], cc->peer_bdaddr[2], cc->peer_bdaddr[3], cc->peer_bdaddr[4], cc->peer_bdaddr[5]);
GAP_ConnectionComplete_CB(cc->peer_bdaddr, cc->handle);
}
}
break;
我的问题是bdaddr
不是恒定的,而是在一定时间后发生变化,所以我没有识别出中心设备。我怎样才能克服这个问题呢?实现大多数已知蓝牙设备提供的此功能的正确方法是什么?
更新:
似乎可以使用
hci_le_add_device_to_white_list(uint8_t bdaddr_type, tBDAddr bdaddr);
之后,即使我将可发现性设置为WHITE_LIST_FOR_ALL
,设备也是可发现的。我现在的问题是,白名单似乎不持久,如果我重新启动设备,我必须再次进入配对模式才能看到它。有人知道怎么保存白名单吗?
aci_gap_configure_whitelist()
做什么?因为如果我调用这个函数,似乎我的白名单会被清除。
更新2:
在STM文档PM0257(第3.10.1节)中,我发现了一个关于我正在寻找的过程的参考。所以我认为这是一个进步。问题是,引用的函数aci_gap_add_device_to_resolving_list
不存在于我的bluenrg API。知道我应该用什么代替吗?
问题已经解决,使用WHITE_LIST_FOR_ONLY_SCAN
属性的aci_gap_set_discoverable()
功能,而只有键合设备应该能够连接。