Не удается прочитать 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

, 👍1

Обсуждение

+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


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