NodeMCU (ESP8266) + MQTT 上阿里云IOT (三)

目前我们已经实现了自定义topic的上传和下发数据。那么现在我们来实现物模型数据通信topic中的属性上报。

那么假设我现在还要一个app/微信小程序吧 我也要在app端实时显示比如说 温度。那么按照我的理解应该是订阅一个主题或者然后根据主题信息来解析数据 最终在app端拿到数据并显示。 那么实际上阿里云上这一功能需要怎么实现

两种实现方式

方案 1:继续用「自定义 Topic」(简单直接,适合快速开发)

  1. 工作流程
  • 设备侧:把温度数据发布到自定义 Topic,比如:/k1morxU8ru9/LIGHT1/user/tempReport
  • App / 小程序侧:订阅同一个 Topic,收到消息后直接解析数据。
优点 缺点
开发简单,不用管物模型格式,设备发什么 App 就收什么 数据格式没有统一规范,后续维护和扩展麻烦
不用额外配置,自定义 Topic 已经可以直接用 无法和阿里云物模型数据联动,不能直接用平台的设备状态管理功能

举例:
设备侧
:用你已经会的 AT 指令,通过自定义topic :tempReport 主题定时上报温度。

App / 小程序侧

  • 用阿里云提供的 MQTT SDK,按设备三元组和签名规则连接阿里云;
  • 订阅 /k1morxU8ru9/LIGHT1/user/tempReport 主题;
  • 收到消息后解析字符串 / JSON,把温度值渲染到页面上。

方案 2:用「物模型 Topic」(规范专业,适合长期项目)

这是阿里云官方推荐的方式,能和平台的物模型数据联动,后续还能扩展设备控制、历史数据存储等功能。

  1. 工作流程
  • 设备侧:按物模型标准格式,把温度数据发布到属性上报 Topic: /sys/k1morxU8ru9/LIGHT1/thing/event/property/post
  • 阿里云侧:收到数据后自动解析,更新设备的物模型状态;
  • App / 小程序侧:两种方式拿数据:
    1. 订阅物模型的响应 Topic,实时收到平台转发的设备上报数据;
    2. 直接调用阿里云 IoT 的 API,拉取设备的最新物模型数据(适合非实时场景)。
  1. 优缺点
优点 缺点
数据格式统一规范,和物模型联动,平台自带状态管理 设备侧上报格式必须符合标准,对设备端开发要求稍高
后续扩展方便,比如增加湿度、开关等属性,App 端解析逻辑不用大改 初期需要配置物模型属性(你已经做了温度和主灯开关)
  1. 实现步骤(结合你已配置的物模型)

  2. 设备侧:按物模型格式上报温度

    上报成功后,阿里云物模型里的「温度」属性就会更新。

  3. App / 小程序侧实时接收数据

    • 订阅平台的属性上报响应 Topic: /sys/k1morxU8ru9/LIGHT1/thing/event/property/post_reply
    • 平台收到设备上报后,会自动把响应消息转发到这个 Topic,App 就能实时拿到数据了。
    • 注意,这个post_reply主题只会回复你是否上报成功,不会显示具体的通讯内容

    3.非实时场景(比如页面加载时显示当前温度)

    • 直接调用阿里云 IoT 的 API,通过设备三元组拉取设备的最新物模型数据,不用一直保持 MQTT 长连接。

实操部分

上一节我们已经完成了上云和自定义topic通讯,那么现在我们在上一节的基础上,利用阿里云平台 物模型数据通信来完成物联网的通讯流程。

在"产品","测试a"中找到"物模型数据通信Topic"

先创建一个测试用的,产品--功能定义--点击编辑草稿,添加标准功能或者自定义功能

因为我之前创建过,我就直接用了,没什么难的,这里创建了物模型为:温度

我们发布数据可以用

cpp 复制代码
/sys/k1morxU8ru9/${deviceName}/thing/event/property/post

上报是否成功(状态)通过订阅以下Topic来得到反馈

cpp 复制代码
/sys/k1morxU8ru9/${deviceName}/thing/event/property/post_reply

这里为了在串口上显示的干净,我们关掉数据回显:

cpp 复制代码
//ATE0关掉数据回显,ATE1打开数据回显
ATE0

这里找到我们创建的物模型,打开实时刷新,可以看到温度已经变过来了。

现在我们已经完成了数据上报,那么如果有另外一台设备,或者是小程序,app也需要获取这个数据,怎么办。这里需要用到我们的"消息转发"---"云产品流转"的功能。

我们现在再定义一个topic,用来做消息中转。

用另外一台设备,或者app/小程序来订阅这个topic。

这里我们演示用就还是自己订阅吧,

这里点击返回旧版,更好操作:

前往编辑

点击启动

下面发数据测试:

​​​​​​​

贴一下串口指令

cpp 复制代码
[18:39:15.275]发→◇AT+MQTTPUB=0,"/sys/k1morxU8ru9/LIGHT1/thing/event/property/post","{\"params\":{\"temperature\":55.0}}",1,0
□
[18:39:15.374]收←◆
OK
+MQTTSUBRECV:0,"/sys/k1morxU8ru9/LIGHT1/thing/event/property/post_reply",107,{"code":200,"data":
[18:39:15.414]收←◆{},"id":"null","message":"success","method":"thing.event.property.post","version":"1.0"}

[18:39:15.587]收←◆+MQTTSUBRECV:0,"/k1morxU8ru9/LIGHT1/user/Topic_dingyue",235,{"deviceType":"Lighting","iotId":"EjrZNVuw4FkPicTkHst9k1mor0","requestId":"null","checkFailedData":{},"productKey":"k1morxU8ru9","gmtCreate":1781692756938,"deviceName":"LIGHT1","items":{"temperature":{"time":1781692756926,"value":55}}}

那么我们另外一台设备或者app/小程序在得到这个串口信息就可以解析以得到最新的设备状态了。