我是靠谱客的博主 优雅啤酒,这篇文章主要介绍MQTT协议连接阿里云操作中使用到的相关链接资料:通过物联网IoT的生活物联平台(飞燕平台)创建项目及产品(可参考开发自有品牌项目的产品_生活物联网平台-阿里云帮助中心的创建项目到添加设别完)设备等待激活(当我们登陆该设备后,就会自动激活了)总结:,现在分享给大家,希望可以做个参考。

  • 目录

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

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

    准备需要的信息

    一、网络调试助手NetAssist

    CONNECT 报文

    DISCONNECT 报文

    PING报文

    SUBSCRIBE 报文

    UNSUBSCRIBE 报文

    PUBLISH 报文

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

    总结


     

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

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

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

      d6f755a427e27c14019e4d782fa5801e.jpeg


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

      • CONNECT 报文

        • 固定报头:

          98ea9c7ece4fe16506f0aed4077b97b5.jpeg

        • 可变报头:

          56bbfb680506b17578c530f3b4143410.jpeg

          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加密,如下图所示

              b712a41e1e8673dc8a34eec3a3e470d8.jpeg

            • 先选择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)只包含固定报头和可变报头,没有负载
        • 调试过程:

          690b4ea62bd43bf4c864b1caf7851ce4.jpeg

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

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

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

        5e542a64ed9e00f3ac91e06b4044ee50.jpeg

      • SUBSCRIBE 报文(订阅请求)

        70a06e75d5ca3622440f257d249a326c.jpeg

        167a4d46d03cf48c94be93c132cc753a.jpeg

      3f26b61065fc6c260f6abd5780548d70.jpeg

      • UNSUBSCRIBE 报文(取消订阅)

        feb9285f692ef964cd8c346b27bb36bf.jpeg

        e19a1060019625650de33166b463ec3a.jpeg

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

        8c5faccdeff9fe20de96c29f6bd6d021.jpeg

        feb909e01d92921a0fc087a9bba64fd2.jpeg

        6ffbed5a02b9ef61bb97b9abc9cd3493.jpeg

        • 最终 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)

      09cf4704d9cd1d60256d15a0d97e14ca.jpeg

      56052165c2afe6f777f3cfab03917d69.jpeg

      • 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协议连接阿里云操作中使用到的相关链接资料:通过物联网IoT的生活物联平台(飞燕平台)创建项目及产品(可参考开发自有品牌项目的产品_生活物联网平台-阿里云帮助中心的创建项目到添加设别完)设备等待激活(当我们登陆该设备后,就会自动激活了)总结:的全部内容,更多相关MQTT协议连接阿里云操作中使用到内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部