C# MQTT M2MQTT


MQTT 入門介紹

MQTT是基於二進制消息的發布/訂閱編程模式的消息協議

實現MQTT協議需要客戶端和服務器端通訊完成,在通訊過程中,MQTT協議中有三種身份:發布者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是訂閱者。

MQTT傳輸的消息分為:主題(Topic)和負載(payload)兩部分:

  • (1)Topic,可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會收到該主題的消息內容(payload);
  • (2)payload,可以理解為消息的內容,是指訂閱者具體要使用的內容。

MQTT協議中定義了一些方法(也被稱為動作),來於表示對確定資源所進行操作。這個資源可以代表預先存在的數據或動態生成數據,這取決於服務器的實現。通常來說,資源指服務器上的文件或輸出。主要方法有:

  • (1)Connect。等待與服務器建立連接。
  • (2)Disconnect。等待MQTT客戶端完成所做的工作,並與服務器斷開TCP/IP會話。
  • (3)Subscribe。等待完成訂閱。
  • (4)UnSubscribe。等待服務器取消客戶端的一個或多個topics訂閱。
  • (5)Publish。MQTT客戶端發送消息請求,發送完成后返回應用程序線程。

服務質量(Quality of Service,QoS)
MQTT 定義了三種客戶端與代理服務器之間消息到達的難度

0:broker/client 之間消息傳一次,並不確認傳到沒有,消息可能丟失
1:broker/client 之間消息至少一次,帶確認消息的傳輸,可能重復收到
2:broker/client 之間消息僅有一次,利用四次握手進行確認,網絡延遲可能會增加

##主題
MQTT是通過主題對消息進行分類的,本質上就是一個UTF-8的字符串,不過可以通過反斜杠表示多個層級關系。主題並不需要創建,直接使用就是了。

主題還可以通過通配符進行過濾。其中,+可以過濾一個層級,而*只能出現在主題最后表示過濾任意級別的層級。舉個例子:

  • building-b/floor-5:代表B樓5層的設備。
  • +/floor-5:代表任何一個樓的5層的設備。
  • building-b/#:代表B樓所有的設備。

注意,MQTT允許使用通配符訂閱主題,但是並不允許使用通配符廣播。 

 

運用M2MQTT實現 

//創建客戶端實例  
MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS)); //主機為IP時  
MqttClient client = new MqttClient(MQTT_BROKER_ADDRESS); //當主機地址為域名時  
  
// 注冊消息接收處理事件,還可以注冊消息訂閱成功、取消訂閱成功、與服務器斷開等事件處理函數  
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;   
  
//生成客戶端ID並連接服務器  
string clientId = Guid.NewGuid().ToString();   
client.Connect(clientId);   
  
// 訂閱主題"/home/temperature" 消息質量為 2   
client.Subscribe(new string[] { "/home/temperature" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });   
  
...   
  
void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)   
{   
//處理接收到的消息  
string msg = System.Text.Encoding.Default.GetString(e.Message);  
        textBox1.AppendText("收到消息:" + msg + "\r\n"); 

 

 

// 發布消息到主題 "/home/temperature" 消息質量為 2,不保留   
client.Publish("/home/temperature", Encoding.UTF8.GetBytes("hello"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);  

 

 

M2MQTT類庫說明

 

MqttClient主要事件

 

1.ConnectionClosed

 

    客戶端與服務端斷開時觸發

 

2.MqttMsgPublished

 

    消息發布成功后觸發

 

3.MqttMsgSubscribed

 

    客戶端訂閱Topic成功后觸發

 

4.MqttMsgPublishReceived

 

    客戶端收到來自服務端的消息后觸發

 

5.MqttMsgUnsubscribed

 

    客戶端成功取消訂閱后觸發

 

MqttClient主要方法

1.連接MQTT服務器

    Connect(string clientId);
    Connect(string clientId, string username, string password);
    Connect(string clientId, string username, string password, bool cleanSession, ushort keepAlivePeriod);
    Connect(string clientId, string username, string password, bool willRetain, byte willQosLevel, bool willFlag, string willTopic, string willMessage, bool cleanSession, ushort keepAlivePeriod);

clientId :當前客戶端的ID,相同ID的客戶端連接服務器可能會產生異常,不同的客戶端,應保證其ID不同。

username:如果服務器開啟了身份授權,此處為賬號

password:如果服務器開啟了身份授權,此處為密碼

 

willFlag:表示如果客戶機不是發送DISCONNECT消息中斷時,比如IO錯誤等,如果將此位置為1,要求重傳。並且WillQos和WillRetain也要設置,消息體中的Topic和MessageID也要設置。

 

willRetain(遺囑保留位):該位必須與遺囑標志位狀態相同(同為0 或者同為1)

 

willQosLevel:如果遺囑標志被設置為 0,遺囑 QoS 也必須設置為 0。 如果遺囑標志被設置為 1,遺囑 QoS 的值可以等於 0,1,2。

 

willTopic(遺囑主題):如果遺囑標志被設置為 1,異常斷開時響應的主題

willMessage(遺囑消息):如果遺囑標志被設置為 1,異常斷開時給遺囑主題發送該消息

cleanSession:

    0表示如果訂閱的客戶機斷線了,那么要保存其要推送的消息,如果其重新連接時,則將這些消息推送。
    1表示消除,表示客戶機是第一次連接,消息所以以前的連接信息。

 

/:用來表示層次,比如a/b,a/b/c。
#:表示匹配>=0個層次,比如a/#就匹配a/,a/b,a/b/c。
單獨的一個#表示匹配所有。
不允許 a#和a/#/c。
+:表示匹配一個層次,例如a/+匹配a/b,a/c,不匹配a/b/c。
單獨的一個+是允許的,a+不允許,a/+/b不允許
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM