【问题标题】:HTTP GET request using Arduino and ESP8266使用 Arduino 和 ESP8266 的 HTTP GET 请求
【发布时间】:2017-03-02 08:59:26
【问题描述】:

我正在尝试使用带有 ESP82660 的 arduino Mega 2560 发出 HTTP GET 请求, 但它总是重新启动我的 esp8266。

这是我的方法:

    char *hello = "GET /api/bus/register?code=";
    strcat(hello,test);
    strcat(hello," HTTP/1.1\r\nHost: 192.168.88.233\r\nConnection:close\r\n\r\n");

    wifi.send((const uint8_t*)hello, strlen(hello));
    uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000);
    if (len > 0) {
    Serial.print("Received:[");
    for(uint32_t i = 0; i < len; i++) {
        Serial.print((char)buffer[i]);
    }
    Serial.print("]\r\n");
    }

【问题讨论】:

    标签: arduino embedded esp8266 arduino-esp8266


    【解决方案1】:

    您需要分配一个足够大的缓冲区来容纳整个串联字符串,例如:

    char hello[256];
    strcpy(hello, "GET /api/bus/register?code=");
    strcat(hello, test);
    strcat(hello," HTTP/1.1\r\nHost: 192.168.88.233\r\nConnection:close\r\n\r\n");
    

    (以上代码仍然不安全,还需要检查测试大小或使用strncat

    你这样做的方式会导致数组溢出和可能的内存损坏。如果使用wifi.send 发送损坏的数据,这可能是重置 ESP82660 的原因。

    如果还没有,您可能需要在测试后strcat 换行。

    【讨论】:

    • 另外:malloc()一个长度为strlen("GET ..") + strlen(test) + strlen(" HTTP...") + 1的缓冲区,然后在其上使用strncat()snprintf(buf, len, "%s%s%s", "GET..", test, " HTTP")并检查返回值。这样你就会知道当malloc给你一个非空指针时你可以分配一个所需长度的缓冲区,并且还具有支持“任意”长度test字符串的好处。
    • Arduino 上的 malloc 效率非常低,甚至可能没有设置。可能是(我不确定),但它在 AVR 上效率很低。在执行 malloc 之前,您仍然需要先了解复制的字符串大小。我不确定 malloc 是否是个好主意。
    • 非常感谢,这对我来说很好 :) 非常感谢 ;)
    • @MaximilianGerhardt 请记住,ATmega2560 上可用的总 RAM 只有 8Kb(在 328 上只有 2Kb)。除了字符串缓冲区之外,还有库(例如 wifi 库)、串行缓冲区、调用堆栈、其他变量等使用的内存。在这种情况下,对字符串大小进行硬限制会更简单。您可以使用 malloc(如果可用),但最大长度会非常低,您可能会从重复 malloc 和 free 中获得碎片,大分配可能会导致后续分配失败等。在进行嵌入式编码时保持简单更容易.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多