Почему при тестировании с помощью mqttx после подписки на топик, при попытке публикации сообщения и повторном подключении, сообщение не отправляется, хотя подключение уже установлено, и при этом нет записи о сообщениях

Какая платформа используется?

Пожалуйста, подробнее опишите проблему! Какое окружение, платформа, какие операции выполнялись, какие наблюдаются явления и какова цель?

,используется облачная платформа onenet, сейчас необходимо реализовать обмен данными между mqttx и облачной платформой. После обычной подписки на топик, когда я публикую сообщение в mqttx, должно прийти подтверждение об успешной или неудачной операции. Однако после публикации отображается переподключение устройства, соединение установлено. По всей видимости, с подключением устройства проблем нет, если нет ответа, возможно, проблема в подписке, но я выполнял все действия в соответствии с инструкциями.

Похоже, вы столкнулись с очень типичной проблемой при использовании MQTTX для имитации связи по модели устройств OneNET: «Сразу после публикации сообщения происходит переподключение, а на стороне облака записей нет».

Обычно это происходит не из-за плохого соединения, а потому что серверная часть OneNET, получив ваше сообщение, обнаруживает, что оно не соответствует спецификации протокола или определению модели устройства, и в целях защиты сервера сразу принимает меры «принудительного отключения соединения».

Мы можем проверить следующие основные причины:

1. Несоответствие идентификаторов модели устройства (Identifier)

OneNET крайне строго проверяет поле params в JSON.

  • Проверьте: Убедитесь, что идентификаторы свойств, определённые вами в облаке, действительно называются air_CO2 и air_humidity?
  • Внимание: Идентификаторы чувствительны к регистру. Если в облаке определено Air_CO2, а вы отправляете air_CO2, OneNET сочтёт данные недопустимыми и отключит вас.

2. Формат JSON и типы данных

Судя по вашему скриншоту, структура JSON в целом правильная, но есть одна деталь:

  • Тип значений: После value указано строковое значение \"500\" (в двойных кавычках). Если в облаке OneNET вы определили air_CO2 как тип int или float, здесь нельзя использовать кавычки.
  • Рекомендация по исправлению:
    "air_CO2": {
        "value": 500,  // Убрать кавычки
        "time": 1706673129818 
    }
    

3. Слишком устаревший временной штамп (Timestamp)

В вашем сообщении time1706673129818 (соответствует январю 2024 года).

  • Риск: Хотя некоторые платформы позволяют передавать исторические данные, если временная метка сильно расходится с текущим временем сервера (2026 год), это может активировать механизмы безопасности или фильтрации данных на платформе.
  • Тест: Попробуйте удалить поле time полностью или заменить его на текущий временной штамп. По умолчанию OneNET будет использовать время получения сообщения сервером.

4. Не подписались на топик ответа (Post_reply)

Вы упомянули: «Если не приходит ответ, возможно, проблема с подпиской». В протоколе модели устройств OneNET:

  • Вы публикуете в топик: $sys/{pid}/{device-name}/thing/property/post
  • Топик ответа от облака: $sys/{pid}/{device-name}/thing/property/post_reply
  • Решение: Вам нужно заранее нажать “New Subscription” в MQTTX и подписаться на этот топик с суффиксом _reply. Только после подписки вы сможете увидеть в окне MQTTX подтверждение или код ошибки после обработки запроса облаком.

5. Проверьте журналы платформы OneNET

На вашем втором скриншоте показано, что «журнал событий» пуст. Рекомендуем переключиться на «Журнал операций» или просмотреть реальные логи в разделе «Отладка устройства».

Если подключение установлено успешно, но публикация не удалась, в журнале операций OneNET обычно фиксируется конкретный код ошибки (например: сбой разбора формата данных).


:light_bulb: Рекомендуемые шаги тестирования:

  1. Упростите сообщение: Отправьте только одно самое простое свойство, без временного штампа, без кавычек.
    {
      "id": "123",
      "version": "1.0",
      "params": {
        "air_CO2": {
          "value": 500
        }
      }
    }
    
  2. Подпишитесь на Reply: Перед публикацией убедитесь, что вы подписаны на $sys/24A1J1S6kn/dev1/thing/property/post_reply.
  3. Наблюдайте за моментом отключения: Если сразу после нажатия «отправить» верхний правый угол MQTTX становится красным — это 100% означает, что Payload (тело сообщения) не соответствует требованиям модели устройства OneNET.

Хорошо, спасибо, я попробую завтра ещё раз. :hand_with_index_finger_and_thumb_crossed: