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

文章目录

    密码过期问题

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

    以下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

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式