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?;畎?nbsp;, 那這個規定時間內時間是多長時間,就在這個設定好,當服務器和你連接完成后,如果你在這個時間內沒有發送到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端網絡工具進行一下測試:
    在測試前還需要知道云的地址,在阿里云這進行查看:

    推薦閱讀