mqtt_simple例程 nrf9160做主控连接阿里云——( 四 )

  • Will QoS:用于指定发布遗嘱消息时使用的服务质量等级,0——(will flag=0时必须为零),当will flag=1时可以设置为0,1,2表示消息质量(如前面消息质量)
  • Will retain:遗嘱保留 , 0——不保留信息,掉线后从连无法获取信息,1——保留信息,掉线后重连可以获取信息(这一点我理解的是这样,不知道对不对,如有更好的解释可以在评论区讨论)
  • password flag:密码 , 0——在负载中不包含密码,1——在负载中包含密码
  • user name flag:用户名,0——在负载中不包含用户名 , 1——在负载中包含用户名
  • 由于我们连接的是阿里云,阿里云要求必须是有用户名和密码的,不使用遗嘱消息,且有不保留信息,也就是要清除所以这一字节为(11000010)0xC2
    4)保持连接这一部分为两个字节,在实际连接中 , 要不间断的在规定时间内给服务器发送PING保活包 , 那这个规定时间内时间是多长时间,就在这个设定好,当服务器和你连接完成后,如果你在这个时间内没有发送到PING包,那么服务器就认为你断开连接了 。单位是秒 。这里每个服务器在MQTT协议规定的最大时间内还可以规定自己的最大时间,本次测试就设定为100s(64s)内必须有PING包出现,不然就认为是断开连接,对于嵌入式设备来说这个时间越长越低功耗 。
    因此我们的数据包就变成了如下这样:
    10 ?00 04 40 51 54 54 04 c2 00 64
    3.2.3、负载(也就数据)负载数据就是前面标志位中设定要包含的数据 , 全部有客户端标识符、遗嘱主题、遗嘱消息、用户名、密码,五部分组成,在这个值讲解三部分 。这里先看一下阿里云对连接密码用户名和客户端标识符的要求
    mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图
    三元组:
    mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图
    1)、客户端标识符阿里云参考规范:mqttClientId : clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"
    根据对参数的解释 , clientId就为三元组中的T123,securemode由于选择一机一密所以已经固定,不要改默认就行,signmethod默认加密为hmacmd5没有改,后续的timestamp我们不需要设置省略掉
    最终mqttClientId就为“T123|securemode=3,signmethod=hmacmd5|”
    我们把这一串转换为十六进制为54 31 32 33 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 6D 64 35 7C 在再前面加上客户端ID的长度(两字节)最后变为:
    00 25 54 31 32 33 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 6D 64 35 7C
    2)、用户名阿里云参考规范:mqttUsername:deviceName+"&"+productKey
    用三元组件替换mqttUsername:T123&a1tETt7fUG1
    变成十六进制:54 31 32 33 26 61 31 74 45 54 74 37 66 55 47 31
    加上长后为:00 10 54 31 32 33 26 61 31 74 45 54 74 37 66 55 47 31
    3)、密码获取阿里云参考规范:mqttPassword::sign_hmac(deviceSecret,content)
    这里需要用到加密算法hmacmd5使用三元组中的DeviceSecret做为秘钥对clientId*deviceName*productKey#加密后作为密码——其中*号为设备名称 , #ProductKey
    即clientIdT123deviceNameT123productKeya1tETt7fUG1 , 然后再网页上打开一个网页版加密工具:在线加密解密 - chahuo.com
    mqtt_simple例程 nrf9160做主控连接阿里云——

    文章插图
    由此获得我们的密码:86a087f11cad5c325127ae5f79305109,经过转化后并加上两字节长度信息后:
    00 20 38 36 61 30 38 37 66 31 31 63 61 64 35 63 33 32 35 31 32 37 61 65 35 66 37 39 33 30 35 31 30 39
    由此我们来组合一下我们的CONNECT报文包
    10 ? 00 04 4D 51 54 54 04 C2 00 64 00 25 54 31 32 33 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 6D 64 35 7C 00 10 54 31 32 33 26 61 31 74 45 54 74 37 66 55 47 31 00 20 38 36 61 30 38 37 66 31 31 63 61 64 35 63 33 32 35 31 32 37 61 65 35 66 37 39 33 30 35 31 30 39 那么由此我就可以知道问号后面一共多少个字节了就是后面的绿色和黑色部分字节长度一共101(65)
    因此整个报文信息就为:
    10 65 00 04 4D 51 54 54 04 C2 00 64 00 25 54 31 32 33 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E6D 65 74 68 6F 64 3D 68 6D 61 63 6D 64 35 7C 00 10 54 31 32 33 26 61 31 74 45 54 74 37 66 55 47 31 00 20 3836 61 30 38 37 66 31 31 63 61 64 35 63 33 32 35 31 32 37 61 65 35 66 37 39 33 30 35 31 30 39 3.3、PC端工具连接测试我们用PC端网络工具进行一下测试:
    在测试前还需要知道云的地址,在阿里云这进行查看:

    推荐阅读