---
# System prepended metadata

title: '**MQTT**'
tags: [MQTT, Queue]

---

**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`