C# MQTT M2MQTT

MQTT 入門介紹

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

實現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 之間消息僅有一次,利用四次握手進行確認,網絡延遲可能會增長

ui

##主題
MQTT是經過主題對消息進行分類的,本質上就是一個UTF-8的字符串,不過能夠經過反斜槓表示多個層級關係。主題並不須要建立,直接使用就是了。spa

主題還能夠經過通配符進行過濾。其中,+能夠過濾一個層級,而*只能出如今主題最後表示過濾任意級別的層級。舉個例子:.net

  • 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不容許
 
相關文章
相關標籤/搜索