腾讯云 MQTT 由服务器生成长期的设备密码

更新日期: 2022-06-09 阅读次数: 226 字数: 850 分类: 物联网

密码过期问题

登录腾讯云管理后台,物联网通信,设备调试。可以看到提示:

以下MQTT三元组仅用于调试,将于2022-09-05 12:00:00后失效,正式设备请按算法生成

Client ID	xxx
MQTT Username	yyy
MQTT Password   zzz

由于嵌入式硬件不方便接入腾讯云的 MQTT SDK,所以改成硬件从服务器获取 Username 和 Password。 然后将密码过期时间设置成 50 年,因为硬件设备的寿命大概也不会超过 10 年。虽然不严谨,但是满足目前的需求场景。

Client ID 格式

${productId}${deviceName}

MQTT UserName 格式

${productId}${deviceName};${sdkappid};${connid};${expiry}

其中各字段含义如下:

  • productId:产品 ID。
  • deviceName: 设备名称。
  • sdkappid:固定填12010126。
  • connid :一个随机字符串。
  • expiry :表示签名的有效期, 从1970年1月1日00:00:00 UTC 时间至今秒数的 UTF8 字符串。为了规避 2038 问题,需要使用 unsigned int。

MQTT Password 格式

${token};hmac 签名方法

hmac 签名方法: hmacsha256 或 hmacsha1。

算法生成

官方文档:

https://cloud.tencent.com/document/product/634/32546

golang 的实现:

https://zhaoyanbai.com/articles/TencentIotHubMqttUseGolang

腾讯云创建 MQTT 设备的接口

https://cloud.tencent.com/document/product/634/71950

硬件设备何时获取

怎么弄,我只跟你要一次,还是你先生成好,我刷程序的时候,直接写死

先生成设备名,后获取密码。

接口调用逻辑

  • 在硬件设备第一次获取并生成设备 ID 时,调用腾讯云接口创建 MQTT 设备
  • 将接口返回的对称加密密钥存放在数据库中
  • 然后按照密码生成规则,生成三元组信息,也存于数据库中
  • 管理后台可以查看三元组信息

TODO

  • [X] 2022-06-08 Wed AM: 接口一:调用腾讯云接口,创建设备。
  • [X] 2022-06-08 Wed AM: 数据库新增字段:mqtt_client_id, mqtt_username, mqtt_password, mqtt_device_psk
  • [X] 2022-06-08 Wed AM: 接口二:生成三元组信息, 并存储于数据库。要避免重复生成
  • [X] 2022-06-08 Wed AM: 存储对称加密密钥,只有一次机会存储,否则就变成重复创建设备了;或者之后通过接口查询这个对称加密密钥。合理的逻辑是,重复调用这个接口时,改查询设备 psk
  • [X] 2022-06-08 Wed PM: 更新协议文档。并跟嵌入式开发核对是否有问题
  • [X] 2022-06-08 Wed PM: tcp 接口获取三元组信息。硬件设备通过 tcp 发送
  • [X] 2022-06-08 Wed PM: 过期时间调成 50 年
  • [X] 2022-06-08 Wed PM: 需要激活?第一次接入就自动激活了?使用 MQTT.fx 客户端测试成功,确实第一次连接之后,就自动激活了。但是激活跟 enable 是两个概念,设备创建后是默认 enabled.
  • [X] 2022-06-08 Wed PM: 测试程序:模拟设备连接 MQTT 服务器,验证三元组信息是否正确
  • [X] 2022-06-08 Wed PM: 测试 TCP 接口。顺便产生几条数据库设备数据,方便后面的管理后台开发。
  • [X] 2022-06-08 Wed PM: 管理后台:可以查看三元组信息。设置成不可编辑
  • [X] 2022-06-08 Wed PM: 删除测试用的 gin 接口
  • [X] 2022-06-08 Wed PM: 线上更新数据库字段
  • [X] 2022-06-08 Wed PM: 数据表备份
  • 线上部署后台,前端,TCP server

tags: 腾讯云 MQTT MQTT

爱评论不评论