请问为啥我用mqttx测试,现在订阅话题了,想要发布话题的时候,重新连接,发布不了消息,已经连接了,但也没有消息记录

用的什么平台?

问题描述详细一点!环境,平台,做了什么操作,有什么现象,目的是什么

,用的onenet云平台,现在想要实现一个mqttx与云平台数据通信。正常订阅话题后,我在这个mqttx上发布消息,应该回复正确或错误。但是发布后就显示设备重连,连接成功。应该设备连接没什么问题,如果不回复是不是订阅出了问题,但我都是按照正常操作来的。

看来你在使用 MQTTX 模拟 OneNET 物模型通信时遇到了一个非常典型的问题:“一发布消息就重连,且云端没记录”

这通常不是因为网络不好,而是因为 OneNET 的服务端在收到你的报文后,发现报文不符合协议规范物模型定义,为了保护服务器,它直接采取了“强制断开连接”的措施。

我们可以从以下几个核心原因排查:

1. 物模型标识符(Identifier)不匹配

OneNET 的物模型对 JSON 中的 params 字段校验极其严格。

  • 检查: 请确认你在云端定义的属性标识符是不是真的叫 air_CO2air_humidity
  • 注意: 标识符是区分大小写的。如果在云端定义的是 Air_CO2 但你发的是 air_CO2,OneNET 就会认为是非法数据并踢你下线。

2. JSON 格式与数据类型

从你的截图看,JSON 结构基本正确,但有一个细节:

  • 数值类型: 你的 value 后面跟着的是字符串 "500"(带双引号)。如果在 OneNET 云端你将 air_CO2 定义为 intfloat 类型,这里不能加双引号
  • 修正建议:
    "air_CO2": {
        "value": 500,  // 去掉引号
        "time": 1706673129818 
    }
    

3. 时间戳(Timestamp)过旧

你发送的报文里 time1706673129818(对应 2024 年 1 月)。

  • 风险: 虽然有些平台允许补传历史数据,但如果时间戳与服务器当前时间(2026年)偏差过大,可能会被触发平台的安全校验或数据过滤机制。
  • 测试: 尝试把 time 字段整个删掉,或者更新为当前时间戳。OneNET 默认会自动以到达服务器的时间为准。

4. 没有订阅响应话题(Post_reply)

你提到“如果不回复是不是订阅出了问题”,在 OneNET 物模型协议中:

  • 你发布的话题是:$sys/{pid}/{device-name}/thing/property/post
  • 云端的回复话题是:$sys/{pid}/{device-name}/thing/property/post_reply
  • 解决: 你需要在 MQTTX 中提前点击 “New Subscription”,订阅这个带 _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: