AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

    • 主页
    • 系统&网络
    • Ubuntu
    • Unix
    • DBA
    • Computer
    • Coding
    • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-30162631

etan's questions

Martin Hope
etan
Asked: 2025-04-05 13:56:28 +0800 CST

当 STA 连接到新网络时,不要重置连接

  • 6

我正在制作一个需要 Web 界面的设备,以下是我设置 WiFi 的方式(受我的智能插头的启发):

  • 开放AP供设备连接
  • 使其自身为 6.6.6.6,以便客户端可以向该 IP 发送请求
  • 客户提出请求
  • 设备尝试以 STA 身份连接 WiFi
  • 设备响应客户端的请求

我遇到了一个问题,当 STA成功连接到 WiFi 时,连接会重置(httpd_txrx:httpd_sock_err:发送错误:113),如果没有,它会正常工作。有没有什么办法可以解决这个问题?用于存储和响应请求的代码:

esp_err_t connect_post_handler(httpd_req_t *req) 
{
    size_t size = req->content_len;
    if (size > 1024) {
        // too big
        const char* response = "Content too massive, but you know what else is massive?";
        httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, response);

        return ESP_OK;
    }

    char content[1024];

    int bytes_read = httpd_req_recv(req, content, size);
    if (bytes_read == 0) {
        // connection closed
        return ESP_ERR_HTTPD_INVALID_REQ;
    }

    cJSON* jsonData = cJSON_ParseWithLength(content, size);
    if (jsonData == NULL) {
        // json parsing failed, bad request
        const char* response = "Bad JSON format";
        httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, response);
        return ESP_OK;
    }
    char* ssid = cJSON_GetObjectItem(jsonData, "ssid")->valuestring;
    char* password = cJSON_GetObjectItem(jsonData, "password")->valuestring;
    reconnect_callback(ssid, password);
    httpd_req_async_handler_begin(req, &request); // <--- this!!!
    cJSON_Delete(jsonData);

    return ESP_OK;
}
void wifi_setup_handle_response(bool boolean, const char * response) 
{
    cJSON* response_data = cJSON_CreateObject();
    cJSON_AddBoolToObject(response_data, "success", boolean);
    cJSON_AddStringToObject(response_data, "message", response);
    

    char* response_string = cJSON_Print(response_data);

    printf(response_string);

    if (response_string == NULL) {
        // failed
        ESP_LOGE(LOG_TAG, "Could not write wifi connect response to string");
        httpd_resp_send_500(request);
        cJSON_Delete(response_data);
        return;
    }


    httpd_resp_send(request, response_string, strlen(response_string));
    httpd_req_async_handler_complete(request);

    free(response_string);
    cJSON_Delete(response_data);
}
httpd_req_t* request;

有没有办法解决这个问题,或者这是一种糟糕的设置或使用方式,我应该使用蓝牙来设置(和使用)而不是 WiFi?

c
  • 1 个回答
  • 32 Views
Martin Hope
etan
Asked: 2025-04-04 10:51:47 +0800 CST

存储 HTTP 请求

  • 6

我正在尝试将 HTTP 请求存储为全局变量。我的软件是关于连接 WiFi 的,我使用的 WiFi 库是基于事件的,这意味着我必须将 HTTP 请求存储在某个地方并等待事件回调。 问题:我再次尝试访问它后,程序崩溃了。日志:

> Guru Meditation Error: Core  0 panic'ed (StoreProhibited). Exception
> was unhandled.
> 
> Core  0 register dump: PC      : 0x400ff5e5  PS      : 0x00060430  A0 
> : 0x800d79a1  A1      : 0x3ffbdf90
> --- 0x400ff5e5: httpd_resp_send at F:/Espressif/frameworks/esp-idf-v5.2.5/components/esp_http_server/src/httpd_txrx.c:248
> 
> A2      : 0x3ffc93c8  A3      : 0x3f4038ec  A4      : 0x00000003  A5  
> : 0x00000000 A6      : 0x00000000  A7      : 0x3ffc93c8  A8      :
> 0x00000000  A9      : 0x3ffbdf30 A10     : 0x000001f4  A11     :
> 0x3ffbdf30  A12     : 0x3ffbde44  A13     : 0x3ffbde0c A14     :
> 0x3ffbde20  A15     : 0x3ffbdff0  SAR     : 0x00000004  EXCCAUSE:
> 0x0000001d EXCVADDR: 0x00000218  LBEG    : 0x400014fd  LEND    :
> 0x4000150d  LCOUNT  : 0xffffffff
> --- 0x400014fd: strlen in ROM
> --- 0x4000150d: strlen in ROM
> 
> 
> 
> Backtrace: 0x400ff5e2:0x3ffbdf90 0x400d799e:0x3ffbdfd0
> 0x400d773b:0x3ffbdff0 0x400d7ad1:0x3ffbe020 0x4016387d:0x3ffbe050
> 0x401633c6:0x3ffbe080 0x401634a1:0x3ffbe0c0 0x4008a129:0x3ffbe0e0
> --- 0x400ff5e2: httpd_resp_send at F:/Espressif/frameworks/esp-idf-v5.2.5/components/esp_http_server/src/httpd_txrx.c:248
> --- 0x400d799e: wifi_setup_handle_response at F:/Documents/dashboardfordevice/device-software/main/wifi_setup_webpage.c:44
> --- 0x400d773b: disconnect_handler at F:/Documents/dashboardfordevice/device-software/main/wifi_manager.c:20
> --- 0x400d7ad1: run_on_event at F:/Documents/dashboardfordevice/device-software/main/wifi.c:32
> --- 0x4016387d: handler_execute at F:/Espressif/frameworks/esp-idf-v5.2.5/components/esp_event/esp_event.c:137
> --- 0x401633c6: esp_event_loop_run at F:/Espressif/frameworks/esp-idf-v5.2.5/components/esp_event/esp_event.c:593
> --- 0x401634a1: esp_event_loop_run_task at F:/Espressif/frameworks/esp-idf-v5.2.5/components/esp_event/esp_event.c:107
> --- 0x4008a129: vPortTaskWrapper at F:/Espressif/frameworks/esp-idf-v5.2.5/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:13

据我了解,这首先是由空字符串引起的,但这是 wifi_setup_webpage.c 中的第 44 行,httpd_resp_send(request, "200", 3);据我所知,这不可能是问题所在,因为执行同样事情的其他处理程序不会崩溃,唯一的区别是它们指向请求的指针是“新鲜的”。

我使用全局变量存储请求:httpd_req_t* request;然后使用request = req; 该方法的完整代码对其进行分配:

esp_err_t connect_post_handler(httpd_req_t *req) 
{
    size_t size = req->content_len;
    if (size > 1024) {
        // too big
        const char* response = "Content too massive, but you know what else is massive?";
        httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, response);

        return ESP_OK;
    }

    char content[1024];

    int bytes_read = httpd_req_recv(req, content, size);
    if (bytes_read == 0) {
        // connection closed
        return ESP_ERR_HTTPD_INVALID_REQ;
    }

    cJSON* jsonData = cJSON_ParseWithLength(content, size);
    if (jsonData == NULL) {
        // json parsing failed, bad request
        const char* response = "Bad JSON format";
        httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, response);
        return ESP_OK;
    }
    char* ssid = cJSON_GetObjectItem(jsonData, "ssid")->valuestring;
    char* password = cJSON_GetObjectItem(jsonData, "password")->valuestring;

    cJSON_Delete(jsonData);

    request = req;

    reconnect_callback(ssid, password);

    return ESP_OK;
}

以及发送请求的方法的完整代码:

void wifi_setup_handle_response(bool boolean, const char * response) 
{
    // cJSON* response_data = cJSON_CreateObject();
    // cJSON_AddBoolToObject(response_data, "success", boolean);
    // cJSON_AddStringToObject(response_data, "message", response);
    

    // char* response_string = cJSON_Print(response_data);

    // ESP_LOGI(LOG_TAG, "Raw Response: %s", response_string);

    // if (response_string == NULL) {
    //     // failed
    //     ESP_LOGE(LOG_TAG, "Could not write wifi connect response to string");
    //     httpd_resp_send_500(request);
    //     cJSON_Delete(response_data);
    //     return;
    // }

    if (request == NULL) {
        ESP_LOGE(LOG_TAG, "request is null, aha!");
        return;
    }

    httpd_resp_send(request, "200", 3);
    

    // free(response_string);
    // cJSON_Delete(response_data);
}

仅供参考:这两个函数之间有大约 3 秒的间隔。顺序:connect_post_handler 然后 void wifi_setup_handle_response。我认为这是因为与堆栈内存相关的某些东西被破坏了,然后指向它的指针不再有效,但我不知道如何处理它,因为请求 typedef 有很多指向其他内容的奇特指针。

c
  • 1 个回答
  • 68 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve