esp32 ble 连接告警

zhenghanyong
Posts: 1
Joined: Tue Feb 20, 2024 3:30 am

esp32 ble 连接告警

Postby zhenghanyong » Tue Feb 20, 2024 3:31 am

我最近使用了 在 DEMO里的 “gatt_client”代码里 加入了 "ble_ibeacon" 的代码,目的是为了在“ESP_GAP_BLE_SCAN_RESULT_EVT” 事件里获取rssi 判断信号强度连接设备。代码里加入了深度随眠,按钮低电平唤醒。不知道哪里出了问题、麻烦帮我看看好吗?谢谢。
唤醒后出现的 ble 告警:
lld_pdu_get_tx_flush_nb HCI packet count mismatch (0, 1)
W (2324) BT_HCI: hcif disc complete: hdl 0x0, rsn 0x3e
lld_pdu_get_tx_flush_nb HCI packet count mismatch (0, 1)
W (2424) BT_HCI: hcif disc complete: hdl 0x0, rsn 0x3e
lld_pdu_get_tx_flush_nb HCI packet count mismatch (0, 1)
W (2524) BT_HCI: hcif disc complete: hdl 0x0, rsn 0x3e
lld_pdu_get_tx_flush_nb HCI packet count mismatch (0, 1)
W (2634) BT_HCI: hcif disc complete: hdl 0x0, rsn 0x3e
W (2634) BT_APPL: gattc_conn_cb: if=3 st=0 id=3 rsn=0x3e
E (2644) GATTC_DEMO: ESP_GATTC_DISCONNECT_EVT, reason = 62
E (2644) GATTC_DEMO: open failed, status 133
[cid:5b229fdf$1$18dbf00e566$Coremail$13410038100$163.com]
事件回调代码:
case ESP_GAP_SEARCH_INQ_RES_EVT:
// ESP_LOGI(GATTC_TAG, "searched Adv Data Len %d, Scan Response Len %d", scan_result->scan_rst.adv_data_len, scan_result->scan_rst.scan_rsp_len);
// ESP_LOGE(GATTC_TAG, "===== MAC ==== %d,%d", has_remote_device_mac(remote_device_mac), memcmp(remote_device_mac, scan_result->scan_rst.bda, sizeof(esp_bd_addr_t)));

if (esp_ble_is_ibeacon_packet(scan_result->scan_rst.ble_adv, scan_result->scan_rst.adv_data_len))
{
esp_ble_ibeacon_t *ibeacon_data = (esp_ble_ibeacon_t *)(scan_result->scan_rst.ble_adv);

adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv,
ESP_BLE_AD_TYPE_NAME_CMPL, &adv_name_len);

if (adv_name != NULL && (strncmp((char *)adv_name, "S", 1) == 0 || strncmp((char *)adv_name, "myBle", 5) == 0))
{

int device_rssi = scan_result->scan_rst.rssi;
ESP_LOGE(GATTC_TAG, "*** searched device adv_name *** %s", adv_name);
esp_log_buffer_hex("IBEACON_DEMO: Device address:", scan_result->scan_rst.bda, ESP_BD_ADDR_LEN);
ESP_LOGE(GATTC_TAG, "Measured power (RSSI at a 1m distance):%d dbm", ibeacon_data->ibeacon_vendor.measured_power);
ESP_LOGE(GATTC_TAG, "RSSI of packet:%d dbm\n", scan_result->scan_rst.rssi);
// remote_device_mac 是头一次连接后,存储到nvs里的;设备唤醒后从nvs里取出,有值的话,则匹配这个ble_mac发起连接
if (has_remote_device_mac(remote_device_mac))
{
if (memcmp(remote_device_mac, scan_result->scan_rst.bda, sizeof(esp_bd_addr_t)) == 0 && (device_ble_status == NOT_CONNECT || device_ble_status == SCANNING))
{
device_ble_status = CONNECTING;
esp_ble_gap_stop_scanning();
esp_ble_gattc_open(gl_profile_tab[PROFILE_A_APP_ID].gattc_if, scan_result->scan_rst.bda, scan_result->scan_rst.ble_addr_type, true);
}
}
// 获取信号最好的设备
else if (device_rssi > Base_Rssi && (max_rssi == 0 || device_rssi > max_rssi))
{
max_rssi = device_rssi;
ESP_LOGE(GATTC_TAG, "max_rssi:%d dbm\n", max_rssi);
// memcpy(remote_device_name, (char *)adv_name, adv_name_len);
memcpy(remote_device_mac, scan_result->scan_rst.bda, sizeof(esp_bd_addr_t));
// 在连接回调里会将 remote_device_mac 存到 nvs里面;设备唤醒后从nvs里取出
}
}
}

app_main 里的代码:

void app_main(void)
{
esp_err_t ret;
// 初始化 NVS.
ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);

gpio_pad_select_gpio(5); // 选择要操作的GPIO
gpio_set_direction(5, GPIO_MODE_OUTPUT); // 设置GPIO为推挽输出模式
// 在初始化阶段创建互斥锁
xMutex = xSemaphoreCreateMutex();
// 创建GPIO检测任务
// 任务函数, 任务名字, 任务堆栈大小, 传递给任务函数的参数, 任务优先级, 任務句柄
xTaskCreatePinnedToCore(gpio_task, "gpio_task_example", 2048, NULL, 100, &gpio_task_handle, 1);
// 创建发送指令数据任务
xTaskCreatePinnedToCore(set_data_task, "set_data_task", 2048 * 2, NULL, 9, &set_data_handle, 0);
// 创建任务响应request_level
xTaskCreatePinnedToCore(response_task, "response_task", 2048 * 2, NULL, 8, &response_level_handle, 0);
// 创建led闪烁任务
// xTaskCreatePinnedToCore(blink_task, "blink_task", 1024, NULL, 7, &blink_task_handle, 0);
// esp_log_level_set(TAG, ESP_LOG_VERBOSE);
// esp_log_level_set(GPIO_LOG_TAG, ESP_LOG_VERBOSE);

esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();
if (cause != ESP_SLEEP_WAKEUP_ULP)
{
init_ulp_program();
}
else
{
update_pulse_count();
}

// 按键初始化
gpio_init();
// 按键中断初始化
gpio_intr_init();

init_data();

// 初始化蓝牙
ble_init();

ESP_ERROR_CHECK(esp_sleep_enable_ulp_wakeup());

while (1)
{
// 未加入白名单会在20s后翻转到TO_SLEEP状态
if (device_status == TO_SLEEP)
{
deep_sleep_start();
}
ESP_LOGE(MAIN_TAG, "running ... ");
vTaskDelay(3000 / portTICK_PERIOD_MS);
}
}

Who is online

Users browsing this forum: No registered users and 157 guests