• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 недоступен
 
Сверху Снизу