bugfix: 修正 peer address 的 type 判斷錯誤的問題

This commit is contained in:
chain40
2024-05-08 00:29:39 +08:00
parent df70d69851
commit d3812a8b72
2 changed files with 44 additions and 35 deletions
+22 -26
View File
@@ -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);
+22 -9
View File
@@ -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;
}
}