• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Esp8266 и одновременно MQTT и HTML возможно ли

MakPol

Member
Доброго времени суток!
Встала задача реализовать на esp8266 управление реле. Делал и просто server(80) и через mqtt. Но задумал, чтобы и так и так можно было управлять. Попробовал скрестить два проектика, но что то ни то ни другое в итоге не работает. Задумался над тем, а вообще реально ли сделать простую html-ку и через mqtt работало. И порт доступен и подписку слушал и получив там данные выполнял комманду
 

MakPol

Member
Что именно у вас не получается?
Не получается узнать "Задумался над тем, а вообще реально ли сделать простую html-ку и через mqtt работало "
Т.е. все то, что в топике и спросил.
Но кажись вышло скрестить ежа со змеей

C-like:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.

const char* ssid = "makpolfy";
const char* password = "pass***";
const char* mqtt_server = "makpol.server.ru";

WiFiServer server(80);                        // Указываем порт Web-сервера
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE  (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

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

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

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and reribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);
  setup_wifi();
  server.begin();                             // Запуск сервера
  Serial.println("Server started");           // Печать "Server starte"
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {
 if (!client.connected()) {
    reconnect();
  }
//---------------------------------------------------------------------------------------------------------------------
   WiFiClient client1 = server.available();    // Получаем данные, посылаемые клиентом
  if (client1)                               
  {
   Serial.println("new client");               // Отправка "new client"
  while(!client1.available())                  // Пока есть соединение с клиентом
  {
    delay(1);                                 // пауза 1 мс
  }

  String request = client1.readStringUntil('\r');
  Serial.println(request);
  client1.flush();
 
  int value = digitalRead(BUILTIN_LED);
  if (request.indexOf("/BUILTIN_LED=ON") != -1) 
  {
    Serial.println("BUILTIN_LED=ON");
    digitalWrite(BUILTIN_LED,LOW);
    value = LOW;
  }
  if (request.indexOf("/BUILTIN_LED=OFF") != -1) 
  {
    Serial.println("BUILTIN_LED=OFF");
    digitalWrite(BUILTIN_LED,HIGH);
    value = HIGH;
  }

  client1.println("HTTP/1.1 200 OK");
  client1.println("Content-Type: text/html");
  client1.println("");
  client1.println("<!DOCTYPE HTML>");
  client1.println("<html>");
  client1.println("<head><title>ESP8266 BUILTIN_LED Control</title></head>");
 // client1.println("<meta http-equiv=\"refresh\" content=\"0;/\">");
  client1.print("BUILTIN_LED is now: ");
 
  if(value == HIGH)
  {
    client1.print("OFF");
  }
  else
  {
    client1.print("ON");
  }
  client1.println("<br><br>");
  client1.println("Turn <a href=\"/BUILTIN_LED=OFF\">OFF</a> BUILTIN_LED<br>");
  client1.println("|<br>");
  client1.println("|<br>");
  client1.println("|<br>");
  client1.println("Turn <a href=\"/BUILTIN_LED=ON\">ON</a> BUILTIN_LED<br>");
    client1.println("</html>");
 
  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");
  }
  //---------------------------------------------------------------------------------------------------------------------

 
  client.loop();

  unsigned long now = millis();
  if (now - lastMsg > 10000) {
    lastMsg = now;
    ++value;
    snprintf (msg, MSG_BUFFER_SIZE, "hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("outTopic", msg);
  }
}
 

MakPol

Member
Но есть большая проблема, я тупо потеряв связь с mqtt сразу попадаю в цикл реконнекта к mqtt и естественно http недоступен
 
Сверху Снизу