在 Python 中,使用 MQTT 客户端连接 RabbitMQ 可以通过 paho-mqtt
库来实现。RabbitMQ 必须启用 MQTT 插件,这样才能作为一个 MQTT Broker 工作。
以下是一个完整的 Python 示例,用 paho-mqtt
客户端连接 RabbitMQ 并发布和订阅消息。
步骤 1: 启用 RabbitMQ 的 MQTT 插件
在 RabbitMQ 上启用 MQTT 插件:
rabbitmq-plugins enable rabbitmq_mqtt
RabbitMQ 的默认 MQTT 端口是 1883
,WebSocket 的端口是 15675
。
步骤 2: 安装 Python 的 MQTT 客户端库
使用 pip
安装 paho-mqtt
:
pip install paho-mqtt
步骤 3: 编写 Python MQTT 客户端代码
完整的 Python 示例
该示例包括连接 RabbitMQ、发布消息、订阅消息,以及处理消息的回调函数。
import paho.mqtt.client as mqtt
# MQTT Broker 配置
BROKER_ADDRESS = "localhost" # RabbitMQ 地址
BROKER_PORT = 1883 # MQTT 的端口
# 当客户端连接到 Broker 时调用的回调函数
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
client.subscribe("test/topic") # 连接后订阅一个主题
else:
print(f"Failed to connect, return code {rc}")
# 当客户端接收到订阅的消息时调用的回调函数
def on_message(client, userdata, msg):
print(f"Received message: {msg.payload.decode()} on topic: {msg.topic}")
# 当客户端发布消息成功时调用的回调函数
def on_publish(client, userdata, mid):
print(f"Message published: {mid}")
# 创建 MQTT 客户端
client = mqtt.Client()
# 绑定回调函数
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
# 连接到 RabbitMQ MQTT Broker
client.connect(BROKER_ADDRESS, BROKER_PORT, 60)
# 启动网络循环,处理网络流量和回调
client.loop_start()
# 发布消息到主题
client.publish("test/topic", "Hello MQTT from RabbitMQ!")
# 阻塞主线程,以保持连接并接收消息
try:
while True:
pass
except KeyboardInterrupt:
print("Disconnecting from MQTT Broker...")
client.loop_stop()
client.disconnect()
代码说明
- MQTT Broker 配置:在
BROKER_ADDRESS
中设置 RabbitMQ 的地址和端口(默认为1883
)。 - 连接到 Broker:
client.connect(BROKER_ADDRESS, BROKER_PORT, 60)
连接到 RabbitMQ 服务器。 - 发布消息:
client.publish("test/topic", "Hello MQTT from RabbitMQ!")
发布一条消息到test/topic
主题。 - 订阅主题:在
on_connect
回调函数中,客户端在连接后立即订阅了test/topic
主题。 - 消息回调:当收到订阅主题的消息时,
on_message
回调函数会被调用,并打印消息内容。
步骤 4: 配置 RabbitMQ 用户权限
确保 RabbitMQ 用户有权限访问虚拟主机。使用以下命令为默认的虚拟主机设置用户权限:
rabbitmqctl set_permissions -p / guest ".*" ".*" ".*"
测试
- 启动 RabbitMQ,并确保 MQTT 插件已启用。
- 运行 Python 脚本,客户端将连接到 RabbitMQ,订阅并发布消息。
- 发布的消息将通过
on_message
回调函数接收到。
通过这种方式,你可以使用 Python 的 MQTT 客户端与 RabbitMQ 进行通信,发布和订阅消息。这种架构非常适用于物联网、消息通知等场景。