Http GET-запрос не блокирует Arduino

Я создаю счетчик людей, просто подсчитываю количество входов и выходов в комнате, а затем загружаю его в свою базу данных. Я использую Arduino MEGA2560 с ESP8266 в качестве коммуникатора с моим сервером.

Но у меня возникают проблемы, когда я отправляю HTTP-запрос GET на свой сервер. Как только я отправлю запрос HTTP GET, моя функция счетчика не будет работать до тех пор, пока запрос HTTP GET не будет выполнен. Просто интересно, есть ли здесь в Arduino асинхронная функция, простая в использовании и понимании, или есть правильный способ использования запроса HTTP GET

Вот мой код:

void loop{
    counter(); // let's assume that this function is just counting in and out person in the room 
    // changing the value of variable count
    uint8_t buffer[1024] = {0};

    if (wifi.createTCP(HOST_NAME, HOST_PORT)) {
        Serial.print("create tcp ok\r\n");
    } else {
        Serial.print("create tcp err\r\n");
    }

    char hello[];
    strcpy(hello, "GET /vbus/insert.php?coount=");
    strcat(hello, count);
    strcat(hello," HTTP/1.1\r\nHost: www.test.com\r\nConnection:close\r\n\r\n");
    wifi.send((const uint8_t*)hello, strlen(hello));
    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");
    }
}

PS: у меня нет проблем с отправкой HTTP-запроса GET только того, что я сказал выше.


person zxcetera    schedule 19.03.2017    source источник
comment
Используете ли вы прошивку arduino в esp8266? У вас есть тег arduino-esp8266 в вопросе.   -  person cagdas    schedule 20.03.2017
comment
Я использую Arduino с esp8266. Если мой тег неверен, поправьте меня :)   -  person zxcetera    schedule 20.03.2017
comment
Нет, нет проблем. Просто пытаюсь понять, что вы используете arduino fw на esp8266.   -  person cagdas    schedule 20.03.2017
comment
Пока вы используете последовательную библиотеку для подключения, вы не будете достаточно гибкими, чтобы иметь поддержку по такого рода проблемам. Прошивка ESP8266 Arduino имеет асинхронную HTTP-библиотеку, к вашему сведению.   -  person cagdas    schedule 20.03.2017
comment
@cagdas, можете ли вы сказать мне, что такое fw, я всего лишь новичок, пожалуйста, простите меня :), так что вы говорите мне лучше, если я использую AT-команду serial.write?   -  person zxcetera    schedule 21.03.2017


Ответы (2)


Этот тип серийных библиотек далек от гибкости для ваших пользовательских запросов. Пока вы используете свое устройство ESP8266 через последовательный порт, на нем есть встроенное программное обеспечение для обработки ваших запросов. Именно прошивка.

Если вы используете AT-команды, это не поможет в вашем случае, поэтому на нем нет неблокирующей реализации TCP для обработки асинхронных HTTP-запросов.

Существует решение с асинхронной библиотекой TCP для пользователей ESP8266 на основе Arduino, где вы можете адаптируйте к нему свою кодовую базу, а здесь ради гибкости.

person cagdas    schedule 22.03.2017
comment
Привет, когда я пытаюсь скомпилировать пример программы, я получаю эту ошибку. C:\Users\zxcet\Documents\Arduino\libraries\ESPAsyncTCP-master\src/ESPAsyncTCP.h:27:22: фатальная ошибка: функционал: Нет такого файла или каталога #include ‹functional› ^ компиляция прекращена. статус выхода 1 Ошибка компиляции для платы Arduino/Genuino Mega или Mega 2560. - person zxcetera; 22.03.2017
comment
Это для устройства esp8266. Вы будете напрямую программировать ESP8266, а не arduino mega. Поэтому вам нужно импортировать esp8266 как устройство из диспетчера плат. - person cagdas; 22.03.2017
comment
Вот хорошая отправная точка: learn.sparkfun.com/tutorials/esp8266-thing-hookup-guide/ - person cagdas; 22.03.2017
comment
Если для вашего случая требуется arduino mega, вам также может понадобиться последовательное соединение, но с написанием собственного протокола и вызовом собственных функций. Действительно немного жестковато. - person cagdas; 22.03.2017
comment
В моем случае мне очень нужна ардуино, я использую другие модули, а не только Wi-Fi, но спасибо, что просветили меня в моем случае. Я просто пытаюсь это сделать - person zxcetera; 22.03.2017
comment
Получить и результаты? - person cagdas; 12.05.2017
comment
Я закончил этот проект, я просто игнорирую ответ на сервере, и он работает отлично, в любом случае спасибо за ваш ответ :) - person zxcetera; 15.05.2017
comment
@zxcetera, у меня похожая проблема. Вы имеете в виду, что вы просто отправляете и игнорируете ответ от сервера, чтобы избавить Arduino от ожидания? Насколько я понимаю, отправка AT-команды также остановит устройство (на некоторое время). Например, запуск GSM может останавливаться на 10 секунд. Вероятно, просто отправка HTTP-запроса не так уж и длинна... - person John Pang; 02.04.2019
comment
@JohnPang да, и будьте более осторожны с длиной строки wifi.send(str,??), хорошая скорость интернета - это плюс, кстати, я не использую модуль gsm, просто esp8266 - person zxcetera; 29.04.2019

Для тех, кто посещает этот пост позже 2017 года:

Вы можете использовать эту библиотеку для этого случая: ESP8266AsyncHttpClient

Это асинхронный HTTP-клиент для ESP8266, использующий библиотеку ESPAsyncTCP.

Это написано мной, и вы можете только отправлять запросы, но вы еще не можете получить ответ для дальнейшей обработки. Но в будущем буду реализовывать.

person Jonathan    schedule 26.08.2020