CIPSEND to ESP8266 возвращает байты, но не содержимое
Я пытаюсь отправить запрос GET от Arduino Uno, подключенного к ESP8266 через SoftwareSerial. Я не могу заставить его работать непосредственно в коде, поэтому я разделил его до скрипта, который передает запросы последовательного монитора следующим образом:
#include <SoftwareSerial.h>
const byte rxPin = 2;
const byte txPin = 3;
// Мы будем использовать программный последовательный интерфейс для подключения к ESP8266
SoftwareSerial esp8266 (rxPin, txPin);
void setup()
{
Serial.begin(115200);
esp8266.begin(115200);
delay(1000);
}
void loop()
{
if (esp8266.available()) Serial.write(esp8266.read());
if (Serial.available()) esp8266.write(Serial.read());
}
Я настраиваю и подключаю ESP8266 к своему маршрутизатору следующим образом с последовательного монитора:
AT+RST
AT+CWMODE=3
AT+CWJAP="rwifi name","wifi password"
AT+CIFSR
AT+CIPMUX=0
AT+CIPSTART="TCP","www.abcdefg.com",80
AT+CIPSEND=61
GET /in-progress/ab/i.php?c=20 HTTP/1.0 Host: www.abcdefg.com
Все работает нормально до тех пор, пока CIPSEND, часть запроса GET и последовательный монитор не выдадут следующее:
AT+CIPSEND=61
OK
> i.php?c=20 HTTP/1.0
busy s...
Recv 61 bytes
SEND OK
Я знаю, что существует ограничение в 64 байта для последовательного монитора. мой РЕЗУЛЬТАТ-61 байт. Я получаю байты обратно, но не контент со страницы (это должно быть слово "да") и даже не контент со страницы 404. Web side my php page-это счетчик, который добавляет 1 к числу в txt - файле-он не увеличивается (он работает, если я вызываю его из веб-браузера).
Где я ошибаюсь здесь с моим CIPSEND? Мне кажется, что он правильно сформирован.
-----редактировать-----
Основываясь на комментариях ниже, это последний запрос GET, который я пробовал:
AT+CIPSEND=73
GET /i.php HTTP/1.1\r\nHost: www.abcdefg.com\r\nConnection: close\r\n\r\n
Я сократил свой путь к php-файлу настолько, насколько это возможно, добавил возврат каретки и новые строки между запросом и каждым заголовком, добавил двойное возвращение каретки и новую строку в конце. Запрос теперь возвращает +IPD,919:HTTP/1.1 400 Неверный запрос
. Эта ошибка 400 не регистрируется на моем сайте.
@garrettlynchirl, 👍2
Обсуждение1 ответ
По моему опыту, сообщение "занято" появляется, когда вы пытаетесь запустить новую команду AT или отправить данные до того, как ESP8266 будет готов. Вы говорите, что выполняете этот тест с помощью команд в "сценарии", что наводит меня на мысль об отсутствии существенной задержки между строками.
Вам следует либо подождать между командами, пока EXP8266 не ответит (обычно "ОК" или">"), либо добавить задержку в несколько секунд между командами.
Нет, я сказал: "Я сократил его [свой код] до сценария, который передает запросы последовательного монитора" - команды AT поступают с последовательного монитора, и предыдущие команды были выполнены до отправки запроса GET. Однако я вышел за рамки этого и теперь получаю плохие ответы на запросы. Пожалуйста, посмотрите правку к моему вопросу., @garrettlynchirl
- AT-команда не отвечает на последовательный монитор
- Последовательная связь между ESP8266 и Arduino Uno
- Последовательная связь ESP8266 с ATMega328P
- ESP8266 12e Arduino IDE выводит мусорные значения на serial monitor
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Почему мы используем client.flush() в коде, когда мы подключаем Esp8266 к Интернету или серверу?
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- NodeMCU второй HARDWARE последовательный TX в качестве порта отладки
`GET /in-progress/ab/i.php?c=20 HTTP/1.0 Host: www.abcdefg.com-это не действительный запрос GER. Заголовки идут на отдельных строках, разделенных \r\n., @Majenko
Вам нужно завершить запрос GET с помощью правильного
\r\n
, а также http-заголовка. Таким образом, это должно бытьGET /in-progress/ab/i.php?c=20 HTTP/1.0\r\nHost: www.abcdefg.com\r\nConnection: закрыть\r\n\r\n
. У меня есть пример на моем [github](https://github.com/e-tinkers/LiteESP8266Client/blob/master/examples/webclient/webclient.ino) возможно, вы захотите взглянуть., @hcheung@garrettlynch, upvote за то, что вы представили правильный способ отладки проблемы подключения между arduino и ESP8266, @jsotola
@hcheung спасибо, я пробовал это с возвратом каретки и новыми строками, как было указано. Я получаю
+IPD,919:HTTP/1.0 400 Bad Request
- Интересно, это как-то связано сAT+CIPSEND=bytecount
Я посылаю. Я не совсем понимаю, о чем идет речь. В документации говорится, что это "длина данных, которые будут отправлены". Означает ли это только отправленный путь (т. е./in-progress/ab/i.php?c=20
) или он включает в себя все остальное в строкеGET /in-progress/ab/i.php?c=20 HTTP/1.0\r\n
? Я покопался в коде вашей библиотеки и, насколько я могу судить, вы считаете всю строку., @garrettlynchirlда, я посылал строку за строкой с несколькими командами "AT+CIPSEND", длина которых включена в " \r\n
. Ваш ESP8266 получил
400 Плохой запрос", возможно, это другие проблемы. Проверяете ли вы свой сервер/php-журнал, чтобы узнать, что именно получено и почему это плохой запрос?, @hcheungКстати, последний http-заголовок должен иметь двойной
\r\n\r\n
, который обычно является заголовком дляConnection: close\r\n\r\n
. Кроме того, убедитесь, что вы отправляете правильный заголовок "Host: hostname\r\n", я помню, что видел 400 перед тем, как вызвать неправильное имя хоста или пропустить http-заголовок., @hcheung@hcheung заголовок
Host: hostname\r\n
кажется специфичным для HTTP 1.1 из того, что я прочитал. Я пробовал использовать HTTP 1.0 также и без имени хоста, и я получаю ту же ошибку 400, так что я думаю, что могу исключить это как проблему. Да, мой последний заголовок использует двойное\r\n\r\n
. Я проверил журналы доступа к своим сайтам и журналы ошибок и нет никаких следов каких либо ошибок 400 или запросов на эту страницу `i.php-кроме тех трех, что я сделал сегодня из браузера, чтобы проверить, работает ли он., @garrettlynchirlвы не можете отправить двухстрочный или более строчный http-запрос с последовательного монитора. это невозможно. \r\n не преобразуются в концы строк. они отправляются как \ и r и \ и n, @Juraj
Да, как кто-то уже сказал, вы не можете отправить CRLF, введя их в последовательный монитор. Пусть вместо этого сам последовательный монитор добавит это для вас. Вы должны установить строку, заканчивающуюся внизу, на "Оба NL & CR", а затем отправлять свои HTTP-заголовки по одной строке за раз. Для каждого \r\n в вашем запросе вы нажимаете клавишу Enter, вводите следующую строку и так далее, пока запрос не будет завершен., @SoreDakeNoKoto