1 2 3 4 5 6 7 8 9 10 9/10 9,20оценок: 5

Arduino Mega. Контроллер теплицы. Хроники - 6.0

Тема в разделе "Теплицы и парники", создана пользователем DIYMan, 30.10.20.

Статус темы:
Закрыта.
  1. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    .
     
    Последнее редактирование: 26.11.20
  2. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    .
     
    Последнее редактирование: 26.11.20
  3. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    По логу видно, что происходит следующее: после отсыла подписки на топики приходят данные:

    Код:
    18:09:02.253 -> +IPD DETECTED, CLIENT #0, LENGTH=5
    18:09:02.287 -> +IPD DETECTED, CLIENT #0, LENGTH=536
    
    Однако, ESP не сигнализирует в вызове void CoreMQTT: OnClientDataAvailable, что все данные приняты, т. е. последний параметр isDone - не становится true. Следовательно, ветка
    Код:
    else
    if(machineState == mqttWaitSendSubscribePacketDone)
    {
    if(isDone)
    machineState = mqttSendPublishPacket;
    }
    
    нормально не отрабатывает, а через 20 секунд (таймаут на ожидание пакета ответа на подписки) MQTT переходит в режим ожидания. Что меня смущает: 536 байт ответа от сервера, это как бы многовато.

    Что-то происходит после
    Код:
    [ESP] REMAINING BYTES: 536
    Судя по симптомам - тупо не хватает оперативки, данные вычитываются, и портится стек. Для сравнения - дайте мне лог с локальным MQTT-сервером, там наверняка входящий пакет будет сильно больше размером. Но судя по коду - там вычитывается пакетами, т. е. не сразу все килобайты, поэтому, по идее, зависаний быть не должно.

    Что можно сделать для более чёткого понимания ситуации: открыть CoreTransport. cpp, найти строку 2612, это функция void CoreMQTT: OnClientDataAvailable. Внутрь неё, после открывающей фигурной скобки { первой строчкой вставить:
    Код:
    #ifdef MQTT_DEBUG
          DEBUG_LOG(F("MQTT: OnClientDataAvailable, dataSize = "));
          DEBUG_LOG(String(dataSize));
          DEBUG_LOG(F(", isDone = "));
          DEBUG_LOG(isDone ? F("YES") : F("NO"));
          DEBUG_LOG(F(", machine state = "));
         
          if(machineState == mqttWaitClient)
          {
              DEBUG_LOGLN(F("mqttWaitClient"));
          }
          if(machineState == mqttWaitConnection)
          {
              DEBUG_LOGLN(F("mqttWaitConnection"));
          }
          if(machineState == mqttWaitReconnect)
          {
              DEBUG_LOGLN(F("mqttWaitReconnect"));
          }
          if(machineState == mqttSendConnectPacket)
          {
              DEBUG_LOGLN(F("mqttSendConnectPacket"));
          }
          if(machineState == mqttWaitSendConnectPacketDone)
          {
              DEBUG_LOGLN(F("mqttWaitSendConnectPacketDone"));
          }
          if(machineState == mqttSendSubscribePacket)
          {
              DEBUG_LOGLN(F("mqttSendSubscribePacket"));
          }
          if(machineState == mqttWaitSendSubscribePacketDone)
          {
              DEBUG_LOGLN(F("mqttWaitSendSubscribePacketDone"));
          }
          if(machineState == mqttSendPublishPacket)
          {
              DEBUG_LOGLN(F("mqttSendPublishPacket"));
          }
          if(machineState == mqttWaitSendPublishPacketDone)
          {
              DEBUG_LOGLN(F("mqttWaitSendPublishPacketDone"));
          }
    #endif
    Теперь при включенной отладке MQTT в лог будет писаться состояние клиента MQTT на момент прихода данных с ESP.

    Но всё же - предлагаю перейти на расширенную версию, потому что в старой - я копаться уже не буду, сорри.
     
  4. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Форум корёжит, дублируются сообщения :(
     
    Последнее редактирование: 26.11.20
  5. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Короче - вангую за нехватку оперативки, потому что вот этот блок:
    Код:
      #ifdef MQTT_DEBUG
          DEBUG_LOGLN(F("MQTT: process incoming packet on idle mode..."));
         #endif   
          // тут разбираем, что пришло от брокера. Если мы здесь, значит данные от брокера
          // пришли в необрабатываемую ветку, т.е. это публикация прямо с брокера
         
         
          for(size_t i=0;i<dataSize;i++)
            packetBuffer.push_back(data[i]);
             
          if(!isDone) // ещё не все данные получены
            return;
         
          processIncomingPacket(&currentClient, packetBuffer.pData(), packetBuffer.size());
    
          packetBuffer.clear();
    вычитывает все входящие данные в оперативку, пока весь пакет от брокера не соберётся. А там - полкилобайта. Возможно, тут и баста наступает.
     
  6. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    @id10960627, что ещё можно сделать: сейчас публикуемые топики имеют флаг retain на сервере, т. е. после соединения с брокером он выдаёт последние известные топики. Чтобы это убрать, надо найти строчку 3097 в файле CoreTransport. cpp и заменить

    retain = true;

    на

    retain = false;

    Вот этот кусок кода:
    Код:
      else
                if(hasPublishTopics)
                {
    
                  retain = true;
    Это, надеюсь, поможет.
     
  7. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    @id10960627, обновил на гитхабе, перекачайте. В настройках добавилась опция

    MQTT_RETAIN_TOPICS

    Просто закомментируйте её, и перезакачайте прошивку. Возможно, это поможет в вашем случае.
     
  8. Ден65
    Регистрация:
    15.07.19
    Сообщения:
    165
    Благодарности:
    53

    Ден65

    Живу здесь

    Ден65

    Живу здесь

    Регистрация:
    15.07.19
    Сообщения:
    165
    Благодарности:
    53
    @DIYMan, Дмитрий, имею не скромный вопрос, можно модуль бака дополнить связью по RS485?
     
  9. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Не, в ближайшее время этого не планируется.
     
  10. id10960627
    Регистрация:
    09.05.18
    Сообщения:
    76
    Благодарности:
    8

    id10960627

    Живу здесь

    id10960627

    Живу здесь

    Регистрация:
    09.05.18
    Сообщения:
    76
    Благодарности:
    8
    Спасибо за развернутый ответ и много вводных для всевозможных проверок. Сейчас пока некогда, немного разгребу и попробую Ваши догадки.
    Обязательно сообщу о результатах

    Спасибо
     
  11. Ден65
    Регистрация:
    15.07.19
    Сообщения:
    165
    Благодарности:
    53

    Ден65

    Живу здесь

    Ден65

    Живу здесь

    Регистрация:
    15.07.19
    Сообщения:
    165
    Благодарности:
    53
    :hello:Но ведь - это не категоричное нет? :close: Хочу сделать всю систему на RS485 а это единственный модуль где нет возможности выбрать способ передачи данных.
     
    Последнее редактирование: 27.11.20
  12. id10960627
    Регистрация:
    09.05.18
    Сообщения:
    76
    Благодарности:
    8

    id10960627

    Живу здесь

    id10960627

    Живу здесь

    Регистрация:
    09.05.18
    Сообщения:
    76
    Благодарности:
    8
    Добавил в файл транспорта собиралку логов из вашего поста, смотри прицеп ЛОГ2

    Заменил retain = true на false, почистил сообщения на брокере, пока работает, прицеп ЛОГ3 (там оно ругается на Unsupported topic, это нормально?)

    Видимо да, нехватка оперативки была.
     

    Вложения:

  13. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Это не категоричное "нет" :) Но по срокам реализации - не скажу, сорри. В будущем - всё возможно ;)
     
  14. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Это нормально, просто сигнал, что входящий топик - не поддерживается контроллером. Он реагирует только на топики GET и SET. Для этого и нужен RETAIN, чтобы вы могли в офлайне дать команду, брокер её сохранит, и как только контроллер появится в сети - выдаст ему эту команду. Ну и сам контроллер пуляет топики с флагом RETAIN, чтобы любой MQTT-клиент мог получить последние известные данные с контроллера.

    Да сто пудов ;) Переходите на расширенную версию ;)
     
  15. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    В коде менять ничего не нужно, если закомментируете новую настройку MQTT_RETAIN_TOPICS ;)
     
  16. id10960627
    Регистрация:
    09.05.18
    Сообщения:
    76
    Благодарности:
    8

    id10960627

    Живу здесь

    id10960627

    Живу здесь

    Регистрация:
    09.05.18
    Сообщения:
    76
    Благодарности:
    8
    Да это я понял, просто не перекачивал прошивку еще

    Короче, почему-то на брокере m14.cloudmqtt.com всеравно зависат контроллер, а на домашнем работает (см. лог4)
    И в нем нет таких больших значений как при работе с брокером m14.cloudmqtt.com
    11:03:32.841 -> +IPD DETECTED, CLIENT #0, LENGTH=541
    Цифры гораздо скромнее. С чем связано - ХЗ)

    В общем, сейчас думаю полностью остановиться на своем брокере, понаблюдаю пару недель
     

    Вложения:

  17. Ден65
    Регистрация:
    15.07.19
    Сообщения:
    165
    Благодарности:
    53

    Ден65

    Живу здесь

    Ден65

    Живу здесь

    Регистрация:
    15.07.19
    Сообщения:
    165
    Благодарности:
    53
    :super:, куда нам торопиться, впереди пол года зимы. :hndshk:
     
  18. promavto
    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958

    promavto

    Разработка контроллеров

    promavto

    Разработка контроллеров

    Регистрация:
    27.02.16
    Сообщения:
    1.960
    Благодарности:
    1.958
    Адрес:
    г. Москва, Зеленоград.
    Не совсем так. Расслабляться не стоит. Впереди Новогодние праздники, время пролетит быстро. А в Феврале Китай гуляет свои праздники.

    А сейчас о другом. Мы применяем метеостанции. Есть метеостанции без контроллеров, а есть с контроллерами и выносными табло. Цена у них практически одинаковая. Передатчик на мачте на 433 мГц. Если применить приемник на 433 мГц, к выходу подключить логический анализатор типа Logic 1.2.18, можно было бы прочитать код посылки. Ставим недорогой приемник на 433мГц в контроллер и убиваем двух зайцев (если поймаем) - расширяем информационный возможности (прибавиться температура и влажность воздуха) и не применяем радиоблок с модулем LoRa.
     
Статус темы:
Закрыта.