<p><iframe name="ifd" src="" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>


 

前言

这节测试下使用STM32+MN316和 Android 和 微信小程序 和 网页端 接入阿里云物联网平台

当前的各种物联网平台整体思想是提供一个网页端让用户去注册设备

这个设备就对应一个MQTT客户端,然后把这个设备的信息放到单片机/APP/微信小程序上使用.

单片机/APP/微信小程序等就作为了客户端接入了物联网平台.

物联网平台应该说是对设备进行管理的平台.

 

开通阿里云物联网平台

https://www.aliyun.com/

1.搜索阿里云物联网平台(如果没有开通请自行开通)

java 阿里小程序获取用户id_java 阿里小程序获取用户id

 

 

创建产品(并在产品下面添加设备)

1.咱们做产品的时候,一般都是有个产品.

java 阿里小程序获取用户id_java 阿里小程序获取用户id_02

 

 

2.设置下产品的名称

java 阿里小程序获取用户id_客户端_03

 

 

 

3.产品弄好了,就要在产品下面挂上设备

java 阿里小程序获取用户id_java 阿里小程序获取用户id_04

 

 

 

4.设置下添加的设备的名字

java 阿里小程序获取用户id_客户端_05

 

 

java 阿里小程序获取用户id_单片机_06

 

 

java 阿里小程序获取用户id_IP_07

 

 

 

注意:看看自己的这里是那个区域的,后面会用到

java 阿里小程序获取用户id_java 阿里小程序获取用户id_08

 

提示:后面咱就会使用下面三个参数(三元组)组合MQTT参数

"ProductKey": "a1m7er1nJbQ","DeviceName": "Mqtt","DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"

 

https://help.aliyun.com/document_detail/86706.html    阿里云的说明文档

 

现在看MQTT的IP地址是怎么组合的

java 阿里小程序获取用户id_IP_09

 

"ProductKey": "a1m7er1nJbQ","DeviceName": "Mqtt","DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"

 

${YourProductKey}.iot-as-mqtt.${region}.aliyuncs.com

 

1.替换ProductKey:

a1m7er1nJbQ.iot-as-mqtt.${region}.aliyuncs.com

 

2.替换 ${region}

java 阿里小程序获取用户id_单片机_10

 

 

 

java 阿里小程序获取用户id_java 阿里小程序获取用户id_11

 

 

 

java 阿里小程序获取用户id_单片机_12

 

3.最终IP地址:

a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com

 

以上是旧版本的物联网平台IP组合方式,现在看新版本的

 

1,如果有这个实例ID 说明是新版本

java 阿里小程序获取用户id_java 阿里小程序获取用户id_13

 

 

 

 

2,进入公共实例, 然后右上角有个 查看开发配置

java 阿里小程序获取用户id_单片机_14

 

 

 

3,这里会显示连接的节点(IP地址)

MQTT的IP地址拼接方式:   {实例ID}.mqtt.iothub.aliyuncs.com

假设我的实例ID为: iot-06z00gtzj0z0000

那么我的IP地址:  iot-06z00gtzj0z0000.mqtt.iothub.aliyuncs.com

java 阿里小程序获取用户id_IP_15

 

 

 

 

 

现在看MQTT的端口号是什么

java 阿里小程序获取用户id_java 阿里小程序获取用户id_16

 

 

现在看MQTT的Client ID是怎么组合的

java 阿里小程序获取用户id_客户端_17

 

 

 

1.我就规定我的前面的clientId是  112233445566 (这个任意)

2.咱呢先不走SSL,  所以  securemode=3 (注意:即使走SSL,端口号也是1883)

3.最后一个呢,咱就选用 hmacsha1(这个选择的是计算MQTT密码的算法)

最终MQTT的 Client ID:

112233445566|securemode=3,signmethod=hmacsha1|

 

客户端(设备)连接的MQTT的用户名

{"ProductKey": "a1m7er1nJbQ","DeviceName": "Mqtt","DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"}

java 阿里小程序获取用户id_单片机_18

 

 

 

最终用户名: Mqtt&a1m7er1nJbQ

 

客户端(设备)连接的MQTT的密码

{"ProductKey": "a1m7er1nJbQ","DeviceName": "Mqtt","DeviceSecret": "7GUrQwgDUcXWV3EIuLwdEvmRPWcl7VsU"}

 

java 阿里小程序获取用户id_客户端_19

 

 

java 阿里小程序获取用户id_IP_20

 

 

 

java 阿里小程序获取用户id_java 阿里小程序获取用户id_21

 

 

 

 

java 阿里小程序获取用户id_IP_22

 

 

所以MQTT连接的密码

8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE

 

 

最终

IP地址:     a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com

端口号:    1883

Client ID: 112233445566|securemode=3,signmethod=hmacsha1|

用户名:    Mqtt&a1m7er1nJbQ

密码:       8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE

 

测试

1.打开MQTT调试助手

java 阿里小程序获取用户id_客户端_23

 

 

 

java 阿里小程序获取用户id_单片机_24

 

 

java 阿里小程序获取用户id_单片机_25

 

 

java 阿里小程序获取用户id_IP_26

 

2.填入相应的参数,点击连接

java 阿里小程序获取用户id_IP_27

 

 

 

java 阿里小程序获取用户id_客户端_28

 

使用网页端调试助手连接

1.关闭测试软件

注:一开始说了,一个设备就作为一个MQTT客户端,也只能一个设备使用.

java 阿里小程序获取用户id_java 阿里小程序获取用户id_29

 

2.打开网页端调试助手

java 阿里小程序获取用户id_java 阿里小程序获取用户id_30

 

java 阿里小程序获取用户id_单片机_31

 

 

 

java 阿里小程序获取用户id_java 阿里小程序获取用户id_32

 

3.WS方式:

IP地址: ws://a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com:443/mqtt

ClientID: 112233445566|securemode=3,signmethod=hmacsha1|

用户名: Mqtt&a1m7er1nJbQ

密码: 8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE

java 阿里小程序获取用户id_java 阿里小程序获取用户id_33

 

 

4.WSS方式:

IP地址: wss://a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com:443/mqtt

ClientID: 112233445566|securemode=2,signmethod=hmacsha1|

用户名: Mqtt&a1m7er1nJbQ

密码: 8B286A9E99B49E19A0964589E8F3C2DBB1C1A8DE

java 阿里小程序获取用户id_客户端_34

 

 

 

 

使用单片机连接

1.关闭测试软件

注:一开始说了,一个设备就作为一个MQTT客户端,也只能一个设备使用.

 

java 阿里小程序获取用户id_客户端_35

 

 

2.安装好模组

单片机都是使用串口2和模组进行通信, 开发板只安装上NB模组

java 阿里小程序获取用户id_java 阿里小程序获取用户id_36

 

 

3.打开这节的单片机程序,修改为阿里云的设备参数.

java 阿里小程序获取用户id_客户端_37

 

 

java 阿里小程序获取用户id_单片机_38

 

 

 

 

4.使用单片机串口1打印串口日志(115200)

 

java 阿里小程序获取用户id_java 阿里小程序获取用户id_39

 

5.然后下载程序到单片机,查看日志

java 阿里小程序获取用户id_IP_40

 

 

 

java 阿里小程序获取用户id_IP_41

单片机程序说明

1,串口2接收模组数据的时候,单独使用一个缓存,缓存了TCP接收的数据

 

java 阿里小程序获取用户id_客户端_42

 

java 阿里小程序获取用户id_客户端_43

 

 

 

2.整体概况

java 阿里小程序获取用户id_IP_44

 

 

 

 

①:控制模块连接TCP服务器(MQTT服务器)

②:计算MQTT密码

③:MQTT消息处理封装包(缓存管理,支持消息等级0,1,2)

④:使用Mbedtls里面的sha1或者md5 计算密码文件

 

 

3.初始化MQTT,注册相应的回调函数 

我编写的包是以注册回调函数的形式使用.

java 阿里小程序获取用户id_客户端_45

 

 

java 阿里小程序获取用户id_单片机_46

 

 

4.先使用TCP连接上TCP服务器(MQTT服务器就是TCP服务器嘛)

java 阿里小程序获取用户id_IP_47

 

 

java 阿里小程序获取用户id_单片机_48

 

 

这个里面还有使用模组的唯一码作为ClientID

 

 

java 阿里小程序获取用户id_IP_49

 

 

5.连接上TCP以后,发送连接MQTT协议

java 阿里小程序获取用户id_单片机_50

  

(关于组合计算密码在最后面会有详细说明)

java 阿里小程序获取用户id_java 阿里小程序获取用户id_51

 

 

6.发送连接协议给服务器以后,如果服务器返回连接成功消息,便会调用MQTT连接成功回调函数

java 阿里小程序获取用户id_单片机_52

 

 

java 阿里小程序获取用户id_IP_53

 

 

java 阿里小程序获取用户id_java 阿里小程序获取用户id_54

 

 

7.轮训 mqtt_send_function 函数

只要是连接上MQTT了,用户只需要在任意地方调用订阅主题(mqtt_subscribe)和发布消息(mqtt_publish)就可以.

用户调用其api函数所打包的数据会存储在mqtt内部缓存管理里面,然后内部自动把数据通过tcp发送出去.

 

 

 

 

java 阿里小程序获取用户id_客户端_55

 

 

 

java 阿里小程序获取用户id_单片机_56

 

 

 

8.接收消息

连接MQTT成功以后收到的服务器发送的数据需要让 mqtt_read_function函数处理, 该函数内部会处理消息并调用相应的回调函

java 阿里小程序获取用户id_单片机_52

 

 

java 阿里小程序获取用户id_客户端_58

 

 

java 阿里小程序获取用户id_java 阿里小程序获取用户id_59

 

 

 

使用Android连接

1.打开本节的Android工程

java 阿里小程序获取用户id_单片机_60

 

2.修改参数

注意:一开始说了,一个设备就作为一个MQTT客户端,也只能一个设备使用.

或者也可以再注册个设备,然后把参数给APP使用.

如果多个客户端用的同一个设备的参数,就会互相挤掉线.

 

java 阿里小程序获取用户id_java 阿里小程序获取用户id_61

 

 

 

4.安装到手机以后查看下日志

 

java 阿里小程序获取用户id_客户端_62

 

 

Android程序说明

1.整体说明

java 阿里小程序获取用户id_IP_63

 

 

 

org.eclipse.paho.client.mqttv3-1.2.0: 使用的mqtt的jar包

MyMqttClient 是再次封装的class文件

 

2.根据参数拼接MQTT信息

java 阿里小程序获取用户id_java 阿里小程序获取用户id_64

 

 

 

3.计算密码

java 阿里小程序获取用户id_单片机_65

 

 

 

4.连接MQTT服务器

java 阿里小程序获取用户id_单片机_66

 

 

 

java 阿里小程序获取用户id_客户端_67

 

 

 

 

使用微信小程序连接

1.打开工程

java 阿里小程序获取用户id_单片机_68

 

 

2.修改MQTT参数

注意:一开始说了,一个设备就作为一个MQTT客户端,也只能一个设备使用.

或者也可以再注册个设备,然后把参数给小程序使用.

如果多个客户端用的同一个设备的参数,就会互相挤掉线.

java 阿里小程序获取用户id_IP_69

 

3.如果想快速测试,可以设置软件不校验服务器域名(测试的时候这样方便点)

java 阿里小程序获取用户id_java 阿里小程序获取用户id_70

 

4.不过还是建议在微信小程序平台上设置域名白名单

java 阿里小程序获取用户id_IP_71

 

 

注:wss://阿里云的域名

我的设备接入的域名是:  a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com

java 阿里小程序获取用户id_IP_72

 

 

 

 

5.正常运行以后,控制台会打印

java 阿里小程序获取用户id_单片机_73

 

 

 

微信小程序源码说明

1.整体说明

java 阿里小程序获取用户id_java 阿里小程序获取用户id_74

 

 

paho-mqtt.js : 底层MQTT包

mqtt.js : 在底层包之上封装的包

hmac_sha1.js : 计算MQTT密码

public.js : 公共函数

 

2.连接MQTT

java 阿里小程序获取用户id_IP_75

 

 

 

java 阿里小程序获取用户id_单片机_76

 

 

 

关于单片机密码计算

1.密码计算需要sha1或MD5,我单片机移植了Mbedtls

java 阿里小程序获取用户id_单片机_77

 

 

 

2.密码计算的第二种方式 

java 阿里小程序获取用户id_客户端_78

 

3.按照官方说明拼接参数

java 阿里小程序获取用户id_单片机_79

 

 

 

4.使用加密算法计算密码

aly_hmac_sha1((char *)tcp_mqtt_buff,strlen((char *)tcp_mqtt_buff),DeviceSecret,strlen(DeviceSecret),(unsigned char *)mqtt_password);

这个函数是自己添加的程序

java 阿里小程序获取用户id_java 阿里小程序获取用户id_80

 

5.上面源码可以看出, 不是用sha1普通的计算下.

其实是阿里云平台这样规定的组合计算

java 阿里小程序获取用户id_IP_81

 

 

 

java 阿里小程序获取用户id_客户端_82

 

 

java 阿里小程序获取用户id_客户端_83

 

 

 

 

java 阿里小程序获取用户id_IP_84

 

用户也可以用阿里云提供的 SDK包里面的程序文件实现计算密码.

 

结语

再重复一句话,在物联网平台上面,一个产品就是一个MQTT客户端.

如果客户想多个设备连接云平台就需要自己多创建几个设备.

设备(MQTT客户端)上报数据在云平台显示,见后面章节.