Здравствуйте хочу объединить работу по глобальной сети(mqtt) с локальной в виде веб странички(WebServer) на nodemcu(esp8266)
По отдельности я это реализовал но при попытке все это объединить во едино ничего хорошего не выходит я предполагаю что в дело в портах но не уверен в этом
Пожалуйста подскажите в чем моя ошибка или скиньте пример нормальной объеденный работы
для работы с mqtt я использовал стороннюю библиотеку PubSubClient
По отдельности я это реализовал но при попытке все это объединить во едино ничего хорошего не выходит я предполагаю что в дело в портах но не уверен в этом
Пожалуйста подскажите в чем моя ошибка или скиньте пример нормальной объеденный работы
для работы с mqtt я использовал стороннюю библиотеку PubSubClient
C++:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <PubSubClient.h> //работа с mqtt
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h> // Библиотека для OTA-прошивки f
///пины
#define PC_rest D1
#define PC D2
#define light_diode_D0 D0
// Настройки сети
#define ssid "Sheo" // настройки подключения к wifi
#define password "(SHEO)%9112"
#define mqtt_server "mqtt.by" //"mqtt.by" // mqtt брокер
#define mqtt_login "sheo" //"sheo"
#define mqtt_password "6pwqod1q" //"6pwqod1q"
#define mqtt_port 1883 //1883 // порт подключения к mqtt, у cloudmqtt порт отличный от 1883
#define mqtt_topic "/user/sheo/pc" // топик с которым будем работать
#define mqtt_topic_PC "/user/sheo/NodeMcu"
const char Imsg[10] = {'I', ' ', 'a', 'm', ' ', 'a', 'l', 'i', 'v', 'e',};
WiFiClient espClient;
PubSubClient client(espClient);
MDNSResponder mdns;
byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 80); //35
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
ESP8266WebServer server(80);
unsigned long lastMsg = 0;
// вызывается когда приходят данные от брокера
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic); // отправляем в монитор порта название топика
Serial.print("] ");
for (int i = 0; i < length; i++) { // отправляем данные из топика
Serial.print((char)payload[i]);
}
Serial.println();
// работаем с реле
if (payload[0] == '0') digitalWrite(PC, LOW);
else if (payload[0] == '1')
{
digitalWrite(PC, HIGH);
delay(1000); // ждем секунду
char msg[1] = {'0'};
digitalWrite(PC, LOW);
client.publish(mqtt_topic, msg);
}
else if (payload[0] == '3') digitalWrite(PC_rest, LOW);
else if (payload[0] == '4')
{
digitalWrite(PC_rest, HIGH);
delay(2000); // ждем секунду
char msg[1] = {'3'};
digitalWrite(PC_rest, LOW);
client.publish(mqtt_topic, msg);
}
}
//////////////
// подключение к wifi
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// // подключение к mqtt брокеру
void reconnect()
{
if (WiFi.status() != WL_CONNECTED)
setup_wifi();
while (!client.connected()) // крутимся пока не подключемся.
{
Serial.print("Attempting MQTT connection...");
// создаем случайный идентификатор клиента
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// подключаемся, в client.connect передаем ID, логин и пасс
if (client.connect(clientId.c_str(), mqtt_login, mqtt_password))
{
Serial.println("connected"); // если подключились
client.subscribe(mqtt_topic); // подписываемся на топик, в который же пишем данные
}
else
{ // иначе ругаемся в монитор порта
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void pc_state()
{
if (millis() - lastMsg >= 179500 )
{
lastMsg = millis();
client.subscribe(mqtt_topic_PC);
client.publish(mqtt_topic_PC, Imsg);
delay(50);
client.loop();
client.subscribe(mqtt_topic);
}
}
String webPage()
{
String web;
web += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/> <meta charset=\"utf-8\"><title>ESP 8266</title><style>button{color:red;padding: 10px 27px;}</style></head>";
web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">ESP8266 Web Server</h1><div>";
//++++++++++ LED-1 +++++++++++++
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----LED 1----</p>";
if (digitalRead(light_diode_D0) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket1On\"><button>ON</button></a> <a href=\"socket1Off\"><button>OFF</button></a></div>";
// ++++++++ LED-1 +++++++++++++
//++++++++++ LED-2 +++++++++++++
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----LED 2----</p>";
if (digitalRead(PC) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket2On\"><button>ON</button></a> <a href=\"socket2Off\"><button>OFF</button></a></div>";
// ++++++++ LED-2 +++++++++++++
//++++++++++ LED-3 +++++++++++++
web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----LED 3----</p>";
if (digitalRead(PC_rest) == 1)
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
}
else
{
web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
}
web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket3On\"><button>ON</button></a> <a href=\"socket3Off\"><button>OFF</button></a></div>";
// ++++++++ LED-2 +++++++++++++
// ========REFRESH=============
web += "<div style=\"text-align:center;margin-top: 20px;\"><a href=\"/\"><button style=\"width:158px;\">REFRESH</button></a></div>";
// ========REFRESH=============
web += "</div>";
return(web);
}
void setup() {
Serial.begin(115200);
pinMode(PC, OUTPUT);
digitalWrite(PC, LOW);
pinMode(PC_rest, OUTPUT);
digitalWrite(PC_rest, LOW);
pinMode(light_diode_D0, OUTPUT);
digitalWrite(light_diode_D0, LOW);
WiFi.mode(WIFI_STA);
setup_wifi(); // подключаемся к wifi
ArduinoOTA.setHostname("ESP8266-00001"); // Задаем имя сетевого порта
ArduinoOTA.begin(); // Инициализируем OTA
if (mdns.begin("esp8266", WiFi.localIP())) {
Serial.println("MDNS responder started");
}
//+++++++++++++++++++++++ START LED-1 ++++++++++++++++++++
server.on("/", []() {
server.send(200, "text/html", webPage());
});
server.on("/socket1On", []() {
digitalWrite(light_diode_D0, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket1Off", []() {
digitalWrite(light_diode_D0, LOW);
server.send(200, "text/html", webPage());
delay(100);
});
//+++++++++++++++++++++++ END LED-1 ++++++++++++++++++++
//+++++++++++++++++++++++ START LED-2 ++++++++++++++++++++
server.on("/socket2On", []() {
digitalWrite(PC, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket2Off", []() {
digitalWrite(PC, LOW);
server.send(200, "text/html", webPage());
delay(100);
});
// +++++++++++++++++++++++ END LED-2 ++++++++++++++++++++
//+++++++++++++++++++++++ START LED-3 ++++++++++++++++++++
server.on("/socket3On", []() {
digitalWrite(PC_rest, HIGH);
server.send(200, "text/html", webPage());
delay(100);
});
server.on("/socket3Off", []() {
digitalWrite(PC_rest, LOW);
server.send(200, "text/html", webPage());
delay(100);
});
// +++++++++++++++++++++++ END LED-3 ++++++++++++++++++++
server.begin();
Serial.println("HTTP server started");
client.setServer(mqtt_server, mqtt_port); // указываем адрес брокера и порт
client.setCallback(callback); // указываем функцию которая вызывается когда приходят данные от брокера
}
void loop()
{
server.handleClient();
ArduinoOTA.handle(); // Всегда готовы к прошивке
if (!client.connected()) // проверяем подключение к брокеру
{
reconnect(); // еще бы проверить подкючение к wifi...
}
client.loop();
pc_state();
}
Вложения
-
2 KB Просмотры: 11
-
1.6 KB Просмотры: 8
-
2.9 KB Просмотры: 9