一、安装与基础配置
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()