MQTT接入腾讯云物联网平台
本文展示如何使用MQTT协议连接到腾讯云物联网平台,仅展示基础操作,做入门引导使用。
一、平台模拟与测试
开通腾讯网物联网平台示例,我这里展示的是公共实例,价格为(2600元/5年/1000台设备)
点击进入后,如下图:
创建产品
可以粗浅的将产品理解为设备类,单击产品开发菜单,单击新建产品:
这里我们选择自定义类型:
创建好后如下:
定义产品:
定义产品就是声明我们的产品拥有那些属性、事件和行为,这些都是物联网里的基础概念在此不再赘述。
这里有标准功能和自定义功能两种可选,这里我们选择自定义功能(标准功能就是系统为大家预制的一些模板属性)
我们定义一个有四个灯光属性,和一对温湿度属性的设备:
最终定义效果如下:
对应生成的物模型结构如下(也可直接导入该物模型):
{
"version": "1.0",
"properties": [
{
"id": "light_1",
"name": "灯1",
"desc": "",
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
},
"required": false,
"from": "custom"
},
{
"id": "light_2",
"name": "灯2",
"desc": "",
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
},
"required": false,
"from": "custom"
},
{
"id": "light_3",
"name": "灯3",
"desc": "",
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
},
"required": false,
"from": "custom"
},
{
"id": "light_4",
"name": "灯4",
"desc": "",
"mode": "rw",
"define": {
"type": "bool",
"mapping": {
"0": "关",
"1": "开"
}
},
"required": false,
"from": "custom"
},
{
"id": "temperature",
"name": "温度",
"desc": "",
"mode": "rw",
"define": {
"type": "float",
"min": "0",
"max": "200",
"start": "0",
"step": "1",
"unit": ""
},
"required": false,
"from": "custom"
},
{
"id": "humidity",
"name": "湿度",
"desc": "",
"mode": "rw",
"define": {
"type": "float",
"min": "0",
"max": "100",
"start": "0",
"step": "0.01",
"unit": ""
},
"required": false,
"from": "custom"
}
],
"events": [],
"actions": [],
"profile": {
"ProductId": "RGK3ZIMRPW",
"CategoryId": "1"
}
}
设备开发与交互开发
点击下一步我们会进入设备开发列表,这里按照模组,SDK,OS提供了几种预制的开发方式,这里我们不选择即可,我们后续自行开发设备,通过MQTT接入物联网平台:
点击Topic列表可以看到一些我们后续可以使用到的通信Topic
继续点击下一步,进入交互开发页面,腾讯云物联网平台提供了生成小程序的能力,但是拓展能力一般,这里我们不使用:
创建设备
在设备调试选项卡页面,点击创建设备:
这里创建一个设备名称为Test_1的设备:
创建好,点击进入,显示如下,这里比较重要的信息是产品IP,设备名称,设备密钥。
设备接入
接下来,我们使用软件MQTTX模拟这个设备,接入物联网平台,目前物联网平台支持的MQTT版本为兼容3.1.1。
建立MQTT连接需要以上认证参数,下面我们来获取认证参数:
此部分可以查看官方文档: https://cloud.tencent.com/document/product/1081/102803
MQTT 协议支持通过设备证书和密钥签名两种方式接入物联网平台,但是设备证书方式只有企业实例可以使用,这里我们选择密钥认证:
其中
- MQTT 服务器连接地址为:
${productId}.iotcloud.tencentdevices.com
${productId}
为变量参数,用户需填入创建产品时自动生成的产品 ID。 - 端口:1883。
- ClientId:
${productId}${deviceName}
- username 字段:
${productId}${deviceName};${sdkappid};${connid};${expiry}
- productId:产品 ID。
- deviceName: 设备名称。
- sdkappid:固定填12010126。
- connid :一个随机字符串。
- expiry :表示签名的有效期,unix 时间戳格式如1704363215。expiry 应该设置为一个远超设备真实生命周期的时间,或由设备侧每次获取当前系统时间时加上一个较大的整数即可。若 expiry 的值小于当前系统时间,MQTT 身份认证将失败。
- password 字段:
${token};hmac 签名方法
, 密码字段生成较为复杂,具体以文档为准。
这里我们可以借助官方提供的Python 脚本来生成可用的连接信息:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import base64
import hashlib
import hmac
import random
import string
import time
import sys
# 生成指定长度的随机字符串
def RandomConnid(length):
return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(length))
# 生成接入物联网平台需要的各参数
def IotHmac(productID, devicename, devicePsk):
# 1. 生成 connid 为一个随机字符串,方便后台定位问题
connid = RandomConnid(5)
# 2. 生成过期时间,表示签名的过期时间,从纪元1970年1月1日 00:00:00 UTC 时间至今秒数的 UTF8 字符串
expiry = int(time.time()) + 60 * 60
# 3. 生成 MQTT 的 clientid 部分, 格式为 ${productid}${devicename}
clientid = "{}{}".format(productID, devicename)
# 4. 生成 MQTT 的 username 部分, 格式为 ${clientid};${sdkappid};${connid};${expiry}
username = "{};12010126;{};{}".format(clientid, connid, expiry)
# 5. 对 username 进行签名,生成token
secret_key = devicePsk.encode('utf-8') # convert to bytes
data_to_sign = username.encode('utf-8') # convert to bytes
secret_key = base64.b64decode(secret_key) # this is still bytes
token = hmac.new(secret_key, data_to_sign, digestmod=hashlib.sha256).hexdigest()
# 6. 根据物联网平台规则生成 password 字段
password = "{};{}".format(token, "hmacsha256")
return {
"clientid" : clientid,
"username" : username,
"password" : password
}
if __name__ == '__main__':
print(IotHmac(sys.argv[1], sys.argv[2], sys.argv[3]))
按照下面的方式运行这个脚本,提供产品ID,设备名称,设备密钥
python3 IotHmac.py "YOUR_PRODUCTID" "YOUR_DEVICENAME" "YOUR_PSK"
就可以获得对应的clientid,username,password
将这些参数输入MQTTX,模拟设备进行连接:
连接成功后,平台端的设备详情会显示激活时间:
至此设备已经成功连接至平台。
设备通信
这里介绍基于物模型的Topic 消息通信,物模型 Topic 的消息上下行需要遵循腾讯云物联网开发平台所约定的物模型协议,平台会对使用物模型 Topic 的消息格式进行业务校验。
这部分建议参考: https://cloud.tencent.com/document/product/1081/34916
设备属性下发:
设备属性下行的 Topic为: $thing/down/property/{ProductID}/{DeviceName}
、其中的动态参数为 产品ID 和 设备名称
我们的设备应该订阅这个主题,以接收来自应用层的控制指令,这里我们依旧使用MQTTX模拟设备,使用MQTTX订阅该主题,注意需更换成自己账号所创建的产品 ID 与 DeviceName
我们在设备调试中控制四个灯全部打开:
可以看到MQTTX模拟的设备成功接收到了控制指令:
当然实际开发环境中,我们下发控制指令一般使用我们直接开发的APP,而APP一般也不会直连MQTT服务器,而是通过平台提供的云 API 进行间接访问,下面我们打开打开 物模型指令控制 的云 API 进行在线调试,这里我们控制四个灯全部关闭:
可以看到模拟设备的MQTTX 依然可以接收到控制指令:
支持设备接收控制指令的链路就走通了,下面介绍设备如何上报数据:
设备属性上报:
属性上报的主题为:$thing/up/property/{ProductID}/{DeviceName}
上报的格式如下,使用标准JSON格式:
{
"method":"report",
"clientToken":"123",
"params":{
"temperature": 36.8,
"humidity": 65
}
}
其中 params 里就是属性和属性对应的值,这里的 clientToken 是设备自己生成的请求标识符,方便平台在回复时告诉你 “我回复的是你哪一次的请求” ,如果你不关心云端应答,也可以随便写。
下面我们使用MQTTX 模拟设备上传温湿度数据:
可以看到,我们还可以在属性下发的主题里看到平台成功接收消息的回复,并且平台端也可以看到当前设备的最新数据,与我们发送的一致:
至此,就完成的设备的属性上报与下发。
二、ESP32对接物联网平台
略(可联系我获取)
三、ESP32动态注册设备
略(可联系我获取)
四、ESP32 OTA设备固件升级
略(可联系我获取)
五、ESP32 蓝牙配网与控制
略(可联系我获取)