一. 一机一密方式
该方式需要预先在阿里云平台创建产品,然后在该产品下面创建设备,创建设备后,就可以把每台设备的三元组数据导出来,移交给软件技术/生产人员,在生产设备的时候,将这三元组数据烧录进设备固化,不可改变。三元组信息如下:
"ProductKey": "hlk5cvLyhqQ",
"DeviceName": "MC665_KIT_BOARD",
"DeviceSecret": "2593d5878eb6986c1de194662b5fc7d7"
设备上电运行的时候,需要获取到阿里云的MQTT服务器的登录信息,登录信息格式如下
mqttClientId: clientId+"|securemode=2,signmethod=hmacsha256,timestamp=1663735569812|"
mqttUsername: deviceName+"&"+productKey
mqttPassword: sign_hmac(deviceSecret,content)
其中 clientId ,阿里云的规则productKey+“.”+deviceName,据说可以用户自定义,具体没做测试,clientId 最长64字符长度
securemode=2,TLS加密方式,2代表TLS1.2,目前阿里是TLS1.2
signmethod=hmacsha256, mqtt登录密码算法类型
timestamp=1663735569812,当前时间的ms值,这个可以任意
deviceName,是三元组中的设备名字符串
productKey,是三元组中的产品key字符换
sign_hmac(deviceSecret,content), mqtt登录密码计算,采用上面的signmethod指定的方式进行计算
mqttClientId = "hlk5cvLyhqQ.MC665_KIT_BOARD|securemode=2,signmethod=hmacsha256,timestamp=1663735569812|"
mqttUsername = "MC665_KIT_BOARD&hlk5cvLyhqQ"
mqttPassword 中的 content形式如下:
content="clientId"+clientId+"deviceName"+deviceName+"productKey"+productKey+"timestamp"+timestamp
注意:打引号的是固定的字符,+号后面是对应的字符串, 那么以上面的三元组为例:
content="clientIdhlk5cvLyhqQ.MC665_KIT_BOARDdeviceNameMC665_KIT_BOARDproductKeyhlk5cvLyhqQtimestamp1663735569812"
将 content 字符串 以及 DeviceSecret 字符串使用 hmacsha256 方式进行编码得到阿里云IOT MQTT服务器登录密码:
mqttPassword: "46b3be36087ab83d2727da54744e72f7e27e8eb3e5d165fd992c60c1ba18cfae"
目前登录密码的计算,如果只是验证,可以打开这个在线算法
https://1024tools.com/hmac
将 content 和 DeviceSecret 输入,选择 hmacsha256 方式 ,如下图
剩下的就是 mqttHostUrl 和 Port 了,阿里的mqtthost格式如下
productId+".mqtt.iothub.aliyuncs.com"
其中 productId 是创建产品的时候生产的产品id号,所有该产品下的设备全部使用改字符串,以我个人的为例,host主机地址如下:
"iot-06z00d7339t28su.mqtt.iothub.aliyuncs.com"
Port则固定为 1883
至此,登录服务器的信息全部搞清楚了,使用mqtt.fx1.7.1进行测试,设置画面如下:
另外,还有一个是TLS加密的需要设置,阿里云必须使用加密方式进行通信,好像原来可以不用加密通信,后来就改了,客户端访问mqtt服务器,必须要安装服务器端的根证书,阿里云的根证书从该页面下载: https://help.aliyun.com/document_detail/73742.html
下载证书文件,不做任何更改,然后在mqtt.fx中加载证书文件,如下图:
然后,保存退出设置窗口,在mqtt.fx 主页面点击"connect"按钮,就可以连接到阿里云,然后进阿里云产品-设备中可以看见设备已经上线.
二.基于设备的处理
以上操作都是基于上位机进行测试的,如果面对设备有2个地方需要注意:
- mqtt密码的算法,有3个办法解决
方法一: 当设备创建后,可以到阿里云平台的设备管理页面里面直接查看mqtt连接所需的所有参数信息,如下图
实际上,只要将该信息直接存储到设备,固化先来就可以,设备每次上电后,就可以直接使用这些参数连接阿里云mqtt了,这样也就不用设备端计算算mqtt的登录密码,可以简化不少设备端的工作.
方法二: 直接使用阿里的设备端的linkSDK库,将SDK库源码加载到设备软件开发工程中,按照demo例程设置对应的三元组就可以实现,该库集成了整个通信架构,集成mqtt通信协议栈,TLS加密, hamcsha256算法库,以及所有必须的操作库等等,开发人员只需要自行编写通信模块的驱动 和 应用业务逻辑 就可以了.
方法三: 自行实现 hamcsha256算法库,对于不懂的技术人员,可以找找源码库,移植以下,也可以实现.
- 阿里服务器的证书的加载
一般都是使用MCU+网络通信模块来开发设备,加载证书需要网络模块支持才行,现在一般都具备这些功能,对于网络通信模块,如果使用linkSDK进行开发,则需要具备基本的TCP功能 和 TLS功能就可以了.有的通信模块本身就集成了阿里云的mqtt通信功能,这样开发起来最简单,MCU直接发指令就可以实现,通信管理的工作都交给通信模块,技术人员只需要实现连接,订阅,处理报文就可以了.