• Система автоматизации с открытым исходным кодом на базе 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, тогда при подключении клиент будет сразу получать последние данные
 
Сверху Снизу