OneNet平台2024版MQTT协议完整开发案例教程【MQTT数据流模式】

一、前言

此篇文章是以智慧路灯项目为例,完整的演示介绍 OneNet平台的开发

OneNet平台 是2024年的新版本,采用数据流模版为例。

方便大家,腾讯云IOTOneNet平台。 因为目前腾讯云IOT平台无法白嫖了,新用户已经无法免费使用了。

二、OneNet平台开发

2.1 OneNet平台介绍

OneNET-中国移动物联网开放平台是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,提供综合性的物联网解决方案,实现物联网设备的数据获取,数据存储,数据展现。

OneNET资源模型如下图:

资源模型

  • 产品(product)
    用户的最大资源集为产品,产品下资源包括设备、设备数据、设备权限、数据触发服务以及基于设备数据的应用等多种资源,用户可以创建多个产品。
  • 设备(device)
    设备为真实终端在平台的映射,真实终端连接平台时,需要与平台设备建立一一对应关系,终端上传的数据被存储在数据流中,设备可以拥有一个或者多个数据流。
  • 数据流与数据点
    数据流用于存储设备的某一类属性数据,例如温度,湿度,坐标等信息;平台要求设备上传并存储数据时,必须以key-value的格式上传数据,其中key即为数据流名称,value为实际存储的数据点,value格式可以,int、float、string、json等多种自定义格式。
  • APIkey
    APIkey为用户进行API调用时的密钥,用户访问产品资源时,必须使用该产品目录下对应的APIkey。
  • 触发器(trigger)
    触发器为产品目录下的消息服务,可以进行基于数据流的简单逻辑判断并触发HTTP请求或者邮件。
  • 应用(application)
    应用编辑服务,支持用户以拖拽控件并关联设备数据流的方式,生成简易网页展示应用。

OneNET常用的术语解释如下:

术语解释别名&曾用名
产品OneNET平台资源(包括设备,APIKey,触发器,应用等)的集合,一个产品对应唯一的masterkey、产品ID,设备注册码,一个产品下包含多个具备同一特征的设备,多个设备之间的唯一性由SN来区分项目
产品IDpid,鉴权信息组之一,创建产品时由平台分配的唯一产品识别码,用于标识唯一个产品,作为设备登录鉴权参数之一项目ID
APIKey用于API调用时的鉴权参数 Master-APIkey:产品下唯一的管理员权限的APIKey,具有管理产品下所有设备的权限,在产品页面获取 Device-APIkey:设备级APIkey,具备与之关联的所有设备的访问权限,在设备详情获取
accessKey安全性更高的访问密钥,用于访问平台时的隐性鉴权参数(非直接传输),通过参与计算并传输token的方式进行访问鉴权
token安全性更高的鉴权参数,由多个参数组成,在通道中直接传输
注册码产品下唯一,可用于真实设备调用注册设备时,作为API的鉴权参数之一
设备归属于某一个产品下,是真实设备在平台的映射,用于和真实设备通过连接报文建立连接关系,平台资源分配的最小单位
鉴权信息组由设备ID,产品ID,设备SN组成的平台内设备唯一的参数组合,真实设备进行设备连接时需要携带有这些参数进行鉴权(参数要求根据设备接入协议不同有一定差异)
设备ID鉴权信息组之一,由平台分配的,在平台范围内设备唯一的识别号
SN鉴权信息组之一,由硬件厂家自定义的设备唯一出厂序列号,创建/注册设备时作为设备参数,在产品内唯一,作为设备连接时的鉴权参数之一auth_info 设备编号
数据流设备属性,可为设备单项数据属性,例如温度=10;也可为设备数据属性的组合,例如坐标=x:10 y:20
数据流模板产品下所有设备均具备的采集数据属性,例如空气质量检测仪均可以上报“PH2.5”“甲醛浓度”等数据
数据点设备每次上传到数据流中的数据
脚本平台支持用户自定义数据解析规则,解析二进制/字符串格式的数据(仅适用于TCP+脚本接入方式)

2.2 创建产品

(1)登录账户

官网:https://open.iot.10086.cn/

进来先登录账号。

image-20240402000239430

(2)选择物联网开放平台

image-20240402000349407

(3)添加产品

image-20240402000427233

根据自己产品信息填写:

image-20240414205253934

image-20240414205321795

创建之后点击确定。

image-20240414205451513

创建完成。

image-20240414205515838

(4)产品ID

产品ID: 98uHEEv82D

2.3 创建设备

产品是属性抽象模型,产品下面的设备就表示具体的硬件设备,需要与具体的硬件关联。产品下可以创建很多的设。

(1)添加设备

image-20240414205553976

(2)填写设备信息

image-20240414205617817

创建完成。

image-20240414205636755

创建完成。

image-20240414205700691

(3)查看设备详情

添加完成之后,点击查看详情,查看设备的详细信息。

image-20240414205711245

image-20240414205731335

这里的产品ID、设备ID、设备密匙非常有用。后续MQTT登录参数需要使用。这里记录一下。

产品ID:  98uHEEv82D
设备ID:  2160589715
设备密匙:NThVNm9pQ3lYbmRvMTVhU0QyM0hXOFhmMXExRlE5T0g=
设备名称:dev1

2.4 添加数据流模板

(1)添加数据流模板

image-20240414205840406

添加数据流模板。

image-20240414205901410

(2)根据设备需求添加

当前设备里,与云端交互的状态有以下几个:

上传到物联网平台的数据属性。

DHT11_T     	环境温度  
DHT11_H     	环境湿度    		
HumanBody_Flag  人体感应    		
BH1750      	环境光强    		  
LED_SW      	路灯开关           
MQ135       	空气质量            
LED_SW_Flag     路灯的状态  0故障  1正常
SOS_Info        SOS紧急求助    
gps             地图定位信息

开始创建:

image-20240414211328445

image-20240414211408744

下面依次创建即可。

(3)添加完毕

image-20240414211549661

添加完成:

DHT11_T环境温度
DHT11_H环境湿度%
HumanBody_Flag人体感应
BH1750环境光强Lux
LED_SW路灯开关
MQ135空气质量
LED_SW_Flag路灯的状态
SOS_InfoSOS紧急求助
gps地图定位信息

2.5 MQTT协议接入地址

当前智能鱼缸设备是采用MQTT协议与OneNet服务器进行通信。

MQTT物联网套件产品架构如下图所示:

image

接入地址说明:https://open.iot.10086.cn/doc/v5/develop/detail/248

在帮助文档页面,介绍了MQTT接入的地址和端口号。 当前设备是单片机,端口采用1883非加密端口。

image-20221205160655279

地址与端口总结如下:

上面的域名转为IP之后信息如下:(如果设备不支持域名解析,可以直接填IP地址)
IP地址: 183.230.40.96
端口号: 1883

2.6 MQTT主题订阅与发布

MQTT协议是一种消息列队传输协议,采用订阅、发布机制,订阅者只接收自己已经订阅的数据,非订阅数据则不接收,既保证了必要的数据的交换,又避免了无效数据造成的储存与处理。因此在工业物联网中得到广泛的应用。

(1)主题订阅

主题订阅是设备订阅平台的消息,如果设备想知道平台下发的消息,就需要订阅主题。

帮助文档: https://open.iot.10086.cn/doc/mqtt/book/device-develop/protocol.html

需要订阅什么数据,设备端按照下面的主题格式填写订阅即可。

image-20221205161140648

如果想知道设备所有相关信息,直接订阅$sys/{产品ID}/{device-name}/#即可。 (其中的PID就是产品ID)

$sys/98uHEEv82D/dev1/#

(2)主题发布

主题发布: 就是设备向平台上传数据。

帮助文档地址:https://open.iot.10086.cn/doc/mqtt/book/example/datapoints.html

文档里介绍了数据点上传的格式:

image-20221104113829775

根据当前设备,总结的格式如下:

发布主题: $sys/98uHEEv82D/dev1/dp/post/json

发布消息:
{"id":123,"dp":{"DHT11_T":[{"v":20}],"DHT11_H":[{"v":10}],"BH1750":[{"v":30}],"MQ135":[{"v":10}],"LED_SW":[{"v":1}],"HumanBody_Flag":[{"v":0}],"LED_SW_Flag":[{"v":0}],"SOS_Info":[{"v":0}],"gps":[{"v":{"lon":108.89921,"lat":34.268685}}]}}

dp对象里面就是需要上传的数据点字段。 这个数据点的名字就是自己创建数据流模板的时候创建的。

数据点是标准的JSON结构:

{
  "id": 123,
  "dp": {
    "DHT11_T": [
      {
        "v": 20
      }
    ],
    "DHT11_H": [
      {
        "v": 10
      }
    ],
    "BH1750": [
      {
        "v": 30
      }
    ],
    "MQ135": [
      {
        "v": 10
      }
    ],
    "LED_SW": [
      {
        "v": 1
      }
    ],
    "HumanBody_Flag": [
      {
        "v": 0
      }
    ],
    "LED_SW_Flag": [
      {
        "v": 0
      }
    ],
    "SOS_Info": [
      {
        "v": 0
      }
    ],
    "gps": [
      {
        "v": {
          "lon": 108.89921,
          "lat": 34.268685
        }
      }
    ]
  }
}

2.7 MQTT三元组生成

设备登录OneNet采用的是MQTT协议,MQTT协议登录需要填写 登录信息:简称 MQTT三元组

(1)生成密码需要的参数

生成密码的软件里需要填写的参数如下:

image-20240414213932354

(2)密匙生成需要的参数

产品ID: 98uHEEv82D
设备key:NThVNm9pQ3lYbmRvMTVhU0QyM0hXOFhmMXExRlE5T0g=

(3)使用Python代码生成MQTT密匙

下面提供了一份Python代码,实现此密码生成的算法。
建议大家,用我提供的代码,使用Python生成密码,不要使用OneNet自带的工具生成。

这样更加简单,不用考虑过期时间问题。非常的方便。你只需要安装好Python环境就可以了。

Python环境搭建: https://blog.csdn.net/xiaolong1126626497/article/details/118497618

完整的代码如下。`

import base64
import hmac
from urllib.parse import quote
import time

# 中国移动官方文档给出的核心秘钥计算算法
def token(id,access_key):  
    version = '2018-10-31'
    res = 'products/%s' % id  # 通过产品ID访问产品API
    # 用户自定义token过期时间
    et = str(int(time.time()) + 63072000) # 设置为2年有效时间
    # 签名方法,支持md5、sha1、sha256
    method = 'sha1'
    # 对access_key进行decode
    key = base64.b64decode(access_key)
    # 计算sign
    org = et + '\n' + method + '\n' + res + '\n' + version
    sign_b = hmac.new(key=key, msg=org.encode(), digestmod=method)
    sign = base64.b64encode(sign_b.digest()).decode()
    # value 部分进行url编码,method/res/version值较为简单无需编码
    sign = quote(sign, safe='')
    res = quote(res, safe='')
    # token参数拼接
    token = 'version=%s&res=%s&et=%s&method=%s&sign=%s' % (version, res, et, method, sign)
    return token

username    = "DGvoS8UR1Q"                                           # 产品ID
accesskey   = "aTF1a2JDc2s0QlNEMFZHU0l6QnJFbDd1Z1oxMUlZOGI="         # accessKey
password = token(username, accesskey)
print(password)

(4)生成MQTT登录密匙

第一步: 填好参数

在这里插入图片描述

第二步:生成密匙

在这里插入图片描述

第三步,复制密匙,待用

version=2018-10-31&res=products%2F98uHEEv82D%2Fdevices%2Fdev1&et=99986799814791288&method=md5&sign=F39nUo4xXMeXxPfSerTfIQ%3D%3D

(5)MQTT登录参数总结

MQTT协议登录时,需要输入3个参数: MQTT-设备ID,MQTT-设备名称,MQTT-密码。

对应OneNet的参数:

MQTT- 设备ID  -----> 就是OneNet的设备名称

MQTT-设备名称-----> 就是OneNet的产品ID

MQTT-密码------------> 就是OneNet的密匙工具生成的密码

下面是对本次的设备做总结:

IP地址: 183.230.40.96
端口号: 1883
clientId: dev1
username: 98uHEEv82D
password: version=2018-10-31&res=products%2F98uHEEv82D%2Fdevices%2Fdev1&et=99986799814791288&method=md5&sign=F39nUo4xXMeXxPfSerTfIQ%3D%3D


订阅主题:  $sys/98uHEEv82D/dev1/#


发布主题: $sys/98uHEEv82D/dev1/dp/post/json

发布消息:
{"id":123,"dp":{"DHT11_T":[{"v":20}],"DHT11_H":[{"v":10}],"BH1750":[{"v":30}],"MQ135":[{"v":10}],"LED_SW":[{"v":1}],"HumanBody_Flag":[{"v":0}],"LED_SW_Flag":[{"v":0}],"SOS_Info":[{"v":0}],"gps":[{"v":{"lon":108.89921,"lat":34.268685}}]}}

2.8 MQTT工具登录测试

前面已经介绍了MQTT协议登录需要用到的参数,以及订阅主题、发布主题的格式,接下来我们通过MQTT工具模拟设备登录OneNet平台,完成数据交互测试。

简单来说: 就是用软件来模拟实际的硬件,登录onenet平台,上传数据,走一下这个流程。

(1)模拟设备登录

接下来根据软件的输入框提示,输入对应的参数,然后登录设备,订阅主题,发布主题即可完成一个流程的测试。

image-20240414214103237

(2)登录OneNet控制台查看设备

在设备列表页面,可以看到设备已经在线了。

image-20240414214130962

在设备详情页面可以看到设备模拟器刚才上传的数据:

image-20240414214207398

地图也可以查看。

image-20240414214229985

到此,设备的云平台已经配置完毕。

三、OneNet可视化界面设计

关于中国移动的OneNet物联网开发平台 的可视化界面使用可以看视频教程:https://www.bilibili.com/video/BV12m421u7A5

四、腾讯云如何替换OneNet

(1)看这个文章:https://blog.csdn.net/xiaolong1126626497/article/details/144806792
在这里插入图片描述
这里就对应了,腾讯云平台文章,一样的内容。 如何得到 订阅、发布主题,以及MQTT登陆参数。

然后得到这些之后,如何替换到你的腾讯云工程之后。

看这个文章
https://blog.csdn.net/xiaolong1126626497/article/details/134781708
在这里插入图片描述
看这里就完成了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DS小龙哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值