ESP8266HTTPClient конфликтует с другими библиотеками?
Я могу успешно отправить запрос GET с библиотекой ESP8266HTTPClient в первом скетче. Однако точно такой же код не будет работать при использовании во втором скетче, который сложнее и использует также другие библиотеки. Я не уверен, почему, может быть, конфликт между библиотеками?
Скетч 1 (рабочий)
#define DEBUG
#ifdef DEBUG
#define SB(...) Serial.begin(__VA_ARGS__)
#define SP(...) Serial.print(__VA_ARGS__)
#define SPL(...) Serial.println(__VA_ARGS__)
#else
#define SB(...)
#define SP(...)
#define SPL(...)
#endif
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
const char* ssid = "TALKTALK-17409C";
const char* password = "HPHRKJYX";
void setup() {
SB(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
SPL("Waiting to connect…");
}
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("http://francescosoave.com/blind/getTime.php?pw=ciao");
int httpCode = http.GET();
SP("HTTP: ");
SPL(httpCode);
if(httpCode > 0){
String payload = http.getString();
SP("PAYLOAD: ");
SPL(payload);
}
http.end();
}
}
void loop() {}
Ответ скетча 1 в последовательном мониторе (Инструменты -> Порт отладки -> Последовательный // Инструменты -> Уровень отладки -> HTTP_CLIENT)
SDK:2.2.1(cfd48f3)/Core:2.4.1/lwIP:2.0.3(STABLE-2_0_3_RELEASE/glue:arduino-2.4.1)
scandone
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 3
cnt
Waiting to connect…
connected with TALKTALK-17409C, channel 10
dhcp client start...
Waiting to connect…
ip:192.168.1.4,mask:255.255.255.0,gw:192.168.1.1
Waiting to connect…
[HTTP-Client][begin] url: http://francescosoave.com/blind/getTime.php?pw=ciao
[HTTP-Client][begin] host: francescosoave.com port: 80 url: /blind/getTime.php?pw=ciao
[HTTP-Client] connected to francescosoave.com:80
[HTTP-Client] sending request header
-----
GET /blind/getTime.php?pw=ciao HTTP/1.1
Host: francescosoave.com
User-Agent: ESP8266HTTPClient
Connection: close
Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0
-----
[HTTP-Client][handleHeaderResponse] RX: 'HTTP/1.1 200 OK'
[HTTP-Client][handleHeaderResponse] RX: 'Server: nginx'
[HTTP-Client][handleHeaderResponse] RX: 'Date: Wed, 08 Aug 2018 21:24:46 GMT'
[HTTP-Client][handleHeaderResponse] RX: 'Content-Type: text/html; charset=UTF-8'
[HTTP-Client][handleHeaderResponse] RX: 'Transfer-Encoding: chunked'
[HTTP-Client][handleHeaderResponse] RX: 'Connection: close'
[HTTP-Client][handleHeaderResponse] RX: 'Vary: Accept-Encoding'
[HTTP-Client][handleHeaderResponse] RX: 'X-Powered-By: PHP/5.6.32'
[HTTP-Client][handleHeaderResponse] RX: 'Vary: Accept-Encoding'
[HTTP-Client][handleHeaderResponse] RX: 'Access-Control-Allow-Origin: *'
[HTTP-Client][handleHeaderResponse] RX: ''
[HTTP-Client][handleHeaderResponse] code: 200
[HTTP-Client][handleHeaderResponse] Transfer-Encoding: chunked
HTTP: 200
[HTTP-Client] read chunk len: 11
[HTTP-Client][writeToStreamDataBlock] connection closed or file end (written: 11).
[HTTP-Client] read chunk len: 0
[HTTP-Client][end] still data in buffer (2), clean up.
[HTTP-Client][end] tcp stop
PAYLOAD: TIME: 22:24
[HTTP-Client][end] tcp is closed
pm open,type:2 0
Скетч 2 (не работает)
#define DEBUG
#ifdef DEBUG
#define SB(...) Serial.begin(__VA_ARGS__)
#define SP(...) Serial.print(__VA_ARGS__)
#define SPL(...) Serial.println(__VA_ARGS__)
#else
#define SB(...)
#define SP(...)
#define SPL(...)
#endif
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
const char* ssid = "TALKTALK-17409C";
const char* password = "HPHRKJYX";
ESP8266WebServer server(80); //создать экземпляр сервера на порту 80 (http-порт)
IPAddress ip(192, 168, 1, 7);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
String pageFinal = "";
byte curPos;
boolean timerState = true; //true = вкл, false = выкл
//int[] curTime = {0, 0}; // {час, минуты
// HTML-СТРАНИЦЫ
String page1="<!DOCTYPE html>"
"<html>"
"<head>"
"<meta charset='utf-8'/>"
"<meta name='viewport' content='width=device-width, initial-scale=1'>"
"<meta http-equiv='Content-Type' content='text/html;charset=UTF-8' />"
"<link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css' integrity='sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B' crossorigin='anonymous'>"
"<link rel='stylesheet' type='text/css' href='http://www.francescosoave.com/blind/style.css'>"
"<script src='https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js' type='text/javascript'></script>"
"<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/boots trap.min.js'></script>"
"</head>"
"<body>"
"<div class='container'>"
"<div class='row'>"
"<table class='table' id='radioForm'>"
"<thead>"
"<tr><th>Fran's Blind</th></tr>"
"</thead>"
"<tbody>"
"<tr><td align='center'>"
"<form action='/' method='get' id='manualForm'>"
"<input id='1' type='submit' class='btn btn-primary' name='manualBtn' value='1' />"
"</td></tr>"
"<tr><td align='center'>"
"<input id='2' type='submit' class='btn btn-primary' name='manualBtn' value='2' />"
"</td></tr>"
"<tr><td align='center'>"
"<input id='3' type='submit' class='btn btn-primary' name='manualBtn' value='3' />"
"</td></tr>"
"<tr><td align='center'>"
"<input id='4' type='submit' class='btn btn-primary' name='manualBtn' value='4' />"
"</td></tr>"
"<tr><td align='center'>"
"<input id='5' type='submit' class='btn btn-primary' name='manualBtn' value='5' />"
"</td></tr>"
"<tr><td align='center'>"
"<input id='6' type='submit' class='btn btn-primary' name='manualBtn' value='6' />"
"</td></tr>"
"<tr><td align='center'>"
"<input id='7' type='submit' class='btn btn-primary' name='manualBtn' value='7' />"
"</form>"
"</td></tr>"
"<tr><td align='center'><form action='/' method='get'>"
"<input id='timer' name='timerBtn' value='' class='' type='submit'></form><p>Timer is <span id='timerMsg'></span></p>"
"</td></tr>"
"</tbody>"
"</table>"
"</div>"
"</div>"
"</body>"
"<script>"
"$( document ).ready(function() {"
"setInterval(function(){"
"$('#timerMsg').fadeOut(function () {"
"$(this).fadeIn();"
"});"
"} ,1000);";
// страница2 / страница2_5 изменить кнопку таймера
// страница 3/ страница3_5 кнопка изменения текущей позиции
String page2 = "$('#timer').attr({'class': 'btn btn-danger', value: 'TURN OFF'});$('#timerMsg').html('on');});";
String page2_5 = "$('#timer').attr({'class': 'btn btn-success', value: 'TURN ON'});$('#timerMsg').html('off');});";
String page3 = "$('#";
String page3_5 = "').attr({'class': 'btn btn-warning'});";
String page4 = "</script></html>";
void setup(void){
WiFi.config(ip, gateway, subnet);
delay(1000);
SB(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
SPL("Waiting to connect…");
}
SP("IP address: ");
SPL(WiFi.localIP());
//вот тот же GET-запрос, что и в Sketch 1, но здесь он не работает
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("http://francescosoave.com/blind/getTime.php?pw=ciao");
int httpCode = http.GET();
SP("HTTP: ");
SPL(httpCode);
if(httpCode > 0){
String payload = http.getString();
SP("PAYLOAD: ");
SPL(payload);
}
http.end();
}
server.on("/", control);
server.begin();
SPL("Server listening");
}
int i = 0;
void loop(void){
server.handleClient();
}
void control(){
if(server.args() > 0){ //есть что-то, что нужно изменить
if(server.argName(0) == "timerBtn"){
timerState = !timerState; //изменить таймер
}else if(server.argName(0) == "manualBtn"){
curPos = server.arg(0).toInt(); //изменить текущий (вручную)
}
}
//создать страницу
if(timerState)
pageFinal = page1 + page2;
else
pageFinal = page1 + page2_5;
pageFinal += page3 + curPos + page3_5 + page4;
server.send(200, "text/html", pageFinal);
}
Ответ на скетч 2 в последовательном мониторе (Инструменты -> Порт отладки -> Последовательный // Инструменты -> Уровень отладки -> HTTP_CLIENT)
SDK:2.2.1(cfd48f3)/Core:2.4.1/lwIP:2.0.3(STABLE-2_0_3_RELEASE/glue:arduino-2.4.1)
scandone
Waiting to connect…
IP address: 192.168.1.7
[HTTP-Client][begin] url: http://francescosoave.com/blind/getTime.php?pw=ciao
[HTTP-Client][begin] host: francescosoave.com port: 80 url: /blind/getTime.php?pw=ciao
[HTTP-Client] failed connect to francescosoave.com:80
[HTTP-Client][returnError] error(-1): connection refused
HTTP: -1
[HTTP-Client][end] tcp is closed
Server listening
pm open,type:2 0
редактирование: проблема была в строке Wifi.config(). Должно быть WiFi.config(ip, gateway, subnet, gateway);
@SF1, 👍0
Обсуждение2 ответа
Лучший ответ:
Если вы хотите настроить статический IP-адрес, убедитесь, что он уникален в вашей локальной сети и находится за пределами диапазона, управляемого DHCP-сервером.
РЕДАКТИРОВАНИЕ: Функция WiFi.config() не назначает адрес шлюза в качестве адреса DNS. Добавьте 4-й параметр с адресом DNS-сервера.
WiFi.config(ip, gateway, subnet, gateway);
Привет, это действительно уникально в моей локальной сети, так как работает. Не знаете, как проверить "вне диапазона, управляемого DHCP-сервером"?, @SF1
ок, похоже, проблема в статическом IP. Если я его уберу, HTTP-запрос будет работать. Однако мне нужен статический IP. Есть идеи?, @SF1
это не работает, если вы не можете подключиться. находится ли точка доступа под вашим контролем? вы знаете диапазон IP-адресов DHCP? вы знаете, какие еще устройства со статическим IP-адресом есть в вашей сети? для начала попробуйте использовать IP-адрес, назначенный DHCP 192.168.1.4, @Juraj
извините, может я не ясно выразился. Итак: сейчас с DHCP (удаление строки WiFi.config()) все работает нормально: HTTP-запрос отправляется, а html-страница отображается по адресу 192.168.1.8. Если я укажу вместо этого статический IP, html-страница не будет работать, а HTTP-запрос вернет ошибку. НО для моего приложения мне нужен статический IP. Поэтому мне нужно найти решение, чтобы оба работали со статическим IP., @SF1
но статический адрес по вашему выбору 192.168.1.7 конфликтует. тогда используйте 192.168.1.8 как статический IP, если он работает как арендованный, он будет работать как статический. вы можете зарезервировать его на маршрутизаторе, @Juraj
попробовал, но проблема та же. Кажется, конфликт между WiFi и HTTPclient. Если я полностью удалю код HTTP-запроса, то все будет работать нормально и с 192.168.1.7, и с 192.168.1.8, @SF1
является ли маршрутизатор DNS-сервером по адресу 192.168.1.1? попробуйте напечатать адрес DNS-сервера, назначенный DHCP., @Juraj
извините, не знаю как это сделать. шлюз по умолчанию в моей локальной сети - 192.168.1.1, если вы об этом., @SF1
WiFi.dnsIP();
, @Juraj
с DHCP это 192.168.1.1. Если я оставлю WiFi.config() вместо этого, WiFi.dnsIP() выведет 0.0.0.0, @SF1
WiFi.config(ip, шлюз, подсеть, шлюз);
, @Juraj
работает!! понятия не имел об этом. не могли бы вы объяснить? спасибо!!!, @SF1
4-й параметр — DNS-сервер. Ваш URL-адрес содержит имя хоста, которое должно быть разрешено DNS., @Juraj
Закомментируйте строку WiFi.config() во втором примере. Вероятно, вы неправильно настраиваете свой ESP. Позвольте ему получить конфигурацию от своего DHCP-сервера.
Привет, к сожалению, мне нужен статический IP-адрес. Однако эта часть работает нормально. Похоже, где-то есть конфликт., @SF1
Привет, к сожалению, мне нужен статический IP-адрес. И, похоже, в этом проблема. Если я удалю строку, HTTP-запрос будет работать. Но мне нужен статический IP. Есть решение? Спасибо!, @SF1
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- ESP8266 Ошибка неверного запроса 400
- ESP8266 отправляет веб-страницу клиенту, но html-коды отображаются в браузере вместо веб-страницы
- Проанализировать большой ответ json с помощью ESP8266
- ESP8266 не отвечает через случайные промежутки времени
- Код запроса ESP8266 GET -1
- esp32 http client response только 200 не получил данные после этого
Скорее всего, именно эта безумная строка, которую вы создаете, и является причиной ваших проблем., @Majenko
эта часть работает хорошо... вы можете попробовать ее, так как это полный код..., @SF1
Побалуйте меня и замените эту струну чем-нибудь крошечным. Посмотрите, какой будет эффект. Я не за своим столом, чтобы попробовать это самому., @Majenko