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);

, 👍0

Обсуждение

Скорее всего, именно эта безумная строка, которую вы создаете, и является причиной ваших проблем., @Majenko

эта часть работает хорошо... вы можете попробовать ее, так как это полный код..., @SF1

Побалуйте меня и замените эту струну чем-нибудь крошечным. Посмотрите, какой будет эффект. Я не за своим столом, чтобы попробовать это самому., @Majenko


1 ответ


Лучший ответ:

1

Если вы хотите настроить статический 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