Ответ от 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 рассказал мне об этом и помог с некоторыми статьями, я наконец смог продолжить свой проект.
@Ricardo Godoz, 👍0
Обсуждение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
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как отправить HTTP-post данные в Node Express API с Arduino esp822 6?
- Запрос POST (HTTPClient) с ESP8266, не работающим на локальном хосте (код http = -1)
- ESP8266 HTTPS post запрос тела сообщения с WifiClientSecure
- ошибка 404 в запросе HTTP GET с Arduino Uno и ESP8266 с использованием AT-команд
- Как защитить ссылку/URL-адрес формы ESP-12E для управления светодиодом
- AT-команда не отвечает на последовательный монитор
- Отправка данных Arduino в MySQL с помощью phpMyAdmin и XAMPP на Windows10
попробуйте использовать метод GET вместо POST, @jsotola
Эта переменная с именем «data» является содержимым POST, @Ricardo Godoz
Попробуйте опубликовать *весь* свой код, а не бессмысленный фрагмент., @Majenko
вы ожидаете, что после прочтения строки, первый символ следующей строки будет немедленно доступен, @Juraj
Почему вы используете Uno? Почему бы просто не запрограммировать ESP8266 напрямую (используя Arduino IDE и язык), это намного быстрее и вам не нужно отправлять все через последовательный порт., @Code Gorilla
@CodeGorilla Как именно я могу это сделать? У вас есть какая-нибудь статья, на которую вы можете мне указать?, @Ricardo Godoz
Смотрите мой ответ ниже, @Code Gorilla