Проблема получения данных с интернет сервера с использованием Arduino Uno и ESP8266
Цель проекта – управлять реле через Интернет.
Я создал страницу php
, которая получает пост-данные от Arduino, а затем сохраняет значения, отправленные в базу данных mysql
(которая сейчас является статусом реле).
Теперь мне нужно получить данные с веб-страницы, которые содержат желаемый статус реле, поэтому я использовал этот код:
#include <SoftwareSerial.h>
String ssid ="ABC";
String password="a14102016a";
const byte rxPin = 6;
const byte txPin = 7;
SoftwareSerial ESP8266 (rxPin, txPin);
unsigned long lastTimeMillis = 0;
void setup() {
Serial.begin(115200);
ESP8266.begin(115200);
reset();
connectWifi();
delay(2000);
}
//сброс модуля esp8266
void reset() {
ESP8266.println("AT+RST");
delay(1000);
if(ESP8266.find("OK") ) Serial.println("Module Reset");
}
// подключаемся к вашей сети Wi-Fi
void connectWifi() {
String cmd = "AT+CWJAP=\"" +ssid+"\",\"" +password+ "\"";
ESP8266.println(cmd);
delay(4000);
if(ESP8266.find("OK")) {
Serial.println("Connected!");
}
else {
connectWifi();
Serial.println("Cannot connect to wifi"); }
}
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.161\",80");
delay(1000);
printResponse();
String cmd = "GET /ard/sensor.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());
}
}
Но ответ от сервера был
Module Reset
Connected!
AT+CIPMV⸮=1
OK
AT+CIPSTART=4,#TCP","192.068.1.161",80
4,CONOECT
OK
AZ⸮⸮R5NDOi⸮j
O⸮C⸮⸮
Qecv ⸮&⸮ѕ⸮5
SEND OK
+IPD,4,501:HTTP/1.0 400 Bad Repuest
Date: Mon, 02 Aps 04eci5e3iC: -
T- /<eql>hs>retrubh>4Pea8
m4,CLOSED
AT+CIPMTX=1
OK
AT+CIPSTART=4,"TCP","192.068.1.161",80
4,CONNDCT
OK
AR⸮⸮R5⸮DOi⸮j
O⸮C⸮⸮
Qecv 33 bytes
SEND OK
+IPD,4,501;HTTP/1.1 400 Bad Request
Date: Moo, 02 Apr 2:v2)1L
exr9OPEL<
B/h<eY esls/
A /eo/b
4,CLOSED
AT+CIPMUX=1
Иногда я получаю HTTP/1.0 400 Bad Repuest
а иногда и HTTP/1.0 501
Так что же тут не так и в чем причина странных символов в ответ? Как получить правильные данные с веб-страницы?
@ali_m, 👍1
Обсуждение1 ответ
▲ 1
Я прошил ESP8266 другой прошивкой, после чего он отлично заработал на скорости 9600 бод. Оригинальная прошивка вообще не реагировала на скорость 9600
,
@ali_m
Смотрите также:
- AT-команда не отвечает на последовательный монитор
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- Программное обеспечениеSerial с ESP8266
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Отправить строку данных из Arduino UNO в ESP8266-01
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Отправьте несколько значений из Arduino Uno в nodeMCU, используя последовательный порт.
- Повреждение данных SoftwareSerial - поиск предложений
действительный HTTP-запрос требует больше строки GET. вы должны отправить некоторые обязательные заголовки HTTP., @Juraj
Вы не можете использовать SoftwareSerial на такой высокой скорости передачи данных. Попробуйте 9600., @tttapa
Заголовки http должны заканчиваться двумя символами новой строки. Также вместо этого используйте HTTP 1.0, чтобы предотвратить постоянные соединения. Так что попробуйте
"GET /ard/sensor.html HTTP/1.0\r\n\r\n"
, @Gerben@Juraj [GET — единственный обязательный заголовок запроса для HTTP 1.0. В HTTP 1.1 также требуется хост.] (https://serverfault.com/questions/163511/what-is-the-mandatory-information-a-http-request-header-must-contain), @Gerben
@Juraj Спасибо .. Я изменил свой запрос на
String cmd ="GET /ard/sensor.html HTTP/1.1\r\nUser-Agent: curl/7.37.0\r\nHost: %s\r\ nПринять: */*\r\n\r\n"; ESP8266.println("AT+CIPSEND=4," + String(cmd.length()));
До сих пор нет четкого ответа, @ali_m