esp8266, mqtt, подписка на 7 топиков - зависания

Тема в разделе "ESP8266, ESP32", создана пользователем yden, 18 апр 2018.

  1. yden

    yden Гик

    Здравствуйте.
    Подскажите пожалуйста. Есть 2 esp8266 (nodencu), посылают\принимают сообщения mqtt. Были подписаны на 5 топиков, более-менее работали стабильно. Добавил подписку еще на 2 топика - начали стабильно виснуть раз-два в сутки. Причем, на пинг они отвечают, прошивка по http залетает.
    Вот код подписки:
    Код (C++):
    // подключаемся к MQTT серверу
      if (WiFi.status() == WL_CONNECTED)
      {
        if (!mqtt_client.connected())
        {
          Serial.println("Connecting to MQTT server");
          if (mqtt_client.connect(MQTT::Connect("informer_in")
                                  .set_auth(mqtt_user, mqtt_pass)))
          {
            Serial.println("Connected to MQTT server");
            mqtt_client.set_callback(callback);
            //подписываемся по топики
            mqtt_client.subscribe("ihouse/climat/t_out");
            mqtt_client.loop();
            mqtt_client.subscribe("ihouse/climat/t_out/delta");
            mqtt_client.loop();
            mqtt_client.subscribe("ihouse/climat/t_banya");
            mqtt_client.loop();
            mqtt_client.subscribe("ihouse/climat/t_banya/delta");
            mqtt_client.loop();
            mqtt_client.subscribe("ihouse/svet/banya/in");
            mqtt_client.loop();
            mqtt_client.subscribe("ihouse/climat/pressure/p_atm");
            mqtt_client.loop();
            mqtt_client.subscribe("ihouse/climat/pressure/p_atm_delta");
            mqtt_client.loop();
          }
          else
          {
            Serial.println("Could not connect to MQTT server");
          }
        }

        if (mqtt_client.connected())
        {
          mqtt_client.loop();
          TempSend();
        }
    Отправка в топики так же висит. Отправляю в топики сообщения только при изменении величин. На других esp с подобным кодом все нормально (не 7 топиков подписки).

    как это можно исправить?

    благодарю
     
  2. SergeiL

    SergeiL Гуру

    А что значит:
    Что означает более-менее стабильно?
    У меня максимум - 6, работает стабильно.
     
  3. yden

    yden Гик

    Нет нет да и зависнет, но не 2 раза в день. Виснет именно mqtt. Пинг проходит, скетч по http залетает.
     
  4. SergeiL

    SergeiL Гуру

    Какой библиотекой mqtt пользуетесь?
     
  5. yden

    yden Гик

    PubSubClient.h
     
  6. ИгорьК

    ИгорьК Давно здесь

    Коллеги, а не проще ли подписаться на одну ветку (например здесь) ""ihouse/climat/#" после чего анализировать пришедшие топики в свитче?
     
    SergeiL и DIYMan нравится это.
  7. SergeiL

    SergeiL Гуру

    А Вы документацию к библиотеке смотрели? Она здесь!

    Посмотрите, как выглядит подключение у Вас , и как в докуменации и примерах
    Помнится, я Вас уже об этом спрашивал здесь. Но вы сказали, что у вас все и так работает.
    Хозяин барин :), но у меня как в документации, и стабильно работает.
     
    Последнее редактирование: 18 апр 2018
  8. SergeiL

    SergeiL Гуру

    Как мне кажется, тут нужно искать компромисс. Наверно нужна одна своя с "#" и плюс те которые нужны. Вопрос сколько топиков будет валиться в подветке и сколько нужно обрабатывать. У меня в целом не больше 6 подписок, проблем нет. Мене почему-то часто нужны единичные топики из разных подветок.
     
    Последнее редактирование: 18 апр 2018
  9. SergeiL

    SergeiL Гуру

    А в случае, если mqtt отвалился, в скетче механизмы переподключения есть?
     
    Последнее редактирование: 18 апр 2018
  10. yden

    yden Гик

    Я вас услышал. Можете поделиться вашим примером? И ссылкой на библиотеку.
    благодарю
     
  11. yden

    yden Гик

    Код (C++):
    if (!mqtt_client.connected())
        {
          Serial.println("Connecting to MQTT server");
          if (mqtt_client.connect(MQTT::Connect("informer_in")
                                  .set_auth(mqtt_user, mqtt_pass)))
          {
    Я думаю это заведует переподключением.
     
  12. SergeiL

    SergeiL Гуру

    Попробовал скомпилировать этот Ваш пример, у меня даже компиляция не проходит, ругается именно на MQTT:: У меня нет MQTT.h, но и в Вашем втором примере она убрана.

    ИМХО Вы пытаетесь использовать две библиотеки mqtt одновременно.

    Про MQTT.h сказать ничего не могу, PubSubClient работает чрезвычайно стабильно.
    Сейчас посмотрел, на дачной Leonardo ETH подписываюсь на 9 топиков.
    Работает с прошлой весны, за это время не было ни одного самопроизвольного зависания или рестарта. Пару раз я обновлял, пару раз питание отключал.

    Посмотрите примеры, там все очень понятно описано:
    yden.png
     
    Последнее редактирование: 19 апр 2018
  13. yden

    yden Гик

    Поделитесь плиз своим кодом.
    Я свой код лепил из нескольких. Скорее всего поэтому такие траблы и идут.
     
  14. yden

    yden Гик

    Добрый всем.
    Переключил на другую библиотеку. Пока фурычит (тьфу тьфу тьфу).
    Но есть непонятки.
    Код (C++):
    // Функция получения данных от сервера
    void callback(char* topic, byte* payload, unsigned int length)
    {
      //--------------------------------------------------------------------------------------
      //свет баня 1
      if (String(topic) == "ihouse/svet/banya/in")
      {
        if ((char)payload[0] == '1') flag_light_banya = true;
        if ((char)payload[0] == '0') flag_light_banya = false;
        digitalWrite(outPin2, !flag_light_banya);
      }

      //свет баня 2
      if (String(topic) == "ihouse/svet/banya/out")
      {
        if ((char)payload[0] == '1') flag_light_banya = true;
        if ((char)payload[0] == '0') flag_light_banya = false;
        digitalWrite(outPin1, !flag_light_banya);
      }

      //свет столб
      if (String(topic) == "ihouse/svet/stolb")
      {
        if ((char)payload[0] == '1') flag_light_stolb = true;
        if ((char)payload[0] == '0') flag_light_stolb = false;
        digitalWrite(outPin3, !flag_light_stolb);
      }
    }
    Суть: свет на столбе не зажигается, хотя в топик летит 1. Такое ощущение, что отрабатывает только первый блок - свет баня 1.
    Где я накосячил?

    благодарю
     
  15. yden

    yden Гик

    Нет, все ровно. Провод отпаялся просто :)
    извините