Ответ от ESP8266 возвращает неизвестные символы

Я работаю над проектом с Arduino UNO, которому необходимо подключение к облачному серверу, поэтому я использую модуль ESP8266.

Я уже подключаюсь к Wi-Fi и делаю запросы GET и POST, но моя проблема заключается в получении ответа на эти запросы.

Вот мой код:

/* Doing all these steps to make the request
AT+RST
AT+CWMODE=1
AT+CWJAP="MyNetwork","MyPassword"
AT+CIPMUX=1
AT+CIPSTART=0,"TCP","myserver.com.br",80
AT+CIPSEND=0,270
*/

String data = "data=example";

String command = "POST /webservice/v1/dispositivo/atualizar_data_requisicao HTTP/1.1\r\n";
comando += "Host: " + SERVER + "\r\n";
comando += "User-Agent: Arduino/1.0\r\n";
comando += "Connection: Close\r\n";
comando += "Content-Type: application/x-www-form-urlencoded;\r\n";
comando += "Content-Length: " + String(data.length()) + "\r\n\r\n";
comando += data;

esp8266.println(command);

delay(2000);

String response;

while(esp8266.available()) {
  response += esp8266.readStringUntil('\r');
}

Serial.print("Request response: ");
Serial.println(response);

Когда я запускаю этот код, единственный ответ, который я могу получить, это что-то вроде:

Recv 270 bxt⸮⸮C⸮
SEND OK

+IPD,0.569:HTTP/1.0 200 OK

Но я ожидал JSON.

Может ли кто-нибудь сказать мне, что я делаю не так и как это исправить?


Редактировать.

Хорошо, после того, как Code Gorilla помог мне (огромное спасибо) и провел много исследований, я запрограммировал Arduino UNO на отправку некоторых команд, которые я придумал, на последовательный порт и запрограммировал ESP8266 на чтение последовательного порта и, в зависимости от прочитанной команды, выполнение запросов и т. д.

ESP8266 намного проще в выполнении запросов и имеет множество других возможностей, таких как HTTPS-запросы, которые невозможно реализовать с помощью AT-команд.

Когда я создавал этот вопрос, я не знал, что могу программировать напрямую в ESP8266, но когда Code Gorilla рассказал мне об этом и помог с некоторыми статьями, я наконец смог продолжить свой проект.

, 👍0

Обсуждение

попробуйте использовать метод GET вместо POST, @jsotola

Эта переменная с именем «data» является содержимым POST, @Ricardo Godoz

Попробуйте опубликовать *весь* свой код, а не бессмысленный фрагмент., @Majenko

вы ожидаете, что после прочтения строки, первый символ следующей строки будет немедленно доступен, @Juraj

Почему вы используете Uno? Почему бы просто не запрограммировать ESP8266 напрямую (используя Arduino IDE и язык), это намного быстрее и вам не нужно отправлять все через последовательный порт., @Code Gorilla

@CodeGorilla Как именно я могу это сделать? У вас есть какая-нибудь статья, на которую вы можете мне указать?, @Ricardo Godoz

Смотрите мой ответ ниже, @Code Gorilla


1 ответ


Лучший ответ:

1
String command = "POST /webservice/v1/dispositivo/atualizar_data_requisicao HTTP/1.1\r\n";
comando += "Host: " + SERVER + "\r\n";
...
esp8266.println(command);

Я подозреваю, что это просто опечатка, потому что это не должно компилироваться. Но вы добавляете все заголовки HTTP в commando, а не в command.

Обычно ? означает, что символ непечатаем. Поэтому, чтобы помочь диагностировать проблему, отобразите целочисленное значение для каждого возвращаемого символа. Что-то НАПРИМЕР такому (я никогда раньше не использовал String, поэтому length() может быть неправильным)

Serial.print("Request response: ");
Serial.println(response);
for (int index = 0; index < response.length(); ++index)
{
   Serial.print (response[index]);
   Serial.print (" ");
}

Если вы хотите запрограммировать ESP напрямую, то взгляните на эти руководства, они должны дать вам общее представление. Обычно это так же просто, как программирование UNO после настройки.

https://learn.adafruit.com/adafruit-huzzah-esp8266-breakout/using-arduino-ide https://www.hackster.io/harshmangukiya/how-to-program-esp8266-with-arduino-uno-efb05f

,