MQTT协议连接阿里云

  • 目录

    操作中使用到的相关链接资料

    生活物联平台(飞燕平台)创建项目及产品,MQTT协议调试登录

    准备需要的信息

    一、网络调试助手NetAssist

    CONNECT 报文

    DISCONNECT 报文

    PING报文

    SUBSCRIBE 报文

    UNSUBSCRIBE 报文

    PUBLISH 报文

    二、串口调试助手XCOM(这里需要结合USB-TTL和ESP8266-01S)

    总结


     

    操作中使用到的相关链接资料:

    • 阿里云(飞燕平台):生活物联网平台_智能家居_智能家电_智能设备_语音控制-阿里云 (aliyun.com)
    • 创建项目产品参考步骤:开发自有品牌项目的产品 (aliyun.com)
    • MQTT协议:网上搜索
  • 通过物联网IoT的生活物联平台(飞燕平台)创建项目及产品(可参考开发自有品牌项目的产品_生活物联网平台-阿里云帮助中心的创建项目到添加设别完)设备等待激活(当我们登陆该设备后,就会自动激活了)

  • 设备调试,以下我通过两种调试软件进行设备登录及数据传输:
    • 准备需要的信息:

      MQTT协议连接阿里云_第1张图片


      阿里云物联网平台的域名和端口如下:
      远程主机地址: *.iot-as-mqtt.cn-shanghai.aliyuncs.com (这里的*需要用ProductKey进行替换)
      远程主机端口号:1883
    • 首先简单了解以下MQTT报文格式(详细可参考MQTT协议)
      • MQTT报文格式 -- 固定报文(byte1:控制报文的类型+控制报文类型的标志位;byte2:剩余长度) + 可变报头 + 有效载荷(负载)
    • 一、网络调试助手NetAssist

      • CONNECT 报文

        • 固定报头:

          MQTT协议连接阿里云_第2张图片

        • 可变报头:

          MQTT协议连接阿里云_第3张图片

          5e7a771cb9faddc96376767cf726fa1b.jpeg


          保活时间:64 => 0110 0100(32+16+4=100秒)
        • 负载:
          • 1. 客户端标识符
            • 客户端标识符 :*|securemode=3,signmethod=hmacsha1|,其中*号需要替换成自己三元组中的 DeviceName ,按上图三元组中的信息进行替换
              例:D001|securemode=3,signmethod=hmacsha1|
            • 长度共计 38 字节,实验的时候我们需要发 16 进制的数据。并且简化书写,去掉 0x,然后还要在最前面加上两个字节,表示客户端标识符的长度,最终结果如下:
            • 00 26 44 30 30 31 7C 73 65 63 75 72 656D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 317C
          • 2. 用户名
            • 用户名 :*&#(注意不要把&符号丢了)其中*号需要替换成自己三元组中的 DeviceName ,其中#号需要替换成自己三元组中的 ProductKey
            • 那么按上图三元组中的信息替换 ,用户名就是 :D001&a1efzDjvU4Y
            • 长度共计 16 字节,转为16进制,并且最前面加入表示长度的两个字节,最终结果如下
            • 00 10 44 30 30 31 26 61 31 65 66 7A 44 6A 76 55 3459
          • 3. 密码
            • 密 码 需 要 进 行 一 次 hmacsha1 加 密, 用 三 元 组 中 的 DeviceSecret 做 为 秘 钥 对
            • clientId*deviceName*productKey#加密其中*号需要替换成自己三元组中的 DeviceName ,其中#号需要替换成自己三元组中的 ProductKey
              例:clientIdD001deviceNameD001productKeya1efzDjvU4Y
            • 然后 DeviceSecret 是 585fe87ac7bd7f518121b1ae4295bdd1 ,网上找个在线加密网站http://encode.chahuo.com/,进行一次 hmacsha1加密,如下图所示

              MQTT协议连接阿里云_第4张图片

            • 先选择hmacsha1,输入加密字符和密钥,得到加密结果:
            • eda544bcd934d43f4c7fd7096f26775ff6bcdc7e
            • 得到长度为40字节的加密后结果,转为16进制,并且最前面加入表示长度的两个字节,最终结果如下
            • 65 64 61 35 34 34 62 63 64 39 33 34 64 34 33 66 34 63 37 66 64 37 30 39 36 66 32 36 37 37 35 66 66 36 62 63 64 63 37 65
            • 负载中的 3 个信息都构建好了,那么把 3 个信息按顺序,先是客户端 id,然后是用户名,最后是密码,组合在一起 16 进制如下(2+38+2+16+2+40=100字节)
            • 00 26 44 30 30 31 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 44 30 30 31 26 61 31 65 66 7A 44 6A 76 55 34 59 00 28 65 64 61 35 34 34 62 63 64 39 33 34 64 34 33 66 34 63 37 66 64 37 30 3936 66 32 36 37 37 35 66 66 36 62 63 64 63 37 65
        • 计算固定报头中的剩余长度:
          • 剩余长度 = 可变报头长度 + 负载长度
          • 可变报头是 10 个字节, 负载是 100 个字节,剩余长度= 10 + 100 = 110,110/128 = 0,不需要进位,剩余长度 1 个字节即可,如此固定报头结果如下:10 6E
        • CONNECT 报文的最终结果:
          • 10 6E 00 04 4D 51 54 5404 C2 00 64 00 26 44 30 30 31 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 7468 6F 64 3D 68 6D 61 63 73 68 61 31 7C 00 10 44 30 30 31 26 61 31 65 66 7A 44 6A 76 55 34 59 00 28 65 64 61 35 34 34 62 63 64 39 33 34 64 34 33 66 34 63 37 66 64 37 30 3936 66 32 36 37 37 35 66 66 36 62 63 64 63 37 65
        • 发送最终CONNECT 报文,返回CONNACK报文(20 02 00 00)只包含固定报头和可变报头,没有负载
        • 调试过程:

          MQTT协议连接阿里云_第5张图片

      • DISCONNECT 报文(断开连接)E0 00 无返回值

      • PING报文(用于保活连接)C0 00(回复D0 00)

      • 订阅和发布的Topic在这查找,这里报文就不展开讲了,可以参考MQTT协议

        MQTT协议连接阿里云_第6张图片

      • SUBSCRIBE 报文(订阅请求)

        MQTT协议连接阿里云_第7张图片

        MQTT协议连接阿里云_第8张图片

      MQTT协议连接阿里云_第9张图片

      • UNSUBSCRIBE 报文(取消订阅)

        feb9285f692ef964cd8c346b27bb36bf.jpeg

        e19a1060019625650de33166b463ec3a.jpeg

        UNSUBSCRIBE 报文的负载:
        想取消订阅的 Topic字符串长度(2字节) +想取消订阅的 Topic 字符串
        以前面订阅的Topic为例,想取消订阅的 Topic 字符串
      • PUBLISH 报文(发布消息)

        MQTT协议连接阿里云_第10张图片

        MQTT协议连接阿里云_第11张图片

        MQTT协议连接阿里云_第12张图片

        • 最终 PUBLISH 报文:
          • 30 6E 00 2F 2F 73 79 73 2F 61 31 65 66 7A 44 6A 76 5534 59 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 7274 79 2F 70 6F 73 74 7B 22 70 61 72 61 6D 73 22 3A 7B 22 43 75 72 72 65 6E 74 4875 6D 69 64 69 74 79 22 3A 35 37 2E 33 2C 22 43 75 72 72 65 6E 74 54 65 6D 7065 72 61 74 75 72 65 22 3A 32 31 2E 35 7D 7D
    • 二、串口调试助手XCOM(这里需要结合USB-TTL和ESP8266-01S)

      MQTT协议连接阿里云_第13张图片

      MQTT协议连接阿里云_第14张图片

      • ESP8266-01S的AT指令这里不细说了,简单步骤就是设置AP(连接热点)模式、连接WIFI热点、连接服务器、进入透传、发送数据等
      • AT--测试是否OK
      • AT+CWMODE=1 -- 设置AP模式
      • AT+CWJAP="wifiname","wifipassword" -- 连接WIFI热点
      • AT+CIPSTART="TCP","121.36.42.100",1883 -- 连接华为云服务器
      • AT+CIPMODE=1 -- 准备透传
      • AT+CIPSEND -- 开始透传
      • 发送数据 -- 上面我们计算出的CONNECT 报文和 PUBLISH 报文
  • 总结:

    • 上面所有调试我均测试成功,服务器能够正常通信,可以参考MQTT协议编写更多的报文
    • 调试方法如上,真实设备的报文可以通过代码写好,就不用再计算了,计算有风险,本人在计算中错过错,导致我又花了两个小时看文档,最后坚信自己的方法重新计算才发现问题。
    • 重复一次手动计算有风险,又浪费时间,可以尝试一次不建议每次报文都手动计算。可以通过代码实现。
    • 我的设备是通过ESP8266-01S模块通信STM32F103开发板(开发板不限,有串口就行),主控开发板进行报文计算发送和接收服务器的数据进行解析。
  •  

 

你可能感兴趣的:(MQTT,阿里云,阿里云,人工智能,物联网)