Skip to content

MQTT接入腾讯云物联网平台

本文展示如何使用MQTT协议连接到腾讯云物联网平台,仅展示基础操作,做入门引导使用。

一、平台模拟与测试

开通腾讯网物联网平台示例,我这里展示的是公共实例,价格为(2600元/5年/1000台设备)

点击进入后,如下图:

创建产品

可以粗浅的将产品理解为设备类,单击产品开发菜单,单击新建产品:

这里我们选择自定义类型:

创建好后如下:

定义产品:

定义产品就是声明我们的产品拥有那些属性、事件和行为,这些都是物联网里的基础概念在此不再赘述。

这里有标准功能和自定义功能两种可选,这里我们选择自定义功能(标准功能就是系统为大家预制的一些模板属性)

我们定义一个有四个灯光属性,和一对温湿度属性的设备:

最终定义效果如下:

对应生成的物模型结构如下(也可直接导入该物模型):

json
{
  "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 脚本来生成可用的连接信息:

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,设备名称,设备密钥

bash
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格式:

json
{
    "method":"report",
    "clientToken":"123",
    "params":{
		   "temperature": 36.8,
		    "humidity": 65
       }
}

其中 params 里就是属性和属性对应的值,这里的 clientToken 是设备自己生成的请求标识符,方便平台在回复时告诉你 “我回复的是你哪一次的请求” ,如果你不关心云端应答,也可以随便写。

下面我们使用MQTTX 模拟设备上传温湿度数据:

可以看到,我们还可以在属性下发的主题里看到平台成功接收消息的回复,并且平台端也可以看到当前设备的最新数据,与我们发送的一致:

至此,就完成的设备的属性上报与下发。

二、ESP32对接物联网平台

略(可联系我获取)

三、ESP32动态注册设备

略(可联系我获取)

四、ESP32 OTA设备固件升级

略(可联系我获取)

五、ESP32 蓝牙配网与控制

略(可联系我获取)