OneNet与mqtt.fx联调(包括订阅和发布)(二)

本文通过实例介绍了如何使用OneNet连接模拟设备mqtt.fx和实际设备ESP32进行数据上报与属性设置,包括MQTT配置、设备属性的上报与设置流程,以及解决实际操作中的常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继上一篇OneNet入门之后,这一篇用实际的例子(包括实物和模拟设备)连接到OneNet并进行数据的互传。贴一下官方的订阅和发布的所有例子:物模型数据交互

一、模拟设备(mqtt.fx)

1.下载mqtt.fx

MQTT.fx是一款基于EclipsePaho,使用Java语言编写的MQTT客户端工具。支持通过Topic订阅和发布消息,和物理云平台调试非常方便。可以和物联网平台(如我们的OneNet)进行模拟测试。

mqtt.fx下载官网为:MQTT.fx® Download

 具体版本根据所需下载,我下载的是Windows。(不过,我下载的时候免费版只能使用三个月)

 mqtt.fx的界面如下图:

2.mqtt.fx设备设置

 贴一下基本参数:

MQTT服务器地址:mqtts.heclouds.com

端口号:1883

clientId:设备名称(例:MAINN)

username :平台分配的产品ID(例:82v7h0mSOV)

password :填写经过 key 计算的 token(见token计算)

其他的都默认,不做修改。

参数设置好以后,点击“connect”,就能在OneNet平台看到我们的产品处于在线状态了。

接下来,我们就可以进行订阅和发布操作了,在OneNet官方叫做“通信主题”,见官方文章:

产品开发-设备接入-设备开发-MQTT协议接入-通信主题

由于我只用到了物模型的属性,所以只介绍这一种通信主题。

要重点关注该条主题的操作权限是发布还是订阅,官方的例子是这个。然后我主要介绍圈出来的这两种,因为我觉得这刚好代表了属性的两类操作。

 在介绍这两种操作的具体步骤之前,先简单介绍一下它们:

设备属性上报:指的是把设备的数据(属性)上报到onenet平台,这是一个上行命令。所以能够在设备详情的属性面板看到设备的属性的具体值。

设备属性设置:指的是通过onenet平台设置设备的数据(属性),这是一个下行命令,所以在设备详情的属性面板看不到自己的设置值,只有通过设备属性的上报才能在面板看到我们设置的属性。

 3.设备属性上报

设备属性上报请求topic:$sys/{pid}/{device-name}/thing/property/post                    发布
设备属性上报响应topic:$sys/{pid}/{device-name}/thing/property/post/reply           订阅

pid是product_id的简称,即产品ID,例:82v7h0mSOV

device-name是设备名称,例:MAINN

所以在mqtt.fx中订阅的界面用这句命令:$sys/82v7h0mSOV/MAINN/thing/property/post/reply 

然后点击subscribe,订阅成功。

接下来是发布的topic, $sys/82v7h0mSOV/MAINN/thing/property/post

然后OneJson报文格式如下:

{
	"id": "123",
	"version": "1.0",
	"params":{
		"temp":{
			"value":23
		}
	}
}

id和version都可以自定义,params里面是自己在产品里设置的物模型的属性的标识符,如下图:

把这些内容填好以后点击publish

然后我们就可以在订阅的界面查看到onenet返回数据是否上报成功的信息了

同时,我们也可以在OneNet设备属性界面看到我们刚上传的数据:

4.设置设备属性

设置设备属性和设备属性上报不一样,几乎是完全不一样,导致我调这个的时候巨痛苦,一直不成功,一直显示acc timeout,后来还是求助了官方客服才解决的。真的是一把辛酸泪啊,好了正文马上开始。

设备属性设置请求:$sys/{pid}/{device-name}/thing/property/set                    订阅
设备属性设置响应:$sys/{pid}/{device-name}/thing/property/set_reply           发布        

首先很重要的一点是不要先入为主的认为reply是订阅,在这里由于要设备收到以后相应OneNet,所以,reply是发布。

 具体操作如下,首先,先订阅topic:$sys/82v7h0mSOV/MAINN/thing/property/set

设备订阅好以后,与设备属性上报不同的是,设置设备属性是OneNet对设备的操作,要OneNet平台执行,所以我们需要去到设备调试-应用模拟器界面,向设备发送信息。界面如下:

这里我们设置湿度为55,然后点击属性设置。

点击完以后,就会发现调试日志报错,显示acc timeout,为什么呢?

而且,如下图,我们也能在mqtt.fx界面看到OneNet发布的设置命令,也就是说设备收到了OneNet的命令,那为什么会显示超时?显然是因为虽然OneNet向设备发送了设置属性的topic,但是,设备并没有及时的响应OneNet,告诉OneNet我已经收到数据啦,所以会显示响应超时。接下来就该这样做。

肯定有人注意了,我们只是订阅了,并没有发布啊,对!问题就是发布,我们需要设备在收到OneNet发送的命令后,通过发布一条报文告诉OneNet我收到了数据。

OneJson报文格式如下:

{
	"id": "2",
	"code": 200,
	"msg": "success"
}

 !!!!重要,这条报文的code和msg都是固定的,而id要根据设备订阅的消息的id一致,也就是如下图,这条id!!!!

那问题又来了,测试过发现这条id信息是变化的,我怎么知道id是多少?这个情况只出现在我们自己模拟测试的时候,我们不知道,但是如果是实际的设备是可以判断并返回的(后续会详细分享代码)。好,我们再试一次:

小tips:

这个id会逐次增加,比如第一次是1,第二次就是2,以此类推,这样我们可以提前改好报文,避免超时。

怎么回事,报文也没错,但是还是设置不了,我们看具体的信息dev replied but timeout,设备响应了但是超时了?这就说明,OneNet等待设备响应的时间是很短的,设备收到OneNet的命令后要及时响应,才可以保证设置成功。同样,这在模拟设备上也并不好把握,因为是手动操作的,但是在实际设备是可以保证及时响应的(后续会详细分享代码)。

我们再来一次。

这次,报文正确,及时响应了,所以设置成功!我们也可以在前面讲的操作记录面板看到这个记录:

模拟设备的使用就到这儿咯,其他的topic都是大同小异的,我们就不多赘述了。

二、实际设备(ESP32)

 这一部分我看看哈,可能会记录的不那么详细,因为后面ESP32部分会写的很详细,这里,可能只涉及要点。

1.设备服务器等设置

首先是定义部分:

我感觉图片的注释写得还蛮详细的哈,就不再多解释了。这一部分呢,就是把我们需要的服务器地址、产品ID、设备名称、密码还有订阅、发布的topic、以及报文的模板定义好了。

然后就是把这些信息填入函数,这一步就类似于模拟设备的第2步,设备设置。

2.设备属性上报

这里简单介绍一下吧,这里主要是传了三条数据,分别是湿度、温度和光照度(都是传感器采集的),sprintf函数是在把数据变成OneJson的报文格式,方便传给OneNet的时候它可以识别,esp_mqtt_client_publish就是发布,把数据发布到OneNet平台,就可以实现设备属性上报的功能。在代码里面我设置的是每秒上传一次传感器数据。

3.设置设备属性

基本设置和设备属性上报是一样的,主要介绍塔响应OneNet的代码吧!

这里主要是在设备收到OneNet发来的命令时返回data,也就是前面模拟设备的黑色部分,即告诉我们,OneNet发布的数据,设备是否收到。 然后看到提取id部分,这里就是前面所说的如何知道id的方法,先从data中提取出id,后续操作见下图

比较id是否为123,如果不是123的话,就判断这是设置设备属性返回的命令,一旦收到id非123的信息,就立刻发布报文,让OneNet知道设备收到了这条命令,避免超时。

(其实这里是有BUG的哈,因为设置设备属性的id也可能累加到123,但是因为做的是demo,所以用了我觉得最简单的,其实还可以再加一个判断条件,就可以了,但是太懒了,没写wwwwww) 

后续会出一个OneNet使用过程中常见的问题,wait一下吧!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值