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 не регистрируется на моем сайте.

, 👍2

Обсуждение

`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


1 ответ


1

По моему опыту, сообщение "занято" появляется, когда вы пытаетесь запустить новую команду AT или отправить данные до того, как ESP8266 будет готов. Вы говорите, что выполняете этот тест с помощью команд в "сценарии", что наводит меня на мысль об отсутствии существенной задержки между строками.

Вам следует либо подождать между командами, пока EXP8266 не ответит (обычно "ОК" или">"), либо добавить задержку в несколько секунд между командами.

,

Нет, я сказал: "Я сократил его [свой код] до сценария, который передает запросы последовательного монитора" - команды AT поступают с последовательного монитора, и предыдущие команды были выполнены до отправки запроса GET. Однако я вышел за рамки этого и теперь получаю плохие ответы на запросы. Пожалуйста, посмотрите правку к моему вопросу., @garrettlynchirl