Получить данные с сайта с помощью ESP8266 с помощью AT-команд
Я пытаюсь получить данные с сайта, отправив HTTP-запрос GET через AT-команды для ESP8266. Вот мой текущий код:
#include <SoftwareSerial.h>
const byte rxPin = 2;
const byte txPin = 3;
SoftwareSerial ESP8266 (rxPin, txPin);
void setup() {
Serial.begin(9600);
ESP8266.begin(9600);
delay(2000);
}
void printResponse() {
while (ESP8266.available()) {
Serial.println(ESP8266.readStringUntil('\n'));
}
}
void loop() {
ESP8266.println("AT+CIPMUX=1");
delay(1000);
printResponse();
ESP8266.println("AT+CIPSTART=4,\"TCP\",\"192.168.1.19\",80");
delay(1000);
printResponse();
String cmd = "GET /test.html HTTP/1.1";
ESP8266.println("AT+CIPSEND=4," + String(cmd.length() + 4));
delay(1000);
ESP8266.println(cmd);
delay(1000);
ESP8266.println();
delay(1000);
printResponse();
delay(5000);
}
Выполняя этот код, я получаю следующий ответ:
AT+CIPMUX=1
OK
AT+CIPSTART=4,"TCP","192.168.1.19",80
4,CONNECT
OK
AT+CIPSEND=4,27
OK
>
Recv 27 bytes
SEND OK
+IPD,4,
Похоже, ответ получен, но ничего не напечатано.
Я попытался сделать то же самое, отправив AT-команды вручную, используя этот код:
#include <SoftwareSerial.h>
const byte rxPin = 2;
const byte txPin = 3;
SoftwareSerial ESP8266 (rxPin, txPin);
void setup() {
Serial.begin(9600);
ESP8266.begin(9600);
}
void loop() {
if (ESP8266.available()) {
Serial.write(ESP8266.read());
}
if (Serial.available()) {
ESP8266.write(Serial.read());
}
}
При таком подходе я действительно получаю ответ:
AT+CIPMUX=1
OK
AT+CIPSTART=4,"TCP","192.168.1.19",80
4,CONNECT
OK
AT+CIPSEND=4,27
OK
>
Recv 27 bytes
SEND OK
+IPD,4,275:HTTP/1.1 200 OK
Date: Thu, 22 Dec 2016 20:20:47 GMT
Server: Apache/2.4.23 (Win64) PHP/5.6.25
Last-Modified: Thu, 22 Dec 2016 19:37:22 GMT
ETag: "13-5444465f69339"
Accept-Ranges: bytes
Content-Length: 19
Connection: close
Content-Type: text/html
THIS IS MY WEBSITE!4,CLOSED
Кто-нибудь знает, что происходит и как заставить это работать с моим кодом Arduino?
Другие способы получения данных с веб-сайта также приветствуются.
@Henrik, 👍7
Обсуждение2 ответа
Лучший ответ:
▲ 1
Как указано в первом комментарии, моя функция printResponse()
работала неправильно при ожидании ответа от веб-сайта. Я изменил свой код на следующий, и теперь он работает каждый раз.
#include <SoftwareSerial.h>
const byte rxPin = 2;
const byte txPin = 3;
SoftwareSerial ESP8266 (rxPin, txPin);
unsigned long lastTimeMillis = 0;
void setup() {
Serial.begin(9600);
ESP8266.begin(9600);
delay(2000);
}
void printResponse() {
while (ESP8266.available()) {
Serial.println(ESP8266.readStringUntil('\n'));
}
}
void loop() {
if (millis() - lastTimeMillis > 30000) {
lastTimeMillis = millis();
ESP8266.println("AT+CIPMUX=1");
delay(1000);
printResponse();
ESP8266.println("AT+CIPSTART=4,\"TCP\",\"192.168.1.19\",80");
delay(1000);
printResponse();
String cmd = "GET /test.html HTTP/1.1";
ESP8266.println("AT+CIPSEND=4," + String(cmd.length() + 4));
delay(1000);
ESP8266.println(cmd);
delay(1000);
ESP8266.println("");
}
if (ESP8266.available()) {
Serial.write(ESP8266.read());
}
}
,
@Henrik
▲ 0
Слегка измененный код. С добавлением более корректного запроса
#include <SoftwareSerial.h>
const byte rxPin = 2;
const byte txPin = 3;
SoftwareSerial ESP8266 (rxPin, txPin);
unsigned long lastTimeMillis = 0;
void setup() {
Serial.begin(9600);
ESP8266.begin(9600);
delay(2000);
}
void printResponse() {
while (ESP8266.available()) {
Serial.println(ESP8266.readStringUntil('\n'));
}
}
void loop() {
if (millis() - lastTimeMillis < 3000) {
lastTimeMillis = millis();
ESP8266.println("AT+CIPMUX=1");
delay(1000);
printResponse();
ESP8266.println("AT+CIPSTART=4,\"TCP\",\"192.168.0.79\",80");
delay(1000);
printResponse();
String cmd = "GET / HTTP/1.1\r\nHost: 192.168.0.79\r\nConnection: close\r\n\r\n";
ESP8266.println("AT+CIPSEND=4," + String(cmd.length() + 4));
delay(1000);
ESP8266.println(cmd);
delay(1000);
ESP8266.println("");
}
if (ESP8266.available()) {
Serial.write(ESP8266.read());
}
}
,
@Александр Вохминцев
Смотрите также:
- AT-команда не отвечает на последовательный монитор
- Программное обеспечениеSerial с ESP8266
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Отправить строку данных из Arduino UNO в ESP8266-01
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Отправьте несколько значений из Arduino Uno в nodeMCU, используя последовательный порт.
- Повреждение данных SoftwareSerial - поиск предложений
- Программировать ESP8266, чтобы избежать случайных исключений?
Это беспокоило меня в течение нескольких дней - это кажется простым! Поскольку у вас нет ответов на это, вот мое предложение: работает ли ваша функция
printResponse()
должным образом? Он полагается на все данные, доступные в данный момент времени (более или менее), и на то, что они заканчиваются на\n
. Если это происходит понемногу, оно прекратится раньше. Если данные не заканчиваются на\n
, они никогда не закончатся., @Mark SmithЯ изучаю команды esp и at, и я не могу понять запрос на получение cipsend, интересно, это из-за длины данных, я видел u summd 4 в конце длины, это из-за \r\n, или почему это? Благодарность, @Rodolfo Albuquerque
@RodolfoAlbuquerque Да, насколько я помню, дополнительные 4 байта предназначены для «\ r\n»., @Henrik
эй, я пробую ваш код, но я получаю весь html-файл css, а не основной., @Pawan Behera