MQTT连接阿里云物联网平台:小白也能轻松搞定

目录

  • 前言
  • 一、MQTT协议基本介绍
  • 二、初步了解阿里云物联网平台创建产品步骤
  • 三、求解阿里云登录所需的参数
  • 四、使用网络调试助手模拟产品登录
  • 1.转换为MQTT登录报文过程
  • 2. 测试
  • 五、使用 mqttfx 登录阿里云
  • 总结

  • 前言

    本次项目使用的是MQTT协议,首先需要了解一下使用的MQTT协议,本篇文章将简单介绍MQTT协议的原理,接着讲解阿里云物联网平台的使用方法,并讲解如何使用网络调试助手模拟连接阿里云物联网平台及mqtt.fx如何连接阿里云平台物联网设备。


    一、MQTT协议基本介绍

    在MQTT协议通讯中,有两个最为重要的角色。它们分别是服务端和客户端。

    MQTT服务端
    MQTT服务端通常是一台服务器。它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。

    MQTT客户端
    MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为成为“发布”信息。而客户端要想从服务端收取信息,则首先要向服务端“订阅”信息。“订阅”信息这一操作很像我们在视频网站订阅某一部电视剧。当这部电视剧上新后,视频网站会向订阅了该剧的用户发送信息,告诉他们有新剧上线了1

    总之,就是客户端不会直接与另一客户端进行通信,而是通过服务器存储并转发消息。而其中说到的订阅操作是我们后面连接上服务器后之后想要收到消息时需要进行的操作。


    二、初步了解阿里云物联网平台创建产品步骤

    使用过阿里云生活物联网平台(飞燕平台)后将无法使用公共实例(新版),使用后会切换回公共实例(旧版)且无法再次变更。新版和旧版最大的区别就是是否收费(旧版的公共实例在实例概览处无ID和开通时间):
    公共实例(新版):收发信息无需收费
    公共实例(旧版):连接时长及收取费用见公共实例计费方式

    接着进入正题,如何在旧版阿里云公共实例平台创建产品:

    1. 注册账号进入阿里云物联网平台
      Alt

    2. 选择创建产品

    3. 创建产品如下图所示
      请添加图片描述

    4. 在刚刚的产品界面选择刚刚创建的产品旁的管理设备按钮

    5. 单击添加设备

    6. 对创建设备进行命名等信息创建(记住devicename最好要填写方便输入的,随机生成的老难打后面,问就是试过)

    7. 创建成功,此时显示未激活

    8. 点击查看进入产品页面,选择下图DeviceSecret旁的查看

    9. 选择一键复制即得到当前产品实现静态连接测试所需要的信息


    三、求解阿里云登录所需的参数

    名字 形式
    HOST_PORT 1883
    HOST_NAME *.iot-as-mqtt.&.aliyuncs.com (可在MQTT连接参数旁的查看-mqtthosturl中复制)
    CLIENT_ID #|securemode=3,signmethod=hmacsha1| (前面的securemode表示加密方法,改为3表示不加密;后面的signmethod表示选取加密方法,这里测试选择简单的hmacsha1算法)
    USER_NAME #&*
    PASSWORD clientId#deviceName#productKey* (需进行hmacsha1加密,加密方法见下文)

    *:productkey
    #:devicename设备名称
    &:所处地名
    其中PASSWORD的hmacsha1加密可进入在线加密网站进行求解,在加密前字符串中输入加入自己三元组参数的结果,而后在密码处输入自己的密码,并选择hmacsha1加密方式,最终结果如下图所示。

    最后得到的参数如下表所示

    名字 结果
    HOST_PORT 1883
    HOST_NAME a1yjZLBNYf0.iot-as-mqtt.cn-shanghai.aliyuncs.com
    CLIENT_ID test|securemode=3,signmethod=hmacsha1|
    USER_NAME test&a1yjZLBNYf0
    PASSWORD a1d68e2804f5b2481146be1479711fa1353fe08d

    四、使用网络调试助手模拟产品登录

    1.转换为MQTT登录报文过程

    根据前面求出的参数,将其转换为MQTT协议所需要的形式,具体报头形式可参考mqtt报文解析中的2.5。

    本例中的报头为:
    10 ?? 00 04 4D 51 54 54 04 C2 00 78
    其中第二个字节??表示10 ??后的报文长度的十六进制,需在计算后填入,其他可原封不动保留。

    数据部分分为前面表中得到的CLIENT_ID,USER_NAME和PASSWORD,其中CLIENT_ID求解为:
    ?? ?? 74 65 73 74 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C
    其中?? ??后面为CLIENT_ID转换为十六进制后的数据,前面的?? ??表示后面数据的长度,这里长度为38个,转换为十六进制可求出?? ??为00 26,即USER_NAME求解为:
    00 26 74 65 73 74 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C
    其中USER_NAME求解为:
    ?? ?? 74 65 73 74 26 61 31 79 6A 5A 4C 42 4E 59 66 30
    其中?? ??后面为USER_NAME转换为十六进制后的数据,前面的?? ??表示后面数据的长度,这里长度为16个,转换为十六进制可求出?? ??为00 10,即USER_NAME求解为:
    00 16 74 65 73 74 26 61 31 79 6A 5A 4C 42 4E 59 66 30
    同理可得PASSWORD为:
    00 28 61 31 64 36 38 65 32 38 30 34 66 35 62 32 34 38 31 31 34 36 62 65 31 34 37 39 37 31 31 66 61 31 33 35 33 66 65 30 38 64

    最后再倒回去求解报头的10 ??中的??,??后数据长度为110,转换为十六进制求得??为6E,即本次登录报文为:
    10 6E 00 04 4D 51 54 54 04 C2 00 78 00 26 74 65 73 74 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 10 74 65 73 74 26 61 31 79 6A 5A 4C 42 4E 59 66 30 00 28 61 31 64 36 38 65 32 38 30 34 66 35 62 32 34 38 31 31 34 36 62 65 31 34 37 39 37 31 31 66 61 31 33 35 33 66 65 30 38 64

    2. 测试

    使用网络调试助手,设置协议类型为TCP Client,服务IP地址为139.196.135.135,服务器端口为1883,发送接收区均设置为HEX格式,然后将登录报文发送,可见接收区收到了20 02 00 00,表示登录成功!

    同时在产品处也可以发现产品已连接。

    登录后需要进行订阅和发布操作,因为我采用的JSON格式的报文,因此这里的订阅报文的具体含义及操作可以参照mqtt报文解析文章。

    补充:将数据转换为十六进制方法

    可将网络协议设置为UDP,并连接本地IP地址,而后在对话框中输入需要转换的数据,点击右下角发送区设置的按十六进制发送,即可将数据转换为十六进制数据。单击发送会在右下角有发送数据数,可快速得到相应数据。

    在后续逐渐熟悉操作后还可以使用简单的数据库语句通过阿里云平台的数据流转实现两个产品间的数据转发,其过程可以参阅MQTT登录云服务器的讲解。


    五、使用 mqttfx 登录阿里云


    点击connect旁边的齿轮进入设置页面,并按照前面求出的表格结合下表对应填好其中所需要的参数。

    名字 对应前面的名字
    Broker Address HOST_NAME
    Broker Port HOST_PORT
    Client ID CLIENT_ID
    User Name USER_NAME
    Password PASSWORD

    将对应数据填好后如下图所示,点击OK。

    点击connect即可连接,这时在设备中也可发现产品已经连接。

    在之前创建的test01产品中找到topic类列表(注意不是设备),选择一个订阅权限的主题,将其复制到mqttfx的Subscribe框中,并将${deviceName}修改为你的设备名字并点击subscribe。


    订阅后返回test设备页面(注意不是产品),在TOPIC列表中就可以看到已订阅的topic,点击发布消息,输入消息数据123后可在mqttfx上看到消息。


    至此,已经完成了订阅一个主题的操作。接着讲讲发布消息的操作。
    首先需要在test01产品中设置对应的功能。选择产品(注意不是设备)。

    点击编辑草稿,添加自定义功能如下图所示:

    同理添加湿度如下图所示:

    记住下图中的标识符,这是在发布JSON消息时数据发布的重要依据。接着点击左下角的发布上线即可添加对应功能

    接着在test01产品(注意不是设备)复制具有上报属性的主题/sys/a1yjZLBNYf0/\${deviceName}/thing/event/property/post,将其中的\${deviceName}换为自己的设备名字后粘贴到mqttfx中的publish框中。

    接着在下列空白处输入如下JSON数据,并点击publish。

    {
     "method" : "thing.event.property.post",
     "params" : {
       "temperature" : 25, 
       "Humidity":26,
        }, 
        "version" : "1.0.0"
    }
    


    可见test设备(注意不是产品)中的物模型数据-运行状态中的数据已经刷新。

    至此,恭喜你已经完成了MQTT服务器的连接,主题的订阅,数据的发布过程。


    总结

    本文带领大家从MQTT的原理定义,到阿里云物联网平台产品及设备的创建,再到MQTT登录报文的分析,再到使用MQTTfx连接服务器、订阅主题、发布消息。其实第四点中登录报文的讲解是可有可无的,但是若是想更深入的了解数据传输,协议运作过程,接触这些报文,拾起计算机网络课程的知识是必不可少的。
    最后也希望本文能够帮助到你!如果有什么问题,欢迎在评论区里一起沟通!


    1. MQTT是什么 ↩︎

    物联沃分享整理
    物联沃-IOTWORD物联网 » MQTT连接阿里云物联网平台:小白也能轻松搞定

    发表评论