HTTP-запрос GET с использованием Arduino и ESP8266

Я пытаюсь сделать HTTP-запрос GET, используя Arduino Mega 2560 с ESP82660, но он всегда перезагружает мой 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");
    }

person zxcetera    schedule 02.03.2017    source источник


Ответы (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)

То, как вы это делаете, приведет к переполнению массива и возможному повреждению памяти. Это может быть причиной сброса настроек ESP82660, если поврежденные данные отправлены с wifi.send.

Также вам может потребоваться strcat новая строка после теста, если ее еще нет.

person samgak    schedule 02.03.2017
comment
В дополнение: malloc() буфер длиной strlen("GET ..") + strlen(test) + strlen(" HTTP...") + 1, затем используйте strncat() или snprintf(buf, len, "%s%s%s", "GET..", test, " HTTP") и проверьте возвращаемое значение. Таким образом, вы будете знать, что можете выделить буфер требуемой длины, когда malloc дает вам указатель NON-NULL, а также имеет преимущество поддержки строки произвольной длины test. - person Maximilian Gerhardt; 02.03.2017
comment
malloc на Arduino очень неэффективен и, вероятно, даже не настроен. Может быть (я не уверен), но это очень неэффективно на AVR. Прежде чем выполнять malloc, вам все равно нужно знать размер строки для копирования. Я не уверен, что malloc - отличная идея. - person tilz0R; 02.03.2017
comment
Большое спасибо, это отлично работает для меня :) Большое спасибо;) - person zxcetera; 02.03.2017
comment
@MaximilianGerhardt помните, что общий объем оперативной памяти, доступной на ATmega2560, составляет всего 8 КБ (на 328 это всего 2 КБ). В дополнение к строковым буферам будет использоваться память, используемая библиотеками (например, библиотека Wi-Fi), последовательными буферами, стеком вызовов, другими переменными и т. Д. В таком случае проще установить жесткое ограничение для размера строки. Вы можете использовать malloc (если он доступен), но максимальная длина будет довольно низкой, вы можете получить фрагментацию из-за повторения malloc и free, большие выделения могут привести к сбою последующих выделений и т.д. и т.д. Проще просто сохранить простоту при выполнении встроенного кодирования . - person samgak; 03.03.2017