Ubuntu 系统下 RabbitMQ 作为 MQTT 代理的配置方案

一、安装与基础配置

1. 安装 RabbitMQ

请参考我的 Ubuntu 系统下 AMQP 协议 RabbitMQ服务器部署这篇文章

2. 启用 MQTT 插件

bash 复制代码
sudo rabbitmq-plugins enable rabbitmq_mqtt

二、创建自定义用户与权限

请参考我的 Ubuntu 系统下 AMQP 协议 RabbitMQ服务器部署这篇文章

RabbitMQ 的用户系统是协议无关的,创建的账户可以用于所有支持的协议(AMQP、MQTT、STOMP 等),所以你如果创建过用户和密码则无需重新创建新的用户。

三、配置自定义端口与安全设置

1. 编辑配置文件

bash 复制代码
sudo nano /etc/rabbitmq/rabbitmq.conf

2. 添加以下配置(关键)

bash 复制代码
listeners.tcp.1 =0.0.0.0:5672
mqtt.listeners.tcp.2 = 0.0.0.0:1884

# 指定自定义用户(密码在 RabbitMQ 用户系统中,不在配置文件)
mqtt.default_user = mi_user

# 禁用匿名访问(强制认证)
mqtt.allow_anonymous = false

3. 重启 RabbitMQ

bash 复制代码
sudo systemctl restart rabbitmq-server

# 检查配置是否生效
sudo rabbitmq-diagnostics listeners | grep mqtt

四、配置防火墙

1. 开放自定义端口

bash 复制代码
udo ufw allow 1884/tcp

五、客户端代码示例

安装 paho-mqtt 1.6.1版本安装包

bash 复制代码
pip install paho-mqtt==1.6.1 -i https://mirrors.aliyun.com/pypi/simple/
Python 发送端(发布消息)
python 复制代码
# 文件: publisher.py
import paho.mqtt.client as mqtt
import time

# 配置(修改为你的实际值)
BROKER = "192.168.1.100"  # RabbitMQ 服务器 IP
PORT = 1884
TOPIC = "devices/sensor/data"
CLIENT_ID = "python_publisher"
USERNAME = "mi_user"
PASSWORD = "YourPassword123"

# 创建客户端
client = mqtt.Client(CLIENT_ID)

# 设置认证
client.username_pw_set(USERNAME, PASSWORD)

# 连接回调
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("✅ 连接成功")
    else:
        print(f"❌ 连接失败,错误码: {rc}")

client.on_connect = on_connect

# 连接
client.connect(BROKER, PORT, 60)
client.loop_start()
time.sleep(1)

# 发布消息
message = "{'temp': 25.6, 'humidity': 60}"
result = client.publish(TOPIC, message, qos=1)

if result.rc == mqtt.MQTT_ERR_SUCCESS:
    print(f"✅ 消息已发布到 {TOPIC}: {message}")
else:
    print(f"❌ 发布失败")

time.sleep(1)
client.loop_stop()
client.disconnect()
Python 接收端(订阅消息)
python 复制代码
# 文件: subscriber.py
import paho.mqtt.client as mqtt

# 配置
BROKER = "192.168.1.100"
PORT = 1884
TOPIC = "devices/sensor/data"
CLIENT_ID = "python_subscriber"
USERNAME = "mi_user"
PASSWORD = "YourPassword123"

def on_message(client, userdata, msg):
    print(f"📥 收到消息 - Topic: {msg.topic}, Payload: {msg.payload.decode()}")

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("✅ 连接成功")
        client.subscribe(TOPIC, qos=1)
        print(f"📋 已订阅: {TOPIC}")
    else:
        print(f"❌ 连接失败,错误码: {rc}")

client = mqtt.Client(CLIENT_ID)
client.username_pw_set(USERNAME, PASSWORD)
client.on_connect = on_connect
client.on_message = on_message

client.connect(BROKER, PORT, 60)
print("🔄 等待消息... (按 Ctrl+C 退出)")
client.loop_forever()
相关推荐
ly76894 小时前
RabbitMQ 消费确认与预取:manual ack、reject、nack 与 QoS 的取舍
rabbitmq·死信队列·消息可靠性·消费确认·qos 预取
灯澜忆梦5 小时前
【RabbitMQ #7】 | 消息转换器
分布式·rabbitmq·ruby
灯澜忆梦11 小时前
【RabbitMQ #4】 | Work 任务模型
分布式·rabbitmq
SL-staff7 天前
MQTT Topic权限越界排查指南:JVS-IOT中系统Topic与自定义Topic的鉴权机制与实操验证
mqtt·嵌入式开发·权限控制·物联网开发·协议分析·鉴权机制·jvs-iot
imDwAaY8 天前
消息队列四大核心问题:顺序性、幂等性、可靠性与一致性
学习·kafka·rabbitmq
手握风云-9 天前
一条消息的旅程:RabbitMQ 学习与实践(五)
rabbitmq·java-rabbitmq
szephyr10 天前
消息队列入门:RabbitMQ 和 Kafka 到底怎么选,什么时候不该用
后端·架构·kafka·消息队列·rabbitmq
StevenSurpass11 天前
打印业务彻底解耦:FastPrintAgent 统一 JSON 模型 + FastReport 引擎的设计与落地
mqtt·http·中间件·打印·fastreport
Msshu12311 天前
什么是PD快充诱骗取电芯片,PD快充取电芯片如何选型
flink·rabbitmq·ambari·mariadb·storm·talkingdata
程序员黎剑11 天前
RabbitMQ-消息可靠性-publisher-confirm持久化与手动ack
分布式·rabbitmq·ruby