Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Не работает подписка на топики

Тема в разделе "Общие вопросы по esp8266", создана пользователем Deonis, 28 май 2019.

Метки:
  1. Deonis

    Deonis Новичок

    Сообщения:
    21
    Симпатии:
    0
    Экспериментирую с MQTT
    На одной ESP программа которая публикует топики, судя по Spy-MQTT у нее это отлично получается
    На вторую ESP загрузил программу которая должна выводить значения в Консоль, но судя по Spy-MQTT подключение к серверу проходит, а вот в консоль ничего не выводится, такое чувство что callback не срабатывает... Какую то "мелочь" похоже упустил...

    Код (C):
    1. /*
    2. Подписка к MQTT
    3.   подписываемся к серверу
    4.  
    5. */
    6.  
    7. #include <ESP8266WiFi.h>
    8. #include <PubSubClient.h>
    9.  
    10. // =======================================================================
    11. // Конфигурация устройства:
    12. // =======================================================================
    13.  
    14. const char* ssid = "SSID";   //SSID
    15. const char* password = "Пароль";  //Пароль
    16.  
    17. #define REPORT_INTERVAL 10 // интервал обмена WIFI
    18.  
    19. // Топики для подписи
    20. char* hellotopic = "ESP_0"; //Топик для приветственной инициализации
    21. char* temperature_topic = "garden/hotbed_1/temperature";  //Топик для температуры в теплице1
    22. char* humidity_topic = "garden/hotbed_1/humidity";        //Топик для влажности в теплице1
    23.  
    24. IPAddress server(*, *, *, *); // mosquitto адрес
    25.  
    26. String clientName;  // Сбор строки информации о клиенте
    27.  
    28. WiFiClient wclient;
    29. PubSubClient client(wclient, server, 1883); //Создание колиента MQTT
    30.  
    31.  
    32. // Список возвращаемых данных
    33. String t_hotbed_1;
    34. String h_hotbed_1;
    35.  
    36. //подсчет времени
    37. long previousMillis_time = 0;  // храним время последнего подключения
    38. long interval_time = 10;     //интервал 1 час 3600000
    39.  
    40. // =======================================================================
    41. // Функция получения данных от сервера
    42. void callback(char* topic, byte* payload, unsigned int length)
    43. {
    44.   Serial.println("callback");
    45.   //--------------------------------------------------------------------------------------
    46.   //температура 1 теплица
    47.   if (String(topic) == "temperature_topic")
    48.   {
    49.     t_hotbed_1 = "";
    50.     for (int i = 0; i < length; i++)
    51.     {
    52.       t_hotbed_1 = t_hotbed_1 +(char)payload[i];
    53.     }
    54.  
    55.     Serial.print("Температура: ");
    56.     Serial.println(t_hotbed_1);
    57.   }
    58.   //--------------------------------------------------------------------------------------
    59.   //Влажность 1 теплица
    60.   if (String(topic) == "humidity_topic")
    61.   {
    62.     h_hotbed_1 = "";
    63.     for (int i = 0; i < length; i++)
    64.     {
    65.       h_hotbed_1 = h_hotbed_1 +(char)payload[i];
    66.     }
    67.      Serial.print("Влажность: ");
    68.     Serial.println(h_hotbed_1);
    69.   }
    70.  
    71. }//void callback
    72.  
    73. String macToStr(const uint8_t* mac)
    74. {
    75.   String result;
    76.   for (int i = 0; i < 6; ++i) {
    77.     result += String(mac[i], 16);
    78.     if (i < 5)
    79.       result += ':';
    80.   }
    81.   return result;
    82. }//String macToStr
    83.  
    84. // =======================================================================
    85. void setup_wifi()
    86. {
    87.   while (WiFi.status() != WL_CONNECTED) { //Если нет подключения к WIFI
    88.     delay(500); //Задержка 50 сек
    89.     Serial.print(".");
    90.   }
    91.   Serial.println("+");
    92.   Serial.println("WiFi connected"); // Вывод в СОМ информации о подключении к WIFI
    93.   Serial.println("IP address: "); // Вывод в СОМ информации о полученом IP адресе
    94.   Serial.println(WiFi.localIP());  
    95. }// void setup_wifi
    96.  
    97. // =======================================================================
    98. void reconnect()
    99. {
    100.   // подключаемся к MQTT серверу
    101.   if (WiFi.status() == WL_CONNECTED)
    102.   {
    103.     if (!client.connected())
    104.     {
    105.     Serial.print("Connecting to ");
    106.     Serial.print(server);  
    107.     Serial.print(" as ");
    108.     Serial.println(clientName); //Вывод в СОМ собранной информации о клиенте
    109.  
    110.     if (client.connect((char*) clientName.c_str())) //конектимся с брокером как клиент
    111.   {
    112.     Serial.println("Connected to MQTT broker");
    113.    
    114.     if (client.publish(hellotopic, "hello from ESP8266"))
    115.   {
    116.     Serial.println("Publish ok");
    117.     }
    118.     else {
    119.     Serial.println("Publish failed");
    120.     }
    121.  
    122.         //подписываемся по топики
    123.         client.subscribe(temperature_topic);
    124.         client.loop();
    125.         client.subscribe(humidity_topic);
    126.         client.loop();
    127.   }
    128.   else {
    129.     Serial.println("MQTT connect failed");
    130.     Serial.println("Will reset and try again...");
    131.     abort();
    132.   }  
    133.   }
    134.   }
    135. }//void reconnect
    136.  
    137. ///////////////////////////////////////////////////////
    138.  
    139. void setup() {
    140.   // Setup console
    141.   Serial.begin(115200);
    142.   delay(10);
    143.   Serial.println();
    144.   Serial.println();
    145.   WiFi.mode(WIFI_STA);        // режим клиента
    146.   WiFi.begin(ssid, password);
    147.   delay(10);
    148.   clientName += "esp8266-"; // Сбор строки информации оклиенте
    149.   uint8_t mac[6];
    150.   WiFi.macAddress(mac);  // Получение МАС адреса
    151.   clientName += macToStr(mac); // Добовление МАС адреса клиента в строку о клиенте
    152.   clientName += "-";
    153.   clientName += String(micros() & 0xff, 16);
    154. }//void setup
    155.  
    156. void loop() {
    157.  
    158.   if (WiFi.status() != WL_CONNECTED) //если нет подключения к вифи
    159.   {
    160.     setup_wifi();
    161.   }
    162.  
    163.    if (!client.connected())
    164.   {
    165.     reconnect();                                        
    166.   }
    167.     client.loop();
    168.    
    169. //////////////////////////////////////////
    170.   int cnt = REPORT_INTERVAL;
    171.  
    172.   while (cnt--)
    173.     delay(1000);
    174. Serial.println("loop");
    175. }// void loop
    176.  
     
  2. Deonis

    Deonis Новичок

    Сообщения:
    21
    Симпатии:
    0
    Программа которая публикует сообщения:
    Код (Text):
    1. /*
    2.     esp8266 + dht22 + mqtt
    3.     отправка на MQTT сервер информации с датчика DHT22
    4. */
    5.  
    6. #include "DHT.h"
    7. #include <PubSubClient.h>
    8. #include <ESP8266WiFi.h>
    9.  
    10. // =======================================================================
    11. // Конфигурация устройства:
    12. // =======================================================================
    13. const char* ssid = "SSID";   //SSID для WiFi
    14. const char* password = "Пароль";  //Пароль для WiFi
    15.  
    16. // описание датчика DHT
    17. #define DHTPIN 2     // Пин для подключения датчика DHT (D4 на ESP)
    18. #define DHTTYPE DHT22   // DHT 22
    19.  
    20. #define REPORT_INTERVAL 10 // интервал обмена WIFI
    21.  
    22. // Привязка топиков
    23. char* hellotopic = "ESP_1"; //Топик инициализации позволяет контролировать количество подключений устройства
    24. char* temperature_topic = "garden/hotbed_1/temperature";  //Топик для температуры в теплице1
    25. char* humidity_topic = "garden/hotbed_1/humidity";        //Топик для влажности в теплице1
    26.  
    27. IPAddress server(*, *, *, *); // адрес сервера mosquitto
    28.  
    29. String clientName;  // Сбор строки информации о клиенте
    30.  
    31. DHT dht(DHTPIN, DHTTYPE, 15); // Инициализация датчика
    32. WiFiClient wclient; // Создание WIFI клиента
    33. PubSubClient client(wclient, server, 1883); //Создание колиента MQTT
    34.  
    35. float oldH ;  //Старое значение Влажности
    36. float oldT ;  //Старое значение температуры
    37.  
    38. void setup() {
    39.   Serial.begin(115200);
    40.   delay(20); //Задержка
    41.  
    42.   Serial.println();
    43.   Serial.println();
    44.   Serial.print("Connecting to "); // вывод в СОМ к какому
    45.   Serial.println(ssid);          // WIFI подключаемся
    46.  
    47.   WiFi.mode(WIFI_STA);        // режим клиента
    48.   WiFi.begin(ssid, password);
    49.   delay(10);
    50.  
    51.   while (WiFi.status() != WL_CONNECTED) { //Если нет подключения к WIFI
    52.     delay(500); //Задержка 50 сек
    53.     Serial.print(".");
    54.   }
    55.   Serial.println("+");
    56.   Serial.println("WiFi connected"); // Вывод в СОМ информации о подключении к WIFI
    57.   Serial.println("IP address: "); // Вывод в СОМ информации о полученом IP адресе
    58.   Serial.println(WiFi.localIP());
    59.  
    60.   clientName += "esp8266-"; // Сбор строки информации оклиенте
    61.   uint8_t mac[6];
    62.   WiFi.macAddress(mac);  // Получение МАС адреса
    63.   clientName += macToStr(mac); // Добовление МАС адреса клиента в строку о клиенте
    64.   clientName += "-";
    65.   clientName += String(micros() & 0xff, 16);
    66.  
    67.   Serial.print("Connecting to ");
    68.   Serial.print(server);  
    69.   Serial.print(" as ");
    70.   Serial.println(clientName); //Вывод в СОМ собранной информации о клиенте
    71.  
    72.   if (client.connect((char*) clientName.c_str())) //конектимся с брокером как клиент
    73.   {
    74.     Serial.println("Connected to MQTT broker");
    75.    
    76.     if (client.publish(hellotopic, "hello from ESP8266")) {
    77.       Serial.println("Publish ok");
    78.     }
    79.     else {
    80.       Serial.println("Publish failed");
    81.     }
    82.     client.setCallback(callback);  
    83.   }
    84.   else {
    85.     Serial.println("MQTT connect failed");
    86.     Serial.println("Will reset and try again...");
    87.     abort();
    88.   }
    89.  
    90.   dht.begin(); //Инициализация датчика
    91.   oldH = -100;
    92.   oldT = -100;
    93. }
    94.  
    95. void loop() {
    96.  
    97.   if (client.connected() != 1 || WiFi.status() != WL_CONNECTED)
    98.   {
    99.     Serial.println("Нет подключения");
    100.     Serial.println(WiFi.status());
    101.     reconnect_server();
    102.   }
    103.   else
    104.   {
    105.      sendToMQTT();
    106.   }
    107.   //////////////////////////////////////////
    108.   int cnt = REPORT_INTERVAL;
    109.  
    110.   while (cnt--)
    111.     delay(1000);
    112. }// void loop
    113.  
    114.  
    115. //-------------------
    116. void sendToMQTT() {
    117.  
    118.     float h = dht.readHumidity();
    119.     float t = dht.readTemperature();
    120.  
    121.     if (isnan(h) || isnan(t)) {
    122.     Serial.println("Failed to read from DHT sensor!");
    123.     return;
    124.     }
    125.  
    126.     Serial.print("Sending payload: "); // Вывод в ком отправляемой на MQTT информации
    127.     Serial.print("Humidity: ");
    128.     Serial.print(h);
    129.     Serial.print(" %\t");
    130.     Serial.print("Temperature: ");
    131.     Serial.print(t);
    132.     Serial.println(" *C ");
    133.  
    134.     if (client.publish(humidity_topic, String(h).c_str())) {
    135.       Serial.println("Publish Humidity ok");
    136.     }
    137.     else {
    138.       Serial.println("Publish Humidity failed");
    139.     }  
    140.     if (client.publish(temperature_topic, String(t).c_str())) {
    141.       Serial.println("Publish Temperature ok");
    142.     }
    143.     else {
    144.       Serial.println("Publish Temperature failed");
    145.     }
    146. }//void sendToMQTT()
    147.  
    148. // =======================================================================
    149. // Функция получения данных от сервера
    150. void callback(char* topic, byte* payload, unsigned int length) {
    151.   // handle message arrived
    152. }
    153.  
    154.  
    155.  
    156. String macToStr(const uint8_t* mac)
    157. {
    158.   String result;
    159.   for (int i = 0; i < 6; ++i) {
    160.     result += String(mac[i], 16);
    161.     if (i < 5)
    162.       result += ':';
    163.   }
    164.   return result;
    165. }//String macToStr
    166.  
    167. void reconnect_server()                      //функция проверки подключения
    168. {
    169.   Serial.println("функция проверки подключения");
    170.   if (WiFi.status() != WL_CONNECTED)         //если нет подключения с сети
    171.   {
    172.     WiFi.begin(ssid, password);
    173.     Serial.println("");
    174.     Serial.println("WiFi connect...");       //выводим в монитор порта что пытаемся подключиться
    175.   } else {
    176.     Serial.println("");
    177.     Serial.println("WiFi connected");
    178.     Serial.println("IP address: ");
    179.     Serial.println(WiFi.localIP());
    180.   }
    181.     if (!client.connected() && WiFi.status() == WL_CONNECTED) //если к сети подключились но к MQTT нет
    182.     {    
    183.     if (client.connect((char*) clientName.c_str())) //конектимся с брокером как клиент
    184.     {
    185.     Serial.println("Connected to MQTT broker");
    186.     }
    187.     if (client.publish(hellotopic, "hello from ESP8266")) {
    188.     Serial.println("Publish ok");
    189.     }
    190.     else {
    191.       Serial.println("Publish failed");
    192.     }
    193.  
    194.   }
    195. }//void reconnect_server
    196.  
     
  3. Deonis

    Deonis Новичок

    Сообщения:
    21
    Симпатии:
    0
    Сам же и нашел ответ... нужно добавить - client.set_callback(callback); в функцию reconnect(), я добавил перед 122 строчкой.
    Помимо этого видимо библиотека PubSubClient.h изменилась либо во взятом мною источнике была другая нужно изменить функцию callback :
    Код (C):
    1. void callback(const MQTT::Publish& pub)
    2. {
    3.  
    4.   Serial.print(pub.topic());
    5.   Serial.print(" => ");
    6.   Serial.println(pub.payload_string());
    7.  
    8.  
    9.   //--------------------------------------------------------------------------------------
    10.   //температура 1 теплица
    11.   if (String(pub.topic()) == "temperature_topic")
    12.   {
    13.     t_hotbed_1 = pub.payload_string();
    14.  
    15.     Serial.print("Температура: ");
    16.     Serial.println(t_hotbed_1);
    17.   }
    18.   //--------------------------------------------------------------------------------------
    19.   //Влажность 1 теплица
    20.   if (String(pub.topic()) == "humidity_topic")
    21.   {
    22.     h_hotbed_1 = pub.payload_string();
    23.  
    24.      Serial.print("Влажность: ");
    25.     Serial.println(h_hotbed_1);
    26.   }
    27.  
    28. }//void callback
     
  4. Deonis

    Deonis Новичок

    Сообщения:
    21
    Симпатии:
    0
    Не заметил сразу, кавычки убрать нужно у: "temperature_topic" и "humidity_topic" иначе фигня получается... :(
     

Поделиться этой страницей