MQTT 3.1.1协议下CloudGate CG0102网关消息订阅异常排查及Ubuntu私有EMQX Broker搭建入门咨询
嘿,我来帮你拆解这两个问题,先搞定MQTTX收不到消息的排查,再给你Ubuntu搭建私有Broker的入门步骤:
一、MQTTX收不到网关消息的可能原因排查
- 主题不匹配:先确认网关配置的发布主题是不是
my_topic——MQTT主题大小写敏感,My_Topic和my_topic完全是两个不同的主题,别犯拼写或大小写的小错误! - 网关未成功连接Broker:去看看CloudGate CG0102的日志(一般设备有Web管理界面或者串口日志),有没有连接成功的提示?会不会出现连接超时、认证失败这类错误?
- MQTT版本不一致:你说网关用的是MQTT 3.1.1,一定要确认MQTTX的连接配置里也选了3.1.1版本(默认可能是3.1或者5.0,版本不匹配会直接导致连接异常)。
- QoS设置不匹配:如果网关发布消息用的是QoS 1或2,但MQTTX订阅时选了QoS 0,可能会出现消息丢失;另外,如果网关发布后没收到Broker的确认,也不会重复发送消息。
- 认证细节问题:虽然你说Broker和网关配置一致,但再仔细核对下MQTTX的用户名密码——有没有空格、大小写错误?有些设备会自动给账号密码加空格,这点很容易忽略。另外,EMQX公共Broker如果没开认证,用户名密码可以留空,但如果网关配置了,MQTTX也要完全对应。
- 网络/防火墙限制:先测试下本地能不能通
broker.emqx.io:1883,用telnet broker.emqx.io 1883或者nc -zv broker.emqx.io 1883看看端口是否能连通;有些公司网络会屏蔽MQTT端口,导致消息根本传不过来。 - Client ID冲突:如果网关和MQTTX用了一模一样的Client ID,Broker会踢掉先连接的那个,导致其中一方没法收发消息,务必确保两者的Client ID完全不同。
- 消息发布失败:网关可能发了不合法的JSON格式消息,或者消息大小超过了EMQX默认的256KB限制,Broker直接拒绝了。如果能访问EMQX公共Broker的监控页面,也可以看看有没有消息统计异常。
二、Ubuntu Bionic虚拟机搭建私有MQTT Broker入门指南
推荐用EMQX,毕竟你已经熟悉它的公共Broker,上手会特别快。跟着下面的步骤来:
- 更新系统依赖:先把Ubuntu的包列表更最新,装些必要的依赖:
sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common - 添加EMQX官方源:
curl -fsSL https://repos.emqx.io/gpg.pub | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://repos.emqx.io/emqx-ce/deb/ubuntu/ bionic stable" - 安装EMQX社区版:
sudo apt update && sudo apt install -y emqx - 启动EMQX服务:
sudo systemctl start emqx # 顺便设置开机自启,省得每次重启虚拟机还要手动开 sudo systemctl enable emqx - 配置远程访问:
打开EMQX的配置文件/etc/emqx/emqx.conf,找到listeners.tcp.default.bind这一行,把默认的127.0.0.1:1883改成0.0.0.0:1883——这样Broker就能监听所有网卡的请求,允许远程网关连接。改完后重启EMQX生效:sudo systemctl restart emqx - 开放防火墙端口:
Ubuntu Bionic默认用ufw防火墙,得把MQTT的1883端口和EMQX管理界面的18083端口开放:sudo ufw allow 1883/tcp sudo ufw allow 18083/tcp sudo ufw reload - 验证Broker运行:
打开浏览器访问http://<你的Ubuntu虚拟机IP>:18083,用默认账号admin、密码public登录管理界面,就能看到连接、消息的统计数据,确认Broker正常运行。 - 测试远程网关连接:
把网关的Broker地址改成你的Ubuntu虚拟机的公网/局域网IP,端口1883,然后用MQTTX订阅对应主题,测试能不能收到消息。 - Python消费消息示例:
用你熟悉的paho-mqtt库,给你个简单的示例代码,替换成你的私有Broker IP就能用:import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print(f"Connected successfully, result code: {rc}") client.subscribe("my_topic") def on_message(client, userdata, msg): print(f"Received message on topic {msg.topic}: {msg.payload.decode()}") client = mqtt.Client(client_id="python_consumer_001") client.on_connect = on_connect client.on_message = on_message # 替换成你的私有Broker IP client.connect("<你的Ubuntu虚拟机IP>", 1883, 60) client.loop_forever()
内容的提问来源于stack exchange,提问作者Thib




