**MQTT** === ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_88c34c2ff53f7f0ecdeabe8b1bb8620e.png ) ## MQTT 協定 * (中文版) http://mcxiaoke.github.io/mqtt/protocol/MQTT-3.1.1-CN.html#pf2d * (英文版) http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.pdf ## Mqtt 教學 * 付費的 MQTT 服務廠商的文件 (寫最完整) [MQTT 教學](https://www.hivemq.com/blog/mqtt-essentials/) 1. [Part 2 中文版](https://coyee.com/article/11999-mqtt-essentials-part-2-publish-subscribe) 1. [Part 3 中文版](https://coyee.com/article/12000-mqtt-essentials-part-3-client-broker-and-connection-establishment) 2. [Part 4 中文版](https://coyee.com/article/12008-mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe) 3. [Part 5 中文版](https://coyee.com/article/12006-mqtt-essentials-part-5-mqtt-topics-best-practices) 4. [MQTT Essentials Special 中文版](https://coyee.com/article/12006-mqtt-essentials-part-5-mqtt-topics-best-practices) [MQTT 安全](https://www.hivemq.com/blog/mqtt-security-fundamentals/) * 簡中,寫得很完整 [MQTT教學](http://www.iteye.com/blogs/subjects/mqtt ) * 寫得不錯,而且又是中文 (基礎介紹) [MQTT教學(一)](https://swf.com.tw/?p=1002) [MQTT教學(二)](https://swf.com.tw/?p=1009) ## MQTT 版本 (MQTT 5 還未更新) ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_f01d912f72eb27113f79e1f6419a30e2.png) ## MQTT 與 HTTP 訊息內容比較 ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_e3f19d782a15915bcc5d7feddc3d77f4.png) * HTTP 訊息內容![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_99c9f09ac5f53bf8047284da38f3099c.png) * MQTT 訊息內容 ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_aba7f52941b0c7ea27a97bf0e2c4d90b.png) ## 運作流程 ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_f32ccb73f9a3cc53800802ef0d23bfcf.png) ## Topic (主題) * Topic (主題) 結構範例 ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_b3b191c09bfae9acbfc7ce271ad38773.png) * Topic (主題)命名規則 :::info 1.階層名稱可以空白,像這樣的命名 home//yard,代表有三個階層,中間階層沒有名字 2.長度不可超過216位元組(65536個字元) ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_8545d0346b346f84d39cd3d90fb924e2.png) 範例 : 人體感測器1 的 Topic (主題) 命名為 ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_d6463b4466fb27ffcfcd0a178147acfe.png) ::: :::danger 非法命名 1.勿用$開頭,Server 通常會使用 $ 開頭主題為統計訊息 2.不可包含#和+字元 ::: ## 訂閱 * Topic (主題)結構範例 ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_cfe6c6df10c8fa559c688f78cd6d6efa.png) * 訂閱 Topic (主題) 規則 ::: info 1.+字元:匹配單一階層的主題名稱 2.#字元:匹配多層主題名稱,這個字元只放在名稱最後。 ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_389e0972f7fb2e0beba91e8016eefdda.png) ::: :::danger 非法訂閱 ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_c3dc68ce655a214fc85f0862670d08b1.png) ::: ## Qos (傳輸品質) ### Qos 0 **只發送一次 (不保證送達)** ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_08013c192dccfb7a0467eff52e79edf0.png) ### Qos 1 **保證送達至少一次,所以有可能發送 2 次** ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_3f52407bc16712ac89dc573c58b0f3ad.png) ### Qos 2 **保證送達一次** ![](https://s3-ap-northeast-1.amazonaws.com/tecyt-hackmd/uploads/upload_27e738491168d9f75b2f6e21393cf7ce.png) ## 程式運作流程 ### 連線 Server 參數 * **ClientID** 客戶端 ID ::: danger 同時只能存一個在 Server 上。 如果用同個 ClientID 連線 Server,Server 會將使用同個 ClientID 的客戶端斷線。 ::: * **UserName** 用於認證的使用者名稱 (Server 需起用認證) * **Password** 用於認證的密碼 (Server 需起用認證) * **CleanSession** 是否清除 Session ::: info Session 包含 1. ClientID 訂閱的 Topic (主題) 2. ClientID 未接收的訊息 ::: :::warning 設定為 True 1. 會清除舊有 Session,重新建立新的 Session 2. 斷線時會清除 Session ::: * **KeepAlivePeriod** Server 在設定的時間內未收到客戶端的訊息時,會將客戶端斷線。 單位 : 秒 ::: info Server 通常會在乘上一個倍數。 EMQ為 【設定的值】* 【0.75 (config 設定)】*【2】 ::: * **WillFlag** 是否起用當斷線時,Server 會發佈 Will (遺囑) 訊息 ::: danger 設定為 False 1. WillRetain、WillQos 必須設定為 0 2. WillTopic、WillMessage 不能有值 ::: * **WillRetain** Will (遺囑) 訊息是否設定為 Retain (保留) 訊息 :::info Retain (保留) 訊息 1. 一個主題只會存在一個 Retain (保留) 訊息 2. 新訂閱的 ClientID 才會收到 Retain (保留) 訊息 ::: * **WillQos** Will (遺囑) 訊息的 Qos * **WillTopic** Will (遺囑) 訊息的 Topic (主題) * **WillPayload** Will (遺囑) 訊息的內容 ### 訂閱參數 * Topics 可同時訂閱多個 Topic (主題) * Qos 設定每個訂閱 Topic (主題) 的 Qos :::warning Server 會依照【訂閱 Qos】和【發佈訊息 Qos】最低的 Qos 做發送訊息 ::: ### 發佈參數 * Topic 發佈訊息到哪個 Topic (主題) * Payload 訊息內容 * Qos 發佈訊息的 Qos * Retain (保留) 訊息 :::info Retain (保留) 訊息 1. 一個主題只會存在一個 Retain (保留) 訊息 2. 新訂閱的 ClientID 才會收到 Retain (保留) 訊息 ::: MQTT Server 比較 === * 網友提供的檔案 (2018 更新) <i class="fa fa-folder"></i> X:\\!Yumin\Demo 程式\Mqtt (使用 EMQ)\Feature.comparison.of.different.MQTT.brokers.pdf * 好像停止更新了,但是還是可以參考 https://github.com/mqtt/mqtt.github.io/wiki/server-support#capabilities .NET 開發 === * **Nuget** 1. Plt.M2Mqtt 2. M2MqttDotnetCore (NET Standard 2.0) :::danger 原版 M2Mqtt 作者已不更新 , 轉移到上面兩個繼續維護 ::: .NET Demo 專案 === <i class="fa fa-folder"></i> X:\\!Yumin\Demo 程式\Mqtt (使用 EMQ) Tag === ###### tags: `Queue`,`MQTT`