继上一篇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官方叫做“通信主题”,见官方文章:
由于我只用到了物模型的属性,所以只介绍这一种通信主题。
要重点关注该条主题的操作权限是发布还是订阅,官方的例子是这个。然后我主要介绍圈出来的这两种,因为我觉得这刚好代表了属性的两类操作。
在介绍这两种操作的具体步骤之前,先简单介绍一下它们:
设备属性上报:指的是把设备的数据(属性)上报到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一下吧!