當(dāng)前位置:首頁 > IT技術(shù) > 其他 > 正文

MQTT 協(xié)議筆記
2022-05-31 17:14:42

教程看的零基礎(chǔ)入門學(xué)用物聯(lián)網(wǎng) – MQTT基礎(chǔ)篇教程制作非常精良,強(qiáng)烈推薦!

  • MQTT是一個(gè)客戶端服務(wù)端架構(gòu)的發(fā)布/訂閱模式的消息傳輸協(xié)議。

  • 用MQTT 3.1.1版本 5的版本還沒有流行


  • MQTT 客戶端: 數(shù)據(jù)產(chǎn)生和數(shù)據(jù)接收的角色都稱為客戶端.(傳感器和APP都需要接收和發(fā)送數(shù)據(jù)所以他們都是客戶端.)
  • MQTT服務(wù)端: 接收和分發(fā)數(shù)據(jù)的服務(wù)器.可以解決網(wǎng)絡(luò)不穩(wěn)定,以及多設(shè)備分發(fā)的問題.
  • MQTT 主題: 發(fā)布與訂閱 都需要主題. 服務(wù)器也是根據(jù)主題來管理數(shù)據(jù)的(接收和分發(fā))發(fā)布者發(fā)布數(shù)據(jù)到相應(yīng)的主題,訂閱者得到服務(wù)器推送已經(jīng)訂閱主題的數(shù)據(jù).
  • MQTT通訊的三個(gè)特點(diǎn),彼此可獨(dú)立,空間可分離、時(shí)間可異步。

MQTT與服務(wù)器的連接

MQTT連接服務(wù)器一共有兩部

  1. 客戶端向服務(wù)端發(fā)送請求連接.也就是發(fā)送一個(gè)請求數(shù)據(jù)包叫做:CONNECT
  • CONNECT 所包含的內(nèi)容(示例):
    image.png
  • clientId: 客戶端名字,不同的客戶端不能有相同的名字
  • cleanSession:干凈會(huì)話,服務(wù)端不保存數(shù)據(jù),設(shè)置為flase會(huì)要求客戶端對(duì)接收信息進(jìn)行確認(rèn),如果沒有得到確認(rèn)會(huì)認(rèn)為數(shù)據(jù)沒發(fā)送到,會(huì)保留數(shù)據(jù),反復(fù)重新發(fā)送.確保數(shù)據(jù)準(zhǔn)確到達(dá).這個(gè)字段就是告訴服務(wù)端我是不是一個(gè)重要的客戶端用的. 重要的會(huì)話要設(shè)置為flase.光設(shè)置這個(gè)是不夠的還需要QoS>0 以后在講.
  • keepAlive :心跳時(shí)間間隔.給設(shè)備連接狀態(tài)可知用的.每個(gè)客戶端給服務(wù)器發(fā)送心跳包的間隔.如果超過時(shí)間就是掉線了.
  1. 服務(wù)端接收到客戶端請求后向客戶端發(fā)送連接確認(rèn),也是發(fā)送一個(gè)數(shù)據(jù)包叫做:CONNACK
  • CONNACK 所包含的內(nèi)容:
    image.png
  • returnCode: 連接返回碼 成功連接返回0,1-5是連接錯(cuò)誤.具體表達(dá)什么意思網(wǎng)上查.
  • sessionPresent: 當(dāng)前會(huì)話.值為true,表示上個(gè)會(huì)話有內(nèi)容沒有確認(rèn)還存有上次未發(fā)送的信息.和干凈會(huì)話相關(guān).
  1. Publish 界面有QoS 0 1 2可選
  2. Reained 就是 retainFlag后面講解 選中后,后訂閱的會(huì)立即發(fā)送此條信息 只會(huì)保留最后一條.

MQTT.fx連接MQTT服務(wù)端

  1. MQTT公用服務(wù)端:然也物聯(lián) www.ranye-iot.net ,MQTT服務(wù)器地址:test.ranye-iot.net,TCP端口:1883,TCP/TLS端口:8883
  2. clientId:英文字符,不重復(fù)即可
  3. keepalive
  4. clean session
  5. 訂閱主題 Subscribe:輸入主題 點(diǎn)擊訂閱,多了一條右上角0 表示接收數(shù)據(jù)數(shù)量
  6. 發(fā)布信息 Publish : 右側(cè)輸入主題名稱 ,然后輸入信息內(nèi)容 點(diǎn)Publish

ESP8266連接MQTT服務(wù)端

  1. PubSubClient庫最流行 用這個(gè).
    暫時(shí)略過 需要編程時(shí)回來看看思路

MQTT客戶端發(fā)布/訂閱/取消 主題

  1. PUBLISH 發(fā)布信息
  • 客戶端給服務(wù)器發(fā)送PUBLISH報(bào)文.
  • 內(nèi)容如下
    image.png
    • topicName 主題名字: 發(fā)布的主題.
    • payload 發(fā)布的具體內(nèi)容
    • retainFlag 保留標(biāo)志,當(dāng)客戶端訂閱時(shí)正常不會(huì)給客戶端發(fā)送信息,只有在新的數(shù)據(jù)產(chǎn)生時(shí)才會(huì)發(fā)送.如果時(shí)間很久新來的客戶端獲取不到數(shù)據(jù).如果retainFlag為True,客戶端在訂閱后馬上會(huì)收到為True的這些內(nèi)容.(貌似只保留最后一個(gè)?)
    • packetId 數(shù)據(jù)包id:數(shù)據(jù)包編號(hào).服務(wù)器管理數(shù)據(jù)包用的
    • qos 服務(wù)質(zhì)量:決定數(shù)據(jù)信息重要性.0最低
    • dupFlag 重發(fā)標(biāo)志,如果信息為重新發(fā)的會(huì)為True
  1. SUBSCRIBE 訂閱主題
  • 客戶端給服務(wù)器發(fā)送SUBSCRIBE報(bào)文.
  • 報(bào)文中可以包含一個(gè)或多個(gè)主題名字
  • 也有Qos
  1. SUBACK 訂閱確認(rèn)
    • 服務(wù)端收到訂閱請求后,回復(fù)的訂閱確認(rèn)包
    • 訂閱返回碼 有沒有成功的訂閱主題. 0/1/2都為成功取決于訂閱請求時(shí)候的QoS0/QoS1/QoS2. 128為訂閱失敗
  2. UNSUBSCRIBE 取消訂閱
    • 客戶端向服務(wù)端發(fā)送 取消訂閱包
    • topic 主題可以有一個(gè)或者多個(gè).
      image.png

ESP8266 發(fā)布信息

只記下流程 具體編程語法先略過.

  1. 先連接WiFi
  2. MQTT 服務(wù)器連接成功 返回服務(wù)器地址
  3. 返回CLientID
  4. 向一個(gè)主題發(fā)布內(nèi)容,保持心跳.
  5. 內(nèi)容的信息.

MQTT主題進(jìn)階

  1. 主題基本形式
  • 就是一個(gè)字符串
  • 主題區(qū)分大小寫
  • 主題可以使用空格 但是盡量不要用 容易出問題
  • 主題盡量使用ASCII字符 不要用中文 容易出錯(cuò)
  1. 主題分級(jí)
  • MQTT主題可以用 / 分級(jí)處理
  1. 主題通配符
  • 單級(jí)別通配符 + :可以替代一個(gè)主題級(jí)別
  • 當(dāng)訂閱主題的時(shí)候 可以收到通配的主題內(nèi)容. 或者跳過一個(gè)級(jí)別的主題.
    image.png
  • 多級(jí)別通配符 用 # 可以代替任意數(shù)量主題級(jí)別
  • 多級(jí)別通配符只能放在主題的最后面.
  1. 主題應(yīng)用注意事項(xiàng)
  • 以$開始的主題是MQTT主題服務(wù)端系統(tǒng)保留的特殊主題,不能隨意訂閱
  • 不要用 / 作為主題開頭 沒有意義.
  • 保持主題簡潔明了 對(duì)通訊也有好處.
  • 在主題中盡量嵌入客戶端ID 方便調(diào)試 好習(xí)慣.

ESP8266 訂閱主題

暫略

總結(jié)測試

本文摘自 :https://www.cnblogs.com/

開通會(huì)員,享受整站包年服務(wù)立即開通 >