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!
Любые предложения будут полезны, заранее спасибо! :)
@user3201500, 👍0
Обсуждение2 ответа
Лучший ответ:
У вас неверный IP-адрес DNS-сервера. В вашем скетче это то же самое, что и статический IP-адрес, который вы назначаете для esp. Тогда имя хоста firebase не может быть разрешено DNS.
DNS-сервер обычно является маршрутизатором/шлюзом.
IPAddress dns(192,168,1,1)
Я также поставил ту же проблему (если я установил статический 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();
}
}
}
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Как изменить имя модуля ESP8266-12E по умолчанию
- Простой запрос GET с ESP8266HTTPClient
- В ESP-12E NodeMCU, какой выход PIN A0?
почему один и тот же 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