MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發佈/訂閱(publish/subscribe)模式的「輕量級」通信協議,該協議構建於TCP/IP協議上,由IBM在1999年發佈。MQTT最大優勢在於,能夠以極少的代碼和有限的帶寬,爲鏈接遠程設備提供實時可靠的消息服務。做爲一種低開銷、低帶寬佔用的即時通信協議,使其在物聯網、小型設備、移動應用等方面有較普遍的應用
MQTT是一個基於客戶端-服務器的消息發佈/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易於實現的,這些特色使它適用範圍很是普遍。在不少狀況下,包括受限的環境中,如:機器與機器(M2M)通訊和物聯網(IoT)。其在,經過衛星鏈路通訊傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已普遍使用
實現MQTT協議須要客戶端和服務器端通信完成,在通信過程當中,MQTT協議中有三種身份:發佈者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。其中,消息的發佈者和訂閱者都是客戶端,消息代理是服務器,消息發佈者能夠同時是訂閱者。git
MQTT傳輸的消息分爲:主題(Topic)和負載(payload)兩部分:github
(1)Topic,能夠理解爲消息的類型,訂閱者訂閱(Subscribe)後,就會收到該主題的消息內容(payload);golang
(2)payload,能夠理解爲消息的內容,是指訂閱者具體要使用的內容。
2 網絡傳輸與應用消息
MQTT會構建底層網絡傳輸:它將創建客戶端到服務器的鏈接,提供二者之間的一個有序的、無損的、基於字節流的雙向傳輸。服務器
當應用數據經過MQTT網絡發送時,MQTT會把與之相關的服務質量(QoS)和主題名(Topic)相關連。網絡
3 MQTT客戶端eclipse
一個使用MQTT協議的應用程序或者設備,它老是創建到服務器的網絡鏈接。客戶端能夠:tcp
(1)發佈其餘客戶端可能會訂閱的信息;測試
(2)訂閱其它客戶端發佈的消息;ui
(3)退訂或刪除應用程序的消息;this
(4)斷開與服務器鏈接。
4 MQTT服務器
MQTT服務器以稱爲「消息代理」(Broker),能夠是一個應用程序或一臺設備。它是位於消息發佈者和訂閱者之間,它能夠:
(1)接受來自客戶的網絡鏈接;
(2)接受客戶發佈的應用信息;
(3)處理來自客戶端的訂閱和退訂請求;
(4)向訂閱的客戶轉發應用程序消息。
5 MQTT協議中的訂閱、主題、會話
1、訂閱(Subscription)
訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯。一個會話能夠包含多個訂閱。每個會話中的每一個訂閱都有一個不一樣的主題篩選器。
2、會話(Session)
每一個客戶端與服務器創建鏈接後就是一個會話,客戶端和服務器之間有狀態交互。會話存在於一個網絡之間,也可能在客戶端和服務器之間跨越多個連續的網絡鏈接。
3、主題名(Topic Name)
鏈接到一個應用程序消息的標籤,該標籤與服務器的訂閱相匹配。服務器會將消息發送給訂閱所匹配標籤的每一個客戶端。
4、主題篩選器(Topic Filter)
一個對主題名通配符篩選器,在訂閱表達式中使用,表示訂閱所匹配到的多個主題。
5、負載(Payload)
消息訂閱者所具體接收的內容。
測試mqtt客戶端
MQTTBox-win
go 代碼
https://www.eclipse.org/paho/...
package main
import (
"fmt"
//import the Paho Go MQTT library
MQTT "github.com/eclipse/paho.mqtt.golang"
"os"
"time"
)
//define a function for the default message handler
var f MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
fmt.Printf("TOPIC: %sn", msg.Topic())
fmt.Printf("MSG: %sn", msg.Payload())
}
func main() {
//create a ClientOptions struct setting the broker address, clientid, turn
//off trace output and set the default message handler
opts := MQTT.NewClientOptions().AddBroker("tcp://iot.eclipse.org:1883")
opts.SetClientID("go-simple")
opts.SetDefaultPublishHandler(f)
//create and start a client using the above ClientOptions
c := MQTT.NewClient(opts)
if token := c.Connect(); token.Wait() && token.Error() != nil {
panic(token.Error())
}
//subscribe to the topic /go-mqtt/sample and request messages to be delivered
//at a maximum qos of zero, wait for the receipt to confirm the subscription
if token := c.Subscribe("go-mqtt/sample", 0, nil); token.Wait() && token.Error() != nil {
fmt.Println(token.Error()) os.Exit(1)
}
//Publish 5 messages to /go-mqtt/sample at qos 1 and wait for the receipt
//from the server after sending each message
for i := 0; i < 5; i++ {
text := fmt.Sprintf("this is msg #%d!", i) token := c.Publish("go-mqtt/sample", 0, false, text) token.Wait()
}
time.Sleep(3 * time.Second)
//unsubscribe from /go-mqtt/sample
if token := c.Unsubscribe("go-mqtt/sample"); token.Wait() && token.Error() != nil {
fmt.Println(token.Error()) os.Exit(1)
}
c.Disconnect(250)}