MQTT是基於二進制消息的發佈/訂閱編程模式的消息協議html
實現MQTT協議須要客戶端和服務器端通信完成,在通信過程當中,MQTT協議中有三種身份:發佈者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。其中,消息的發佈者和訂閱者都是客戶端,消息代理是服務器,消息發佈者能夠同時是訂閱者。編程
MQTT傳輸的消息分爲:主題(Topic)和負載(payload)兩部分:服務器
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容許使用通配符訂閱主題,可是並不容許使用通配符廣播。 線程
//建立客戶端實例 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);
1.ConnectionClosed代理
客戶端與服務端斷開時觸發
2.MqttMsgPublished
消息發佈成功後觸發
3.MqttMsgSubscribed
客戶端訂閱Topic成功後觸發
4.MqttMsgPublishReceived
客戶端收到來自服務端的消息後觸發
5.MqttMsgUnsubscribed
客戶端成功取消訂閱後觸發
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: