NodeMCU (ESP8266) Определение статического IP, останавливает обработку Firebase

Здравствуйте, я новичок в NodeMCU (ESP8266). Я создаю небольшую программу для подключения к WIFI (с Интернетом), и если Интернет недоступен, я хочу обработать запрос по IP-адресу.

Я использую firebase в качестве базы данных/сервера для получения статуса. И обработайте команду через URL-адрес, например http://192.168.1.223/on?pin=04, если Интернет подключен, то нет проблема: я могу обновить запись в firebase, но с тем же сетевым (LAN) соединением через Wi-Fi, которое я хочу обработать, мне нужен статический IP-адрес. Но проблема в том, что я не могу сделать этот IP-адрес статическим, и если я сделаю его статическим, мой NodeMCU не сможет подключиться к Firebase.

Вот как выглядит мой код:

#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#include <ESP8266WebServer.h>

#define FIREBASE_HOST "pushst-56f2c.firebaseio.com"
#define FIREBASE_AUTH "mhBpzrNyhhwEGwmFxkVFTIEylwrXMw0gm"
#define PATH "/clients/devicename/watermotor"

IPAddress ip(192, 168, 1, 223);  //Статический IP-адрес узла
IPAddress dns(192, 168, 1, 223);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

char ssid[] = "MyNetwork";   
char password[] = "Qwert98!!"; 

int wifiStatus = WL_IDLE_STATUS;

ESP8266WebServer server(80);

void setup() { 
      Serial.begin(115200); 

      delay(100);
      Serial.println();
      Serial.println();
      Serial.print("Your are connecting to;");
      Serial.println(ssid);

      WiFi.begin(ssid, password);
      WiFi.config(ip, dns, gateway, subnet);


      while (WiFi.status() != WL_CONNECTED) {
        digitalWrite(WIFI_CONNECT_LED, HIGH);
        delay(500);
        Serial.print(".");
      }

      wifiStatus = WiFi.status();

      if(wifiStatus == WL_CONNECTED){
          digitalWrite(WIFI_CONNECT_LED, LOW);

         Serial.println("Your IP address is: ");
         Serial.println(WiFi.localIP());  

         Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
         Firebase.set("/clients/devicename/watermotor/name", "Motor");
         Firebase.set("/clients/devicename/watermotor/relay_status", "off");
         Firebase.set("/clients/devicename/watermotor/device_status", "online");
         Firebase.stream(PATH);

         server.on("/on", handleOnRequest); // Ассоциируем функцию-обработчик
         server.on("/off", handleOffRequest); // Ассоциируем функцию-обработчик

         server.begin(); //Запускаем сервер
      }
      else{
        Serial.println("");
        Serial.println("WiFi not connected");
      }

}


void loop() { 
    server.handleClient();
    if (Firebase.failed()) {
      Serial.println("streaming error");
      Serial.println(Firebase.error());
      delay(1000);
      return;
    }

    if (Firebase.available()) {
        Serial.println();
        Serial.print("Firebase available");
        Serial.println();
        FirebaseObject event = Firebase.readEvent();
    }
}

Я не уверен, что это какая-то проблема с FirebaseLibrary или это просто ESP8266!

Любые предложения будут полезны, заранее спасибо! :)

, 👍0

Обсуждение

почему один и тот же IP для esp8266 и DNS?, @Juraj

Это просто для справки, я могу оставить любой @Juraj, @user3201500

это должен быть адрес DNS-сервера, который может разрешать имя хоста firebase, @Juraj

Не приводите @Juraj никакого примера?, @user3201500

пример? просто введите IP-адрес DNS-сервера, который обычно является адресом IP-адреса маршрутизатора/шлюза dns(192,168,1,1); (если это правильно), @Juraj

[Не переписываться.] (https://meta.stackexchange.com/q/64068) Вы уже [спрашивали об этом на SO] (https://stackoverflow.com/q/48928607)., @gre_gor

Хорошо, я пытаюсь @Juraj, @user3201500

Эй, приятель, все готово! Это помогло! @Юрай, @user3201500

Предложение, которое вы дали, заставило его работать! :) Большое спасибо. Я думаю, вы должны опубликовать это как ответ. Я буду рад проголосовать за это., @user3201500


2 ответа


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

0

У вас неверный IP-адрес DNS-сервера. В вашем скетче это то же самое, что и статический IP-адрес, который вы назначаете для esp. Тогда имя хоста firebase не может быть разрешено DNS.

DNS-сервер обычно является маршрутизатором/шлюзом.

IPAddress dns(192,168,1,1)
,

0

Я также поставил ту же проблему (если я установил статический IP-адрес, это означает, что он не подключается к Интернету). Но затем я добавил DNS «IP-адрес dns (192,168,1,1)», для этого он также не подключался к Интернету. . Но я подключился к Интернету после добавления "IPAddress dns(8,8,8,8)".

Это мой код

#include <ESP8266WiFi.h>
const char* ssid = "Varaprasad";
const char* password = "varara";
int red = D6; int green = D7; int blue = D8;
const char* host = "18.221.215.201"; 
IPAddress staticIP(192,168,1,78);
IPAddress gateway(192,168,1,254);
IPAddress dns(8, 8, 8, 8);
IPAddress subnet(255,255,255,0);
void setup()

{
 pinMode(red,OUTPUT); pinMode(green,OUTPUT); pinMode(blue,OUTPUT);
Serial.begin(9600);
Serial.println();
Serial.printf("Connecting to %s\n", ssid);
WiFi.begin(ssid, password);
WiFi.config(staticIP,dns, gateway, subnet);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
  if(WiFi.status() == WL_CONNECTED){
  WiFiClient client1;
    if (client1.connect(host,80))
      {
         client1.stop();
      analogWrite(red,0); analogWrite(green,1023); analogWrite(blue,0);
      }
      else{
      analogWrite(red,1023); analogWrite(green,0); analogWrite(blue,0);
      client1.stop();
      }
    }
  }
,