通过MQTTX与Onenet云平台进行数据上传和命令下发
文章目录
三、MQTTX与Onenet云平台进行数据上传和命令下发(数据流模型)
四、MQTTX与Onenet云平台进行数据上传和命令下发(物模型数据交互)
前言
本意是想通过Onenet作为服务器代理,然后在我的嵌入式端移植MQTT客户端代码实现两个嵌入式端的互联通信,但是经过一段时间学习发现Onenet并不支持话题自定义,与自己的MQTT客户端代码并不适配。

参考开发文档:
https://open.iot.10086.cn/doc/aiot/fuse/detail/899
官网:(后面很多操作都是在官网平台进行的)
https://open.iot.10086.cn/
一、平台框架
可以通过终端设备(STM32/esp8266等)进行数据上报,在平台中可以进行命令的下发来控制终端设备,也可以通过APP/小程序,调用OneNET下发指令API,通过OneNET平台转发给终端。

二、OneNET中的一些重要的名词解释
产品:产品是一组具有相同功能定义的设备集合,产品下的资源包括设备、设备数据、设备权限、数据触发服务以及基于设备数据的应用等多种资源,用户可以创建多个产品。
产品ID:即参数“product_id”,由平台分配的,在平台范围内产品的唯一识别号,作为设备登录鉴权参数之一。(重要 话题订阅、三元组认证等都需要用到)
设备:归属于某一个产品下,是真实设备在平台的映射,用于和真实设备通过连接报文建立连接关系,平台资源分配的最小单位。
accessKey:安全性更高的访问密钥,用于访问平台时的隐性鉴权参数(非直接传输),通过参与计算并传输token的方式进行访问鉴权。目前平台提供用户、设备、两种类型accessKey。(token的计算需要用到)
属性:用于描述设备的动态特征,包括运行时的状态,应用可发起对属性的读取和设置请求。
数据流与数据点:数据流用于存储设备的某一类属性数据,例如温度,湿度,坐标等信息;平台要求设备上传并存储数据时,必须以key-value的格式上传数据,其中key即为数据流名称,value为实际存储的数据点,value格式可以,int、float、string、json等多种自定义格式。
三元组认证:产品ID、设备名称、设备密钥;
三、MQTTX与Onenet云平台进行数据上传和命令下发(数据流模型)
在进行开发前还需要了解一些概念,数据流模型与物模型
简单来说,数据流模型就是设备端这边直接王云端丢原始的数据(按照格式),平台只负责存,而物模型发送的数据都是有模板的,需要遵守统一标准。
数据流模型:旧版、简单、传原始数据,适合快速测试、小项目。
物模型:新版、标准、结构化,适合正式开发、小程序控制、产品落地。
参考开发文档目录

3.1创建产品
在创建产品之前,您需要了解物联网开放平台提供的产品智能化方式,根据您的需求选择不同的产品智能化方式来开发产品,这决定了您的产品和物联网开放平台平台双向通信时的交互方式。
OneNET物联网开放平台提供了“设备接入” 和“产品智能化”两种方式,以满足客户多应用场景设备开发需求。
•设备接入:提供设备开发、设备调试、数据解析等功能,快速实现设备接入物联网平台,多适用于行业应用场景。
•产品智能化:提供设备面板开发、场景联动、APP控制等功能,快速完成产品智能化改造,多适用于智慧生活场景。
对于 终端设备<--->OneNET平台<--->APP/小程序 的开发路线,我们一般选择设备接入的开发路线,如果你不需要自定义小程序,直接用 OneNET 平台生成的官方 APP / 小程序控制设备。
我们使用设备接入的方式。
进入平台后,点击「产品开发」,选择与自己开发的项目相近的,没有选择其他行业,创建智能化方式为设备接入类,接入协议为MQTT,数据协议为数据流的产品。

选择--设备接入--方式,数据协议为--数据流--。

右边点击[ 设备管理 ],然后再点击[ 添加设备 ],创建一个设备。

在设备管理-设备详情里,查询设备所属产品ID和设备秘钥。

至此产品创建完成。
3.2添加数据流模板
在[ 产品开发 ] 中选择--产品开发--后再选择--创建模板--,添加模板


设备名称在后面将作为我们上传数据时候的使用。
3.3Mqttx接入设备
MQTT设备接入介绍文档位置:
https://open.iot.10086.cn/doc/aiot/fuse/detail/919
我们使用1883非加密端口
打开Mqttx,创建新连接,填写数据;


上面标出来的所有参数中除了token密钥外其余的已经全部知道了;token密钥需要经过计算得到。计算方式如下:

token密钥需要通过工具生成,参考文档https://open.iot.10086.cn/doc/aiot/fuse/detail/1487
res:products/{产品ID}/devices/{设备名称}
et(过期时间),可以根据当前事件填一个未来的时间戳(4092512761为2099年的时间戳)
Key:设备密钥
将参数填写完即可连接上OneNET平台,到OneNET平台可以看到设备在线。

3.4向OneNET上传数据
要想上传数据到OneNET平台中,就需要按照平台指定的话题进行发布和订阅
参考文档位置:https://open.iot.10086.cn/doc/aiot/fuse/detail/923
数据流通信的主题:
所谓的数据点我们可以理解为上边我们创建的数据模板,一个数据点就是一个数据模板。

发布就是设备向平台上传数据,订阅就是设备订阅平台发过来的消息。
知道话题后我们需要上传数据,上传的数据也需要遵守一定的格式:

上传数据点的格式,其中temperature和power就是我们在创建模板的时候命名的名称。
Id为设备自定义的消息序号,用于调试、去重;
dp 是一个键值对对象,键 = 数据流名称(在 OneNET 平台创建的数据流名),值 = 数据点数组;
V 为数据点数组内部字段,v表示value(值),还有t(时间戳)、q(数据质量)字段可选。
temperature和power需要和平台创建的数据流名字一样;
我们可以订阅一个话题用来接收平台的数据,验证数据已经上传到平台:

$sys/{pid}/{device-name}/dp/post/json/accepted
在Mqttx中订阅话题,其中{pid}为产品的ID,{device-name}为设备名称,更改为自己的;

然后我们发布数据点到平台,话题为:$sys/{pid}/{device-name}/dp/post/json

上传数据成功后,可以通过平台上控制台 设备列表 -> 数据流,查看设备上传的数据点

3.5平台下发命令
建立设备连接之后,获取设备命令前,必须先订阅系统命令topic: $sys/{pid}/{device-name}/cmd/request/{cmdid}
topic中{cmdid}为变量,为每条命令的唯一id,可通过通配符的方式进行订阅,比如:$sys/{pid}/{device-name}/cmd/request/+,或者$sys/{pid}/{device-name}/cmd/#

平台下发命令
点击「设备管理」,找到前面创建的设备,点击「详情」,进入命令下发Tab栏
配置下发命令内容与超时时间,点击 下发

MQTTx工具会接收到一条topic消息,如下图所示
本例中的topic为:$sys/t487SaA3oI/hyx_dev_text1/cmd/request/9ff8b64e-ad76-4180-83ee-2aabe83df172

使用MQTTx发布消息至对应topic,模拟设备应答(应答内容为abcd),如下图所示:
应答对应的topic模板为:
$sys/{pid}/{device_name}/cmd/response/{cmdId}
将参数更换为自己的。
本例中,应答对应的topic为:$sys/t487SaA3oI/hyx_dev_text1/cmd/response/17af1a48-91cd-4ca9-b0b5-eeaf6f123276
注意要在应答超时时间内回复,不然平台端会显示显示超时,同时{cmdId}是在平台下发的命令话题中获得的。
平台收到我的应答消息后给我回复的,表明设备应答成功,本利中的话题为:
$sys/t487SaA3oI/hyx_dev_text1/cmd/response/17af1a48-91cd-4ca9-b0b5-eeaf6f123276/accepted

平台收到应答结果;

至此我们就完成了平台与客户端间的连接和命令下发。
后续我们可以通过开发小程序和调用OneNET平台API来实现小程序控制终端设备并且将终端设备数据显示到小程序上。
四、MQTTX与Onenet云平台进行数据上传和命令下发(物模型数据交互)
物模型与数据流模型的创建其实是比较类似的,只是我们在物模型中上传的是属性。
进入平台后,点击「产品开发」,创建智能化方式为设备接入类,接入协议为MQTT,数据协议为--OneJson--,与数据流模型有所差别,数据流模型的话选择 --数据流--。

点击「设备管理」,为之前创建的MQTT协议接入,采用OneJson开发的产品创建一个设备。

在设备管理-设备详情里,查询设备所属产品ID和设备秘钥,本例中,设备接入相关参数如下:

打开mqttx添加一个新连接,其中参数设置方式如下:
Client ID:设备名称
User Name:产品id
Password:token

Token密钥使用token计算工具计算。

订阅属性上报结果通知消息
为了确保设备上传消息确实被平台所接受处理,设备可以订阅系统 topic 获取属性上报结果消息,属性上报回复topic为:$sys/{pid}/{device-name}/thing/property/post/reply

我们进入产品开发页,选择具体的产品,点击「产品开发」,进入产品详情页,进入功能定义流程页,点击「设置物模型」,点击「添加自定义功能点」,创建两个属性功能点,分别为power、temp,添加完成后保存物模型。


属性上报的topic为:$sys/{pid}/{device-name}/thing/property/post
上报数据成功后,订阅的属性上报会返回success
OneJSON请求数据格式:
{
"id": "123",
"version": "1.0",
"params": {
"Power": {
"value": "12345",
"time": 1706673129818
},
"temp": {
"value": 23.6,
"time": 1706673129818
}
}
}
请求参数说明
| 参数 | 类型 | 说明 |
| id | String | 消息id号,用户自定义,String类型的数字,长度限制13位。 |
| version | String | 物模型版本号,可选字段,不填默认为1.0 |
| params | JsonObject | 请求参数,用户自定义,标准json格式。如以上示例中,设备上报了的两个属性Power和WF。具体属性信息,包含属性上报时间(time)和上报的属性值(value)。 |
| time | Long | 属性值生成时间。该参数为可选字段,到毫秒级。根据您的业务场景决定消息中是否带时间戳。如果消息频繁,需根据时间戳判断消息顺序,建议消息中带有时间戳。 |
| value | Object | 上报的属性值 |

注意,如果你在平台设置为了属性的数据类型为int32,则在你发送的数据中valuse后面的参数就必须是整形,不然会发送失败。
点击「设备管理」,找到前面创建的设备,点击「详情」,查看设备上报的属性数据。

设备侧需要收到平台下发的数据,需要订阅:
$sys/{pid}/{device-name}/thing/property/set
物模型的其他话题如图:

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)