密码过期问题
登录腾讯云管理后台,物联网通信,设备调试。可以看到提示:
以下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 聊聊, 查看更多联系方式