From d3812a8b72eb02090bca3c54eee717b30c703141 Mon Sep 17 00:00:00 2001 From: chain40 Date: Wed, 8 May 2024 00:29:39 +0800 Subject: [PATCH] =?UTF-8?q?bugfix:=20=E4=BF=AE=E6=AD=A3=20peer=20address?= =?UTF-8?q?=20=E7=9A=84=20type=20=E5=88=A4=E6=96=B7=E9=8C=AF=E8=AA=A4?= =?UTF-8?q?=E7=9A=84=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- host_tasks.c | 48 ++++++++++++++++++++++-------------------------- le_scan.c | 31 ++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 35 deletions(-) diff --git a/host_tasks.c b/host_tasks.c index 7189369..3b4bd5c 100644 --- a/host_tasks.c +++ b/host_tasks.c @@ -125,9 +125,10 @@ static void success_ack(void) uart_drv_tx(ack, sizeof(ack)); } -static void disconnect_and_timeout_ack(void) { - uint8_t ack[] = {0x04, 0x00, 0x01, 0xFF}; - uart_drv_tx(ack, sizeof(ack)); +static void disconnect_and_timeout_ack(void) +{ + uint8_t ack[] = { 0x04, 0x00, 0x01, 0xFF }; + uart_drv_tx(ack, sizeof(ack)); } static void on_ins_scan(ins_scan_t *p_ins) @@ -139,34 +140,29 @@ static void on_ins_scan(ins_scan_t *p_ins) static void on_ins_connect(ins_connect_t *p_ins) { ble_gap_addr_t peer_addr; - peer_addr.addr_id_peer = 0; - peer_addr.addr[0] = p_ins->addr[5]; - peer_addr.addr[1] = p_ins->addr[4]; - peer_addr.addr[2] = p_ins->addr[3]; - peer_addr.addr[3] = p_ins->addr[2]; - peer_addr.addr[4] = p_ins->addr[1]; - peer_addr.addr[5] = p_ins->addr[0]; - switch (peer_addr.addr[5] & 0b11000000) - { - case 0b00000000: - peer_addr.addr_type = BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE; - break; - case 0b11000000: - peer_addr.addr_type = BLE_GAP_ADDR_TYPE_RANDOM_STATIC; - break; - case 0b01000000: - peer_addr.addr_type = BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE; - break; - case 0b10000000: - peer_addr.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC; - break; - } + peer_addr.addr_type = BLE_GAP_ADDR_TYPE_ANONYMOUS; + peer_addr.addr[0] = p_ins->addr[5]; + peer_addr.addr[1] = p_ins->addr[4]; + peer_addr.addr[2] = p_ins->addr[3]; + peer_addr.addr[3] = p_ins->addr[2]; + peer_addr.addr[4] = p_ins->addr[1]; + peer_addr.addr[5] = p_ins->addr[0]; extern void le_scan_stop(void); le_scan_stop(); - vTaskDelay(pdMS_TO_TICKS(5)); + vTaskDelay(pdMS_TO_TICKS(3)); + + extern void le_scan_get_peer_addr(ble_gap_addr_t * p_peer_addr); + le_scan_get_peer_addr(&peer_addr); + + if (peer_addr.addr_type == BLE_GAP_ADDR_TYPE_ANONYMOUS) + { + extern void le_scan_start(void); + le_scan_start(); + return; + } extern void le_gap_connet(ble_gap_addr_t * p_peer_addr); le_gap_connet(&peer_addr); diff --git a/le_scan.c b/le_scan.c index 691973c..fce9e45 100644 --- a/le_scan.c +++ b/le_scan.c @@ -78,14 +78,14 @@ static void on_adv_report(ble_gap_evt_adv_report_t const *p_adv_report) p_adv_report->rssi); } - - static uint8_t scan_buffer[BLE_GAP_SCAN_BUFFER_MAX]; static ble_data_t const adv_report_buffer = { .p_data = scan_buffer, .len = BLE_GAP_SCAN_BUFFER_MAX }; static ble_uuid_t const filter_uuid = { .type = BLE_UUID_TYPE_BLE, .uuid = 0xFFF0 }; +static uint64_t mac = 0; +static uint32_t peer_addr_idx = 0; +static ble_gap_addr_t peer_addr_list[16]; -static uint64_t mac = 0; void le_scan_handler(ble_evt_t const *p_ble_evt, void *p_context) { ret_code_t err_code; @@ -99,14 +99,13 @@ void le_scan_handler(ble_evt_t const *p_ble_evt, void *p_context) { mac = u64_peer_addr; - char peer_addr_str[(2 + 1) * BLE_GAP_ADDR_LEN + 1] = { 0 }; - if (peer_addr) { + char peer_addr_str[(2 + 1) * BLE_GAP_ADDR_LEN + 1] = { 0 }; + peer_addr_list[peer_addr_idx++ % COUNTOF(peer_addr_list)] = *peer_addr; sprintf(peer_addr_str, "%02X:%02X:%02X:%02X:%02X:%02X", peer_addr->addr[5], peer_addr->addr[4], peer_addr->addr[3], peer_addr->addr[2], peer_addr->addr[1], peer_addr->addr[0]); + NRF_LOG_INFO("%s", peer_addr_str); } - - NRF_LOG_INFO("%s", peer_addr_str); } else if (mac == u64_peer_addr) { @@ -116,6 +115,18 @@ void le_scan_handler(ble_evt_t const *p_ble_evt, void *p_context) sd_ble_gap_scan_start(NULL, &adv_report_buffer); } +void le_scan_get_peer_addr(ble_gap_addr_t *p_peer_addr) +{ + for (uint32_t i = 0; i < COUNTOF(peer_addr_list); i++) + { + if (memcmp(peer_addr_list[i].addr, p_peer_addr->addr, BLE_GAP_ADDR_LEN) == 0) + { + p_peer_addr->addr_type = peer_addr_list[i].addr_type; + break; + } + } +} + static ble_gap_scan_params_t scan_params = { .active = 1, .interval = NRF_BLE_SCAN_SCAN_INTERVAL, @@ -141,7 +152,9 @@ void le_scan_start(void) { NRF_LOG_INFO("Start scanning for UUID service 0x%04X.", BLE_UUID_CUSTOM_SERVICE); - is_scanning = true; + is_scanning = true; + peer_addr_idx = 0; + memset(peer_addr_list, 0x00, sizeof(peer_addr_list)); sd_ble_gap_scan_start(&scan_params, &adv_report_buffer); } } @@ -156,4 +169,4 @@ void le_scan_stop(void) ble_gap_scan_params_t *le_scan_params(void) { return &scan_params; -} \ No newline at end of file +}