• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

mqtt проблема не большая.

Serrous

Member
Разобрался наконец то с подключением и тп...
При загрузке прочитывает только топик Home/rgbr, второй топик Home/svetdiap не читает...
Но если я меняю их с телефона то читатет оба.
как заставить читать либо все при старте ... либо принудительно читать топик ?

Код:
#include <MQTT.h>           // Подключаем библиотеку для работы протоколом MQTT
#include <PubSubClient.h>   // Подключаем библиотеку для получения и публикации топиков от/на брокере
#include <ESP8266WiFi.h>    // Подключаем библиотеку для работы с WiFi


//const char *ssid =  "";  // Имя вайфай точки доступа
//const char *pass =  ""; // Пароль от точки доступа

const char *ssid =  "";  // Имя вайфай точки доступа
const char *pass =  ""; // Пароль от точки доступа

const char *mqtt_server = ""; // Имя сервера MQTT
const int mqtt_port = ; // Порт для подключения к серверу MQTT
const char *mqtt_user = ""; // Логи от сервер
const char *mqtt_pass = ""; // Пароль от сервера

WiFiClient wclient;         // создаем обьект клиента Wifi
PubSubClient client(wclient, mqtt_server, mqtt_port); // создаем обьект клиента MQTT

#define BUFFER_SIZE 100
int tm, temp;
int rgbr;
String putcomand;       // Создаём массив для отправки данных
String getcomand;       // Создаем массив для приема данных
int hour1, hour2, hour3, hour4; //переменные для временных диапозонов. часы.
int min1, min2, min3, min4; //переменные для временных диапозонов. минуты.
int svetdiap; // количество световых диапазонов

void setup() {
  pinMode (D1, OUTPUT);
  Serial.begin(115200); // Внимание !!!! при просмотре com порта выставьте скорость 115200
  //svetdiap = 2; //минимальное значение световых диапазонов
}

void loop() {


  if (!client.connected()) { // переподключаемся к MQTT серверу
    reconnect();
  }

  if (client.connected()) {
    client.loop();
    //TempSend();
    svetdiapf();
  }



}

// Функция отправки показаний с термодатчика
void TempSend() {
  if (tm == 0)
  {
    temp = 2;
    client.publish("/Home/temp", String(temp)); // отправляем в топик для термодатчика значение температуры
    //Serial.println(temp);
    tm = 300;  // пауза между отправками значений температуры  коло 3 секунд
  }
  tm--;
  delay(10);
}

void svetdiapf() {
  if (tm == 0) {
    putcomand = "AT";
    putcomand += svetdiap;
    Serial.println (putcomand);
    tm = 300;
  }
  tm--;
  delay(10);
}

void callback(const MQTT::Publish & pub)
{
  Serial.print(pub.topic());   // выводим в сериал порт название топика
  Serial.print(" => ");
  Serial.println(pub.payload_string()); // выводим в сериал порт значение полученных данных

  String payload = pub.payload_string();

  if (String(pub.topic()) == "/Home/rgbr") // проверяем из нужного ли нам топика пришли данные
  {
    rgbr = payload.toInt(); // преобразуем полученные данные в тип integer
    if (rgbr != 0) {
      analogWrite(D1, rgbr); //  включаем или выключаем светодиод в зависимоти от полученных значений данных
      Serial.println ("Вкл");
    }
    else {
      analogWrite(D1, 0); //  включаем или выключаем светодиод в зависимоти от полученных значений данных
      Serial.println ("Выкл");
    }
  }
    if (String(pub.topic()) == "/Home/svetdiap") // проверяем из нужного ли нам топика пришли данные
  {
  svetdiap = payload.toInt(); // преобразуем полученные данные в тип integer
 
  }
}

void reconnect() {
  if (WiFi.status() != WL_CONNECTED) { // подключаемся к WIFI
    Serial.print("Подключение к WiFi SSID: ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi Подключен");
    Serial.print ("IP: ");
    Serial.println(WiFi.localIP());//получаем IP WeMos, этот IP необходимо ввести в адресной строке браузера, чтобы получить доступ к WeMos
    Serial.print ("MAC: ");
    Serial.println(WiFi.macAddress()); //получаем MAC-адрес WeMos
    Serial.print ("Mask: ");
    Serial.println(WiFi.subnetMask()); //маску подсети
    Serial.print ("Gateway: ");
    Serial.println(WiFi.gatewayIP()); //IP- шлюза
    Serial.print ("SSID: ");
    Serial.println(WiFi.SSID());// имя сети, к которой подключен WeMos
    Serial.print ("уровень сигнала: ");
    Serial.println(WiFi.RSSI()); //и уровень сигнала
  }


  if (WiFi.status() == WL_CONNECTED) { // если вафля подключена
    if (!client.connected()) { // подключаемся к MQTT серверу
      Serial.println("Подключаемся к MQTT серверу");
      if (client.connect(MQTT::Connect("arduinoClient2")
                         .set_auth(mqtt_user, mqtt_pass))) {
        Serial.println("Подключение удалось");
        client.set_callback(callback);
        client.subscribe("/Home/rgbr"); // подписывааемся по топик с данными яркости карсного
        client.subscribe("/Home/svetdiap"); // подписывааемся по топик с данными яркости карсного 
      } else {
        Serial.println("Подключение не удалось");
      }
    }

  }
}
 
Последнее редактирование:

Serrous

Member
на 3 форуме спрашиваю... и везде тишина... неужто никто не делал восстановление данных после перезагрузки вемоса/ардуины и тп )
 

telobezumnoe

New member
на 3 форуме спрашиваю... и везде тишина... неужто никто не делал восстановление данных после перезагрузки вемоса/ардуины и тп )
надо помечать отправляемые данные флагом retained, тогда при подключении клиент будет сразу получать последние данные
 
Сверху Снизу