介绍
MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,专门设计用于物联网(IoT)和机器对机器(M2M)通信。MQTT 最初由 IBM 的 Andy Stanford-Clark 和 Arlen Nipper 在1999年开发,并于2013年成为 OASIS 标准。
以下是 MQTT 的一些关键特点和优势:
- 轻量级和低带宽消耗: MQTT 是一种轻量级的协议,具有小型的消息头,因此非常适合于带宽受限或网络连接不稳定的环境。它减少了网络流量和电池消耗,使其成为物联网设备的理想选择。
- 基于发布/订阅模式: MQTT 使用发布/订阅模式,其中客户端(发布者)发布消息到主题,而其他客户端(订阅者)订阅感兴趣的主题。这种模式使得多个客户端能够实时收到感兴趣的消息,实现了解耦和灵活性。
- 异步通信: MQTT 支持异步通信,发布者发布消息后不需要等待接收者的响应,从而提高了系统的响应速度和效率。
- 服务质量(QoS)支持: MQTT 提供了三种不同的服务质量级别(QoS):至多一次(QoS 0)、至少一次(QoS 1)和精确一次(QoS 2)。这使得开发者能够根据应用场景和需求选择适当的消息传递质量。
- 持久化消息: MQTT 支持持久化消息,在断开连接后仍然可以保存未传递的消息。这对于需要持久化状态或确保消息不会丢失的应用程序非常重要。
- 灵活性和可扩展性: MQTT 是一个灵活和可扩展的协议,允许在不同的网络和应用场景中进行定制和部署。它可以在各种设备和平台上运行,并与现有的网络基础设施集成。
MQTT 是一种简单、可靠、灵活的通信协议,适用于各种物联网和机器对机器通信应用,包括传感器数据采集、远程监控、智能家居、工业自动化等领域。其轻量级的特性、基于发布/订阅模式和灵活的配置使其成为物联网领域的主流通信协议之一。
Docker部署MQTT代理服务
MQTT 代理服务是一种中间件,用于在物联网(IoT)和其他实时通信应用中进行消息传输。其作用主要包括以下几个方面:
- 消息路由和传输: MQTT 代理负责接收来自客户端的消息,并将这些消息传输到指定的目标客户端。它负责将消息从发布者路由到订阅者,以确保消息的可靠传输。
- 消息存储和持久化: MQTT 代理通常具有持久化功能,可以将消息存储在磁盘上,以确保在断开连接或重新启动后不会丢失消息。这对于某些应用程序很重要,特别是需要处理重要数据或需要在断网时保持通信的应用。
- 安全性和身份验证: MQTT 代理通常提供身份验证和授权功能,以确保只有经过授权的客户端能够连接和发布/订阅消息。它还可以提供加密通信,确保消息在传输过程中的安全性。
- QoS 级别管理: MQTT 代理可以管理消息的服务质量(QoS),并确保根据需要按照不同的 QoS 等级传输消息。这包括确保消息至少被传输一次(至多一次传输)、确保消息至少被传输一次并且只被传输一次(至少一次传输)、以及确保消息被传输一次并且只被传输一次(精确一次传输)等。
- 连接管理: MQTT 代理负责管理客户端与服务器之间的连接,包括连接的建立、维护和断开。它可以处理大量的客户端连接,并确保服务器的稳定性和可靠性。
配置项
配置config/mosquitto.conf文件
内容
| 12
 3
 4
 5
 6
 
 | persistence truepersistence_location /mosquitto/data
 log_dest file /mosquitto/log/mosquitto.log
 listener 9001
 port 1883
 allow_anonymous true
 
 | 
- persistence true: 这个配置项用于启用 MQTT 代理的持久化机制。持久化可以确保在 MQTT 代理重新启动后,之前的会话状态和消息仍然被保留下来。
- persistence_location /mosquitto/data: 这个配置项指定了持久化文件的存储位置。在这个例子中,持久化文件将存储在- /mosquitto/data目录中。
- log_dest file /mosquitto/log/mosquitto.log: 这个配置项指定了 MQTT 代理日志文件的存储位置和类型。在这个例子中,日志将被写入到- /mosquitto/log/mosquitto.log文件中。
- listener 9001: 这个配置项指定了 MQTT 代理监听的端口号。在这个例子中,代理将在 9001 端口上监听客户端连接。
- port 1883: 这个配置项也是指定 MQTT 代理监听的端口号。在这个例子中,代理将在 1883 端口上监听客户端连接。通常,客户端将通过此端口连接到 MQTT 代理。
- allow_anonymous true: 这个配置项指定了是否允许匿名连接到 MQTT 代理,即是否允许客户端连接而不需要提供用户名和密码。在这个例子中,允许匿名连接。
Docker-compose
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | version: "3"
 services:
 mqtt:
 image: eclipse-mosquitto:2.0.18
 container_name: mqtt
 restart: always
 volumes:
 - $PWD/config:/mosquitto/config
 - $PWD/data:/mosquitto/data
 - $PWD/log:/mosquitto/log
 ports:
 - 1883:1883
 - 9001:9001
 
 | 
Demo
golang
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 
 | package main
 import (
 "fmt"
 mqtt "github.com/eclipse/paho.mqtt.golang"
 "os"
 "os/signal"
 "time"
 )
 
 func onMessageReceived(client mqtt.Client, message mqtt.Message) {
 fmt.Printf("Received message on topic: %s\n", message.Topic())
 fmt.Printf("Message: %s\n", message.Payload())
 }
 
 func main() {
 
 broker := "tcp://localhost:1883"
 
 clientID := "mqtt-demo-client"
 
 topic := "demo/topic"
 
 
 opts := mqtt.NewClientOptions().AddBroker(broker).SetClientID(clientID)
 
 
 client := mqtt.NewClient(opts)
 if token := client.Connect(); token.Wait() && token.Error() != nil {
 fmt.Println(token.Error())
 os.Exit(1)
 }
 
 
 client.Subscribe(topic, 1, onMessageReceived)
 
 fmt.Printf("Connected to broker %s and subscribed to topic %s\n", broker, topic)
 
 for i := 0; i < 5; i++ {
 
 message := "Hello this is go " + fmt.Sprintf("%v", i)
 token := client.Publish(topic, 1, false, message)
 token.Wait()
 time.Sleep(time.Second * 1)
 }
 
 
 c := make(chan os.Signal, 1)
 signal.Notify(c, os.Interrupt)
 <-c
 
 fmt.Println("Disconnecting from broker...")
 client.Disconnect(250)
 fmt.Println("Disconnected.")
 }
 
 | 
python
首先安装package
| 1
 | install paho-mqtt==1.6.1
 | 
详细的demo
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 
 | import paho.mqtt.client as mqttimport time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 broker_address = "localhost"
 broker_port = 1883
 
 
 client_id = "python-mqtt-demo"
 
 
 topic = "demo/topic"
 
 
 
 def on_connect(client, userdata, flags, rc):
 print("Connected to MQTT broker with result code " + str(rc))
 
 client.subscribe(topic, qos=2)
 
 
 
 def on_message(client, userdata, msg):
 print("Received message on topic: " + msg.topic)
 print("Message: " + str(msg.payload))
 
 
 
 client = mqtt.Client(client_id)
 
 
 client.on_connect = on_connect
 client.on_message = on_message
 
 
 client.callback_api_version = 1
 
 
 client.connect(broker_address, broker_port, 60)
 
 
 client.loop_start()
 
 
 i = 0
 while i < 5:
 message = "Hello this is python " + str(i)
 
 client.publish(topic, message, qos=1)
 print("Published message: " + message)
 time.sleep(5)
 i += 1
 
 
 time.sleep(5)
 
 
 client.loop_stop()
 client.disconnect()
 
 |