001-STM32+Air724UG基本控制篇(阿里云物联网平台)-使用MQTT接入阿里云物联网平台
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/aly.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
前言
这节测试下使用STM32+Air724UG 和 Android 和 微信小程序 和 网页端 接入阿里云物联网平台
当前的各种物联网平台整体思想是提供一个网页端让用户去注册设备
这个设备就对应一个MQTT客户端,然后把这个设备的信息放到单片机/APP/微信小程序上使用.
单片机/APP/微信小程序等就作为了客户端接入了物联网平台.
物联网平台应该说是对设备进行管理的平台.
开通阿里云物联网平台
https://www.aliyun.com/
1.搜索阿里云物联网平台(如果没有开通请自行开通)
创建产品(并在产品下面添加设备)
1.咱们做产品的时候,一般都是有个产品.
2.设置下产品的名称
3.产品弄好了,就要在产品下面挂上设备
4.设置下添加的设备的名字
注意:看看自己的这里是那个区域的,后面会用到
提示:后面咱就会使用下面三个参数(三元组)组合MQTT参数
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "Mqtt",
"DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"
https://help.aliyun.com/document_detail/86706.html 阿里云的说明文档
MQTT的IP地址
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "Mqtt",
"DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"
${YourProductKey}.iot-as-mqtt.${region}.aliyuncs.com
1.替换ProductKey:
a1m7er1nJbQ.iot-as-mqtt.${region}.aliyuncs.com
2.替换 ${region}
最终IP地址:
a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com
客户端(设备)连接的MQTT的端口号
MQTT的Client ID
1.我就规定我的clientId是 112233445566
2.咱呢先不走SSL, 所以 securemode=3 (注意:即使走SSL,端口号也是1883)
3.最后一个呢,咱就选用 hmacsha1(这个选择的是计算MQTT密码的算法)
最终Client ID:
112233445566|securemode=3,signmethod=hmacsha1|
客户端(设备)连接的MQTT的用户名
{
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "Mqtt",
"DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"
}
最终用户名: Mqtt&a1m7er1nJbQ
客户端(设备)连接的MQTT的密码
{
"ProductKey": "a1m7er1nJbQ",
"DeviceName": "Mqtt",
"DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"
}
所以MQTT连接的密码
8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE
最终
IP地址: a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com
端口号: 1883
Client ID: 112233445566|securemode=3,signmethod=hmacsha1|
用户名: Mqtt&a1m7er1nJbQ
密码: 8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE
测试
1.打开MQTT调试助手
2.填入相应的参数,点击连接
使用网页端调试助手连接
1.关闭测试软件
注:一开始说了,一个设备就作为一个MQTT客户端,也只能一个设备使用.
2.打开网页端调试助手
3.提示:
WS方式:
IP地址: ws://a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com:443/mqtt
ClientID: 112233445566|securemode=3,signmethod=hmacsha1|
用户名: Mqtt&a1m7er1nJbQ
密码: 8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE
WSS方式:
IP地址: wss://a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com:443/mqtt
ClientID: 112233445566|securemode=2,signmethod=hmacsha1|
用户名: Mqtt&a1m7er1nJbQ
密码: 8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE
使用单片机连接
1.关闭测试软件
注:一开始说了,一个设备就作为一个MQTT客户端,也只能一个设备使用.
2.打开这节的单片机程序
3.别忘了安装好手机卡和天线
4.串口1在程序里面作为了日志打印输出口
用户可以打开串口调试助手观察日志
5.修改为阿里云的设备参数.
那个ClientID可以随意写,一般用设备的唯一码代替,我直接写的固定的.
6.然后下载程序到单片机,查看日志
单片机程序说明
1.整体概况
①:控制模块连接TCP服务器(MQTT服务器)
②:计算MQTT密码
③:MQTT消息处理封装包(缓存管理,支持消息等级0,1,2)
④:使用Mbedtls里面的sha1或者md5 计算密码文件
2.关于串口1
串口1作为日志打印,发送数据采用中断+环形队列,
在串口2和串口3发送数据的地方把相应数据发给串口1打印出来.
在串口2和串口3接收数据的地方把相应数据发给串口1打印出来.
3.串口2的空闲中断是使用定时器自定义的,为了兼容GSM模组程序
4.串口2接收的数据,传递给配置函数和MQTT数据处理函数
5.正常运行配置函数 ConfigModuleNoBlock
6.控制模组连接TCP服务器,然后发送连接MQTT协议
7.发送连接MQTT协议(关于组合计算密码在最后面会有详细说明)
8.然后就连接上了,并每隔一段时间发送心跳包和服务器保持连接.
使用Android连接
1.打开本节的Android工程
2.修改参数
注意:一开始说了,一个设备就作为一个MQTT客户端,也只能一个设备使用.
或者也可以再注册个设备,然后把参数给APP使用.
如果多个客户端用的同一个设备的参数,就会互相挤掉线.
4.安装到手机以后查看下日志
Android程序说明
1.整体说明
org.eclipse.paho.client.mqttv3-1.2.0: 使用的mqtt的jar包
MyMqttClient 是再次封装的class文件
2.根据参数拼接MQTT信息
3.计算密码
4.连接MQTT服务器
使用微信小程序连接
1.打开工程
2.修改MQTT参数
注意:一开始说了,一个设备就作为一个MQTT客户端,也只能一个设备使用.
或者也可以再注册个设备,然后把参数给小程序使用.
如果多个客户端用的同一个设备的参数,就会互相挤掉线.
3.如果想快速测试,可以设置软件不校验服务器域名(测试的时候这样方便点)
4.不过还是建议在微信小程序平台上设置域名白名单
注:wss://阿里云的域名
我的设备接入的域名是: a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com
5.正常运行以后,控制台会打印
微信小程序源码说明
1.整体说明
paho-mqtt.js : 底层MQTT包
mqtt.js : 在底层包之上封装的包
hmac_sha1.js : 计算MQTT密码
public.js : 公共函数
2.连接MQTT
关于单片机密码计算
1.密码计算需要sha1或MD5,我单片机移植了Mbedtls
2.密码计算的第二种方式
3.按照官方说明拼接参数
4.使用加密算法计算密码
aly_hmac_sha1((char *)MainBuffer,strlen((char *)MainBuffer),DeviceSecret,strlen(DeviceSecret),MQTTPassWord);
这个函数是自己添加的程序
5.上面源码可以看出不是只是sha1普通计算下.
其实是阿里云平台这样规定的组合计算
用户也可以用阿里云提供的 SDK包里面的程序文件实现计算密码.
结语
再重复一句话,在物联网平台上面,一个产品就是一个MQTT客户端.
如果客户想多个设备连接云平台就需要自己多创建几个设备.
设备(MQTT客户端)上报数据在云平台显示,见后面章节.