物联网开发平台 自定义 Topic 通信

这篇将介绍设备连接物联网开发平台后,如何通过自定义 Topic 发布和订阅业务消息。当物模型无法满足业务需求,或者需要自行定义 MQTT Payload 数据格式时,可以使用自定义 Topic。

相关产品
物联网开发平台 产品页,含版本规格、价格与购买入口。

一、功能介绍

自定义 Topic 是基于 MQTT 发布/订阅机制提供的自定义消息通道。

自定义 Topic 的前两个层级固定为:

${ProductID}/${DeviceName}

后续层级可以根据业务需要定义,例如:

${ProductID}/${DeviceName}/custom/report${ProductID}/${DeviceName}/custom/control

其中:

Topic 用途
${ProductID}/${DeviceName}/custom/report 设备向云端上报业务数据。
${ProductID}/${DeviceName}/custom/control 设备接收云端下发的业务消息。

自定义 Topic 支持以下设备端操作权限:发布、订阅、发布和订阅。

注意:说明:

二、前提条件

在使用自定义 Topic 进行消息通信前,请确认已完成以下准备:

·已创建产品和设备,详见 创建和删除产品 和 创建设备。

·设备已完成 MQTT 身份认证并成功连接物联网开发平台。

·已配置需要使用的自定义 Topic。

·已根据消息方向配置 Topic 的发布或订阅权限。

注意:说明:

注意:设备实际发布或订阅的 Topic 必须与产品配置的自定义 Topic 保持一致,其中 ${ProductID} 和 ${DeviceName} 应替换为当前设备实际的产品 ID 和设备名称。

三、注意事项

·设备实际使用的 Topic 必须与产品配置的自定义 Topic 保持一致。

·Topic 中的 ProductID 和 DeviceName 应与当前连接设备的身份一致。

·Topic 的发布、订阅权限应与实际消息方向一致。

·自定义 Topic 的 Payload 格式和业务语义由设备端与业务系统自行定义。

·自定义 Topic 与透传 Topic 是不同的通信能力;自定义 Topic 不触发云端解析。

四、步骤 1:准备自定义 Topic

本示例分别使用一个 Topic 进行设备数据上报和消息下发:

Topic 设备权限 用途
${ProductID}/${DeviceName}/custom/report 发布 设备向平台上报业务数据。
${ProductID}/${DeviceName}/custom/control 订阅 设备接收业务消息。

注意:Topic 权限从设备端视角定义。“发布”表示设备向平台发送消息;“订阅”表示设备接收平台下发的消息。设备使用无对应权限的 Topic 时,平台会拒绝该操作。

五、步骤 2:订阅下行 Topic

设备连接平台后,需要订阅用于接收业务消息的自定义 Topic。

以下代码以 Python Paho MQTT 为例。示例假设 MQTT Client 已经完成身份认证并成功连接平台。

subscribe_topic = ( f"{product_id}/{device_name}/custom/control")result, mid = client.subscribe( subscribe_topic, qos=1)if result != 0: print(f"订阅请求失败:{result}")else: print(f"正在订阅:{subscribe_topic}")

订阅成功后,设备需要保持 MQTT 消息循环运行,才能持续接收平台发送的消息。

client.loop_forever()

六、步骤 3:接收并处理下行消息

注册 on_message 回调处理已订阅 Topic 的消息:

def on_message(client, userdata, msg): payload = msg.payload.decode("utf-8") print(f"Topic:{msg.topic}") print(f"Payload:{payload}") # 根据业务协议解析 Payload,并执行设备逻辑client.on_message = on_message

例如业务下发:

{ "command": "set_mode", "mode": "eco"}

设备收到后,可以根据自行约定的 Payload 格式解析 command、mode 等字段并执行对应业务逻辑。

注意:说明:

注意:自定义 Topic 不规定 Payload 的字段结构和业务语义。设备端与业务系统需要自行约定消息格式,并确保双方实现一致。

七、步骤 4:发布上行消息

设备需要上报业务数据时,向具有发布权限的自定义 Topic 发布消息。

例如上报温度和湿度:

import jsonpublish_topic = ( f"{product_id}/{device_name}/custom/report")payload = { "temperature": 26.5, "humidity": 60}info = client.publish( publish_topic, payload=json.dumps(payload), qos=1)if info.rc != 0: print(f"消息发布失败:{info.rc}")

如果需要等待 QoS 1 消息发送完成,可以调用:

info.wait_for_publish()

自定义 Topic 的 Payload 可以根据实际业务自行定义,平台不会按照物模型结构解析其中的业务字段。

八、自定义 Topic 与其他 Topic 的区别

Topic 类型 主要用途 Payload 处理方式
物模型 Topic 属性、事件、行为等标准设备能力。 按物模型协议处理和校验。
透传 Topic 自定义透传数据与物模型之间转换。 –
自定义 Topic 自定义业务消息通信。 Payload 由业务自行定义和解析。

九、常见问题

现象 排查建议
MQTT 已连接,但发布消息失败。 检查 Topic 是否与产品配置一致,并确认设备具有发布权限。
设备订阅失败。 检查 Topic 是否正确,并确认设备具有订阅权限。
业务系统下发消息后设备未收到。 确认设备已经成功订阅对应 Topic,并保持 MQTT 消息循环运行。
收到消息但业务解析失败。 检查设备端与业务系统使用的 Payload 格式、字段和编码是否一致。
希望将私有协议数据转换为物模型数据。 不应使用自定义 Topic 的方式处理,请使用自定义透传及云端解析能力。
赞 (0)
上一篇 4天前
下一篇 4天前