mqtt介紹和go代碼實現

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)}

相關文章
相關標籤/搜索