Совместная работа mqtt и webserwer на esp8266

sheo

✩✩✩✩✩✩✩
3 Июл 2020
3
1
Здравствуйте хочу объединить работу по глобальной сети(mqtt) с локальной в виде веб странички(WebServer) на nodemcu(esp8266)
По отдельности я это реализовал но при попытке все это объединить во едино ничего хорошего не выходит я предполагаю что в дело в портах но не уверен в этом
Пожалуйста подскажите в чем моя ошибка или скиньте пример нормальной объеденный работы
для работы с 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>&nbsp;<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>&nbsp;<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>&nbsp;<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();
}
 

Вложения