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: