完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我最近使用了 在 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 dbmn", 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 dbmn", 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); } } |
|
相关推荐
1个回答
|
|
|
根据您提供的信息,您在使用ESP32的gatt_client DEMO代码时,加入了ble_ibeacon代码,并在ESP_GAP_BLE_SCAN_RESULT_EVT事件中获取RSSI以判断信号强度连接设备。同时,您还加入了深度睡眠和按钮低电平唤醒功能。现在您遇到了BLE告警问题。
首先,我们需要分析可能的原因: 1. 代码问题:可能是您在加入ble_ibeacon代码时,某些部分没有正确实现或者与其他部分产生了冲突。 2. 深度睡眠和唤醒问题:可能是深度睡眠和唤醒功能与BLE扫描和连接功能之间存在不兼容或者冲突。 3. 硬件问题:可能是ESP32硬件本身存在问题,导致BLE功能异常。 为了解决这个问题,您可以尝试以下步骤: 1. 检查代码:仔细检查您加入的ble_ibeacon代码,确保没有语法错误或者逻辑错误。同时,检查是否与其他部分产生了冲突。 2. 调试深度睡眠和唤醒功能:确保深度睡眠和唤醒功能正常工作,不会影响BLE扫描和连接功能。 3. 检查硬件:如果可能,请尝试更换一个ESP32硬件,看看问题是否仍然存在。 4. 查阅官方文档和社区:查看ESP32官方文档和相关社区,看看是否有其他人遇到类似问题,并找到解决方案。 5. 联系技术支持:如果以上步骤都无法解决问题,您可以考虑联系ESP32的技术支持,寻求专业帮助。 希望以上建议能帮助您解决问题。祝您好运! |
|
|
|
|
只有小组成员才能发言,加入小组>>
945 浏览 0 评论
1672 浏览 0 评论
请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
1330 浏览 1 评论
1233 浏览 1 评论
5021 浏览 2 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
1254浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
927浏览 3评论
2338浏览 3评论
ESP-IDF的VScode插件的build按钮点击会报错的原因?
2528浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
1052浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 15:56 , Processed in 0.569214 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
553
