目录
[1.GAP 链接密钥逻辑](#1.GAP 链接密钥逻辑)
展示了如何遍历存储在 NVS 中的经典链接密钥,链接密钥是每个设备-设备绑定的。如果蓝牙控制器可以交换,例如在桌面系统上,则每个控制器都需要一个链接密钥数据库。我们需要等待直到蓝牙堆栈启动并根据控制器的 BD ADDR 选择正确的链接密钥数据库。
1.GAP 链接密钥逻辑
列出存储的链接密钥。
2.蓝牙逻辑
在列出存储的链接密钥之前等待蓝牙启动。
3.主应用程序设置
主应用程序代码注册 HCI 数据包处理器并启动蓝牙堆栈。
/* @section GAP Link Key Logic
*
* @text List stored link keys
*/
static void list_link_keys(void){
bd_addr_t addr;
link_key_t link_key;
link_key_type_t type;
btstack_link_key_iterator_t it;
int ok = gap_link_key_iterator_init(&it);
if (!ok) {
printf("Link key iterator not implemented\n");
return;
}
printf("Stored link keys: \n");
while (gap_link_key_iterator_get_next(&it, addr, link_key, &type)){
printf("%s - type %u, key: ", bd_addr_to_str(addr), (int) type);
printf_hexdump(link_key, 16);
}
printf(".\n");
gap_link_key_iterator_done(&it);
}
/* @section Bluetooth Logic
*
* @text Wait for Bluetooth startup before listing the stored link keys
*/
static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
UNUSED(channel);
UNUSED(size);
if (packet_type != HCI_EVENT_PACKET) return;
switch(hci_event_packet_get_type(packet)){
case BTSTACK_EVENT_STATE:
if (btstack_event_state_get_state(packet) == HCI_STATE_WORKING){
list_link_keys();
break;
}
break;
default:
break;
}
}
/* @section Main Application Setup
*
* @text Listing MainConfiguration shows main application code.
* It registers the HCI packet handler and starts the Bluetooth stack.
*/
/* LISTING_START(MainConfiguration): Setup packet handler for GAP inquiry */
int btstack_main(int argc, const char * argv[]);
int btstack_main(int argc, const char * argv[]) {
(void)argc;
(void)argv;
hci_event_callback_registration.callback = &packet_handler;
hci_add_event_handler(&hci_event_callback_registration);
// turn on!
hci_power_control(HCI_POWER_ON);
return 0;
}
/* LISTING_END */