跳转至

设备MQTT接入协议


主题概览

以下主题用于设备与云端通讯:

消息类型 主题 发布/订阅
设备上报属性 attributes/{username} 设备发布
设备上报属性的响应 attributes_response/{username} 设备订阅
设备获取云端属性 attributes_get/{username} 设备发布
设备获取云端属性的响应 attributes_get_response/{username} 设备订阅
云端下发属性至设备 attributes_push/{username} 设备订阅
设备上报事件 event_report/{username} 设备发布
设备上报事件的响应 event_response/{username} 设备订阅
云端下发命令至设备 command_send/{username} 设备订阅
云端下发命令至设备的响应 command_reply/{username} 设备发布
设备上报自定义数据 data/{username}/{identifier} 设备发布
云端下发自定义数据至设备 data_set/{username}/{identifier} 设备订阅

💡 提示

以上自定义数据相关主题中的 identifier,是指自定义数据流标识符。

各主题的使用方法

下面我们逐个介绍各个主题的使用方法。

设备上报属性

设备上报属性使用如下主题:

attributes/{username}

一个简单的属性上报消息如下:

{
  "temperature": 28.5,
  "light": 2000,
  "switch": true
}

设备发布以上消息后,控制台的设备详情页会实时更新显示设备属性的最新值。

设备上报属性的响应

如果我们想知道属性上报是否被云平台成功接受,设备可以订阅如下主题:

attributes_response/{username}

当设备上报属性后,便会通过该主题收到来自云平台的响应消息,如果云平台接收成功,响应消息如下:

{
  "error_code": 0,
  "error_msg": "OK",
  "ts": 1750234507181
}

如果云平台未成功接收,响应消息中会包含错误原因,例如:

{
  "error_code": -1,
  "error_msg": "Device message frequency too fast, please wait for a moment",
  "ts": 1750234507181
}

该错误表示属性上报间隔太短,所以云平台会自动忽略过于频繁的属性上报消息。

⚠️ 注意

此响应消息默认不开启,需要时可在此处开启:设备类型详情页 > 设置 > 云端响应

设备获取云端属性

当设备希望从云平台获取属性当前值时,发送消息到如下主题:

attributes_get/{username}

消息内容格式如下:

{
  "keys": []
}

这表示获取所有属性,也可以指定个别属性,如下:

{
  "keys": ["temperature", "humidity"]
}

设备获取云端属性的响应

请确保设备已经订阅了如下主题:

attributes_get_response/{username}

当设备发送获取属性的消息后,便会通过以上订阅主题,收到如下的响应消息:

{
  "error_code": 0,
  "error_msg": "",
  "attributes": {
    "sz": 3
  },
  "ts": 1750234507181
}

云端下发属性至设备

除了设备主动获取属性以外,我们也需要让设备可以实时接收云平台下发的属性。

确保设备已订阅如下主题:

attributes_push/{username}

当云平台下发属性给设备时,设备会通过以上订阅主题,收到 JSON 结构的消息,例如:

{
  "switch": false
}

这个示例消息显然是通知设备关闭某个开关,设备通过自身的程序实现该功能后,可以接着向云平台上报属性或上报事件,让云平台得到确认。

设备上报事件

通过事件,设备可以向云端报告消息,而不需要上报任何属性。

一个事件由如下内容组成:

  • 事件名称

可以理解为函数名,是事件的唯一表示。

  • 事件参数

可以理解为函数的参数,是 JSON 格式的结构体,包含若干参数。

设备可以随时向云平台上报事件,只需将事件消息发布到如下主题:

event_report/{username}

发布的事件消息格式如下:

{
  "method": "{name}",
  "params": {
    "key1": "{value1}",
    "key2": "{value2}"
  }
}

例如,工厂生产线上的 AI 视觉传感器捕捉到产品数量后,上报事件给云平台,那么消息可能是这样的:

{
  "method": "productFound",
  "params": {
    "count": 3,
    "location": "REGION.B43",
    "tags": "RED",
    "detail": ["100474", "100475", "100342"]
  }
}

设备上报事件的响应

如果我们想知道事件上报是否被云平台成功接收,可以订阅如下主题:

event_response/{username}

当设备上报事件后,便会通过该主题收到来自云平台的响应消息,如果云平台接收成功,响应消息如下:

{
  "error_code": 0,
  "error_msg": "OK",
  "ts": 1750234507181
}

💡 提示

响应消息中的成功,只代表云平台成功收到了事件上报,并不代表对事件进行业务处理的结果。

云平台收到设备的事件上报后,如何处理事件呢?规则引擎便派上用场了,通过规则引擎,您可以将事件实时推送到第三方,或通过规则引擎的云函数实现告警策略,当然还可以实现对其它设备的联动控制。

⚠️ 注意

此响应消息默认不开启,需要时可在此处开启:设备类型详情页 > 设置 > 云端响应

云端下发命令至设备

与事件相反,命令是由云平台向设备主动下发的一组消息,用来实时通知设备执行某个特定的功能。

设备在MQTT连接云平台后,确保订阅如下主题:

command_send/{username}

订阅成功后,设备便处于等待接收命令的状态。当云平台下发命令时,设备便会收到命令消息。

命令消息的格式也是基于 JSON 的结构体,如下:

{
  "method": "{name}",
  "params": {
    "key1": "{value1}",
    "key2": "{value2}"
  },
  "id": "{id}"
}

它和事件消息格式非常类似,只是多了一个 id。您可以认为它就是从云平台向设备的一个远程调用(RPC)。

云端下发命令至设备的响应

设备回复命令发布的主题如下:

command_reply/{username}

设备收到命令消息后,通过自身的代码逻辑实现特定的功能前,可以回复命令,也可以不回复命令。

云平台会自动接收回复命令,并和下发命令进行匹配,一次下发命令只能接收一次回复命令,它们的匹配正是通过使用一致的id来保证。

设备回复命令消息的格式如下:

{
  "method": "{name}",
  "params": {
    "key1": "{value1}",
    "key2": "{value2}"
  }
}

它和命令下发的消息内容完全一样。

设备上报自定义数据

详情浏览 自定义数据流的 MQTT 主题

云端下发自定义数据至设备

详情浏览 自定义数据流的 MQTT 主题