Не удается прочитать Arduino+ESP8266 полный получить ответ
Используя приведенный ниже код, я могу вызвать запрос HTTP Get, но я не могу прочитать полный ответ HTTP. Наблюдая только вывод типа( +IPD,0,141:HTTP/1.7. ). Пожалуйста, дайте мне знать, как я могу прочитать полный ответ? Есть идеи, в чем проблема?
#include <SoftwareSerial.h>
#define RX 2
#define TX 3
String WIFI_SSID = "xyz"; // Your WiFi ssid
String PASSWORD = "xys"; // Password
String HOST = "192.168.0.156";
String PATH = "/test";
String PORT = "8080";
int countTrueCommand;
int countTimeCommand;
boolean found = false;
SoftwareSerial esp8266(RX, TX);
void setup() {
Serial.begin(9600);
esp8266.begin(9600);
esp8266.println("AT");
Serial.println(esp8266.read());
sendCommandToESP8266("AT", 5, "OK");
sendCommandToESP8266("AT+CWMODE=1", 5, "OK");
sendCommandToESP8266("AT+CWJAP=\"" + WIFI_SSID + "\",\"" + PASSWORD + "\"", 20, "OK");
}
void loop() {
String postRequest = "GET " + PATH + " HTTP/1.1\r\n" +
"Host: " + HOST + "\r\n" +
"Accept: *" + "/" + "*\r\n" +
"\r\n";
sendCommandToESP8266("AT+CIPMUX=1", 5, "OK");
sendCommandToESP8266("AT+CIPSTART=0,\"TCP\",\"" + HOST + "\"," + PORT, 15, "OK");
String cipSend = "AT+CIPSEND=0," + String(postRequest.length());
sendCommandToESP8266(cipSend, 4, ">");
sendData(postRequest);
readESP8266(8000);
sendCommandToESP8266("AT+CIPCLOSE=0", 5, "OK");
}
void sendCommandToESP8266(String command, int maxTime, char readReplay[]) {
Serial.print(countTrueCommand);
Serial.print(". at command => ");
Serial.print(command);
Serial.print(" ");
while (countTimeCommand < (maxTime * 1))
{
esp8266.println(command);
if (esp8266.find(readReplay))
{
found = true;
break;
}
countTimeCommand++;
}
if (found == true)
{
Serial.println("Success");
countTrueCommand++;
countTimeCommand = 0;
}
if (found == false)
{
Serial.println("Fail");
countTrueCommand = 0;
countTimeCommand = 0;
}
found = false;
}
void sendData(String postRequest) {
Serial.println(postRequest);
esp8266.println(postRequest);
delay(1500);
countTrueCommand++;
}
void readESP8266(const int timeout)
{
String reponse = "";
long int time = millis();
while( (time+timeout) > millis())
{
while(esp8266.available())
{
reponse+=esp8266.readString();
}
}
Serial.print(reponse);
}
Выход:
Success
1. at command => AT+CWMODE=1 Success
2. at command => AT+CWJAP="xyz","xys" Success
3. at command => AT+CIPMUX=1 Success
4. at command => AT+CIPSTART=0,"TCP","192.168.0.156",8080 Success
5. at command => AT+CIPSEND=0,56 Success
GET /test HTTP/1.1
Host: 192.168.0.156
Accept: */*
busy s...
Recv 56 bytes
SEND OK
+IPD,0,141:HTTP/1.7. at command => AT+CIPCLOSE=0 Success
@Rajesh, 👍1
Обсуждение1 ответ
Наконец, запрос HTTP Get с помощью Arduino Uno + ESP8266 Wifi shield, который работает, приведен ниже:
// Это демонстрационный пример использования общедоступного http-сервера для тестирования запросов GET и POST
#include <Arduino.h>
#include <LiteESP8266Client.h>
#define PACKET_MTU 1500 // Стандартный сетевой MTU составляет 1500 байт
LiteESP8266 radio;
const char ssid[] PROGMEM = "xyz"; //измените его на свой пароль Wi-Fi SSID
const char password[] PROGMEM = "abc"; //измените его на свой пароль Wi-Fi
const char host[] PROGMEM = "192.168.0.156";
const int port = 8080;
const char http_get_request[] PROGMEM = "GET /test HTTP/1.1\r\n";
const char http_useragent[] PROGMEM = "User-Agent: Arduino-stm32/0.1\r\n";
const char http_content_type_json[] PROGMEM = "Content-Type: application/json\r\n";
const char http_host[] PROGMEM = "Host: 192.168.0.156\r\n";
const char http_close_connection[] PROGMEM = "Connection: close\r\n\r\n";
const char http_content_length_header[] PROGMEM = "Content-Length: ";
const char success[] PROGMEM = "success";
const char failed[] PROGMEM = "failed";
const char CRLF[] PROGMEM = "\r\n";
const char error_data_null[] PROGMEM = "Error: data came back null.";
void setupStationMode() {
Serial.print("Setup station mode... ");
if (radio.set_station_mode()) {
Serial.println("success");
} else {
Serial.println("failed");
}
}
void joinAP() {
Serial.print("Join AP ");
Serial.print(ssid);
Serial.print("... ");
if (radio.connect_to_ap(ssid, password)) {
Serial.println("Success");
} else {
Serial.println("Failed");
}
}
void establishTcpConnect() {
Serial.print("Establish TCP Connection... ");
if (radio.connect_progmem(host, port)) {
Serial.println( "Success");
} else {
Serial.println( "Failed");
}
}
void getHttpPacket() {
char *data;
while ((data = radio.get_response_packet(PACKET_MTU, 5000))) {
if (data) {
Serial.println("Packet Received...");
Serial.println(data);
} else {
Serial.println(error_data_null);
}
}
free(data);
}
void httpGet() {
Serial.println("Sending GET request... ");
radio.send_progmem(http_get_request);
radio.send_progmem(http_useragent);
radio.send_progmem(http_host);
radio.send_progmem(http_close_connection);
}
void setup() {
delay(2000);
radio.begin(9600,2,3);
Serial.begin(9600);
while (!Serial) {};
setupStationMode();
joinAP();
}
void loop() {
establishTcpConnect();
httpGet();
getHttpPacket();
}
Вывод:
Setup station mode... success
Join AP ⸮... Success
Establish TCP Connection... Success
Sending GET request...
Packet Received...
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 27
Date: Fri, 07 Aug 2020 13:04:03 GMT
Connection: close
Greetings from Spring Boot!
Но одна проблема, с которой я сталкиваюсь, заключается в том, что после нескольких вызовов вызов HTTP останавливается, вероятно, память заполняется. Проверю это.
Если вы запустите[example](https://github.com/e-tinkers/LiteESP8266Client/blob/master/examples/webclient/webclient.ino) на httpbin.org испытательный полигон, вы сталкиваетесь с той же проблемой?, @hcheung
Кстати, не публикуйте свою новую проблему как "ответ", поскольку ваш код отличается и полностью отличается от вашего исходного вопроса, вы должны опубликовать его как новый вопрос., @hcheung
Проблема может исходить с вашего сервера по адресу "192.168.0.156/test", поэтому вам следует запустить свой скетч на httpbin.org сервер, чтобы проблема не была вызвана этим скетчем клиента в первую очередь., @hcheung
Опубликовал новый вопрос: https://arduinoprosto.ru/q/77353/arduino-esp8266-wifi-shield-get-request-with-liteesp8266client-stops-after-few-h . Хотя вывод 192.168.0.156/теста довольно мал, @Rajesh
@hcheung попробовал использовать другой сервер REST, как было предложено, и наблюдается та же проблема:, @Rajesh
У меня есть обновленный ответ здесь: https://arduinoprosto.ru/q/77353/arduino-esp8266-wifi-shield-get-request-with-liteesp8266client-stops-after-few-h, @Rajesh
- AT-команда не отвечает на последовательный монитор
- Отправка данных Arduino в MySQL с помощью phpMyAdmin и XAMPP на Windows10
- Arduino выводит значения мусора на serial monitor с ESP8266
- ошибка: espcomm_upload_mem failed при загрузке скетча
- фатальная ошибка ESP8266WiFi.h: Такого файла или каталога нет
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- Захват изображений с OV7670 (без FIFO) с использованием Arduino Uno?
+IPD,0,141
означает, что из ответа возвращается 141 байт данных, ваш код просто закрывается слишком рано без чтения и разбора данных., @hcheungНо я уже добавил задержку в 8 секунд, должен ли я добавить еще задержку?? readESP8266(8000); Если вы можете предоставить какой-либо код, который будет полезен, @Rajesh
Речь идет не о задержке (на самом деле 8 секунд-это слишком долго), а о продолжении чтения данных, извините, у меня нет времени писать код для вас, но вы можете прочитать один из моих советов.[library](https://github.com/e-tinkers/LiteESP8266Client/blob/master/src/LiteESP8266Client.cpp#L703-L758) на чтение и анализ ответа., @hcheung
@hcheung Спасибо за вашу помощь, я смог выполнить HTTP GET запрос с помощью LiteESP8266Client.h, но 1 проблема, с которой я столкнулся, заключается в том, что после нескольких вызовов, вероятно, память Arduino заполняется, любая идея, как мы можем это исправить, @Rajesh