简说MQTT
🌟 对比一下 MQTT 的 TCP 与 WebSocket,以及推荐一些常用的免费 Broker!
🚀 MQTT 的 TCP 与 WebSocket 对比
特性 | TCP (1883 / 8883) | WebSocket (8000 / 8083 / wss) |
---|---|---|
📦 底层协议 | 直接 TCP / TLS | WebSocket(基于 HTTP 升级的持久连接) |
🌐 用途 | 适合嵌入式设备、物联网、后端服务 | 适合浏览器、网页应用、受限网络 |
🔒 安全性 | 用 TLS (8883) 加密 | 用 WSS 加密 |
🔧 防火墙穿透 | 有时受限(1883/8883 可能被封) | 容易穿透(因为走 HTTP(S) 端口) |
📡 延迟 | 最低延迟 | 略高(WebSocket 握手需要 HTTP 升级) |
🤖 客户端支持 | 嵌入式、后端、手机、PC、MQTT 客户端 | 浏览器(JS),也支持后端和手机 |
⚙ 部署复杂度 | 简单(直接开端口) | 稍复杂(需配置 WebSocket 服务或反向代理) |
🌐 什么时候用 TCP?
✅ 物联网设备(ESP32、树莓派等)
✅ 后台服务通信
✅ 对延迟特别敏感的应用
🌐 什么时候用 WebSocket?
✅ 需要在浏览器里直接用 MQTT 的场景
✅ 前端 H5、大屏可视化、Web 控制台
✅ 客户端在受限网络(公司/学校/运营商防火墙)
🌟 常用免费 MQTT Broker
Broker | TCP | WebSocket | 网址 | 备注 |
---|---|---|---|---|
HiveMQ Public Broker | ✅ 1883 | ✅ 8000 (ws) / 8884 (wss) | HiveMQ | 稳定、官方提供在线 WebSocket 客户端 |
Eclipse Mosquitto 公共测试服务 | ✅ 1883 | ✅ 8080 (ws), 8081 (wss) | Mosquitto | 免费测试,不保证持久可用 |
EMQX Public Broker | ✅ 1883 | ✅ 8083 (ws), 8084 (wss) | EMQX | 支持 MQTT 5.0 和 WebSocket |
Adafruit IO (需注册) | ✅ 1883 (需要账号) | ✅ WSS | Adafruit IO | 支持数据可视化,免费有数据量限制 |
🔑 重点总结
✅ TCP:适合设备、后端、延迟敏感
✅ WebSocket:适合浏览器、H5、跨防火墙场景
✅ 公共 broker 推荐用 HiveMQ 或 EMQX(比较稳定、支持 WebSocket)
✅ 免费 broker 公共 topic 数据是全网可见,别发敏感信息
💡 示例连接地址
Broker | TCP 地址 | WebSocket 地址 |
---|---|---|
HiveMQ | broker.hivemq.com:1883 | ws://broker.hivemq.com:8000/mqtt |
EMQX | broker.emqx.io:1883 | ws://broker.emqx.io:8083/mqtt |
Mosquitto | test.mosquitto.org:1883 | ws://test.mosquitto.org:8080/mqtt |
💡 在 Linux 下用 Bash 发一条 MQTT 消息测试 Broker,几种简单可靠的方法!
✅ 方法 1: 使用 mosquitto_pub
👉 如果你有安装 Mosquitto 客户端工具(推荐)
mosquitto_pub -h broker.hivemq.com -p 1883 -t "test/hello" -m "你好 MQTT!"
如果你用 WebSocket 端口(例如 broker.hivemq.com:8000
),Mosquitto 客户端不支持直接用 WebSocket,只能用 TCP(1883 或其他端口)。
✅ 方法 2: 使用 websocat(支持 WebSocket)
👉 安装 websocat
:
sudo apt install websocat # 有的系统可用
# 或下载二进制: https://github.com/vi/websocat/releases
👉 用 WebSocket 发 MQTT 帧(示例复杂,WebSocket 手工发 MQTT 帧不推荐)
✅ 方法 3: 使用 Node / Python 脚本(推荐 WebSocket)
如果你需要 WebSocket,可以用 Node.js 或 Python:
Node (mqtt.js)
npm install mqtt -g
然后:
node -e "
const mqtt = require('mqtt');
const client = mqtt.connect('ws://broker.hivemq.com:8000/mqtt');
client.on('connect', () => {client.publish('test/hello', '你好 MQTT!');client.end();
});
"
Python (paho-mqtt,走 TCP,不走 WebSocket)
pip install paho-mqtt
python3 -c "
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect('broker.hivemq.com', 1883, 60)
client.publish('test/hello', '你好 MQTT!')
client.disconnect()
"
🌟 最简单的 Bash 命令
如果你走 TCP:
mosquitto_pub -h broker.hivemq.com -p 1883 -t "test/hello" -m "你好 MQTT!"
⚡ 总结
工具 | 是否支持 WebSocket | 适合用途 |
---|---|---|
mosquitto_pub | ❌(仅 TCP/TLS) | 快速 MQTT 测试 |
websocat | ✅(支持 WebSocket,但需构造帧) | 调试 WebSocket |
Node mqtt.js | ✅ | WebSocket / TCP 都可 |
Python paho | ❌(仅 TCP/TLS) | 脚本式 MQTT 测试 |
下面用 Node.js mqtt.js 写的测试脚本,支持同时连接 TCP 和 WebSocket 两种协议的 MQTT Broker,发消息并订阅主题,方便快速测试。
// mqtt-test.js
const mqtt = require('mqtt');// 从命令行参数获取连接参数
// node mqtt-test.js tcp ws
const tcpBroker = 'mqtt://broker.hivemq.com:1883';
const wsBroker = 'ws://broker.hivemq.com:8000/mqtt';
const topic = 'test/hello';// 创建客户端,传入不同的 URL,mqtt.js 会自动识别 TCP 或 WS
const clients = {tcp: mqtt.connect(tcpBroker),ws: mqtt.connect(wsBroker),
};function setupClient(client, name) {client.on('connect', () => {console.log(`[${name}] 已连接`);client.subscribe(topic, (err) => {if (err) {console.error(`[${name}] 订阅失败:`, err.message);} else {console.log(`[${name}] 已订阅主题: ${topic}`);// 连接后发送测试消息client.publish(topic, `Hello MQTT from ${name} at ${new Date().toISOString()}`);}});});client.on('message', (t, message) => {console.log(`[${name}] 收到消息: [${t}] ${message.toString()}`);});client.on('error', (err) => {console.error(`[${name}] 错误:`, err.message);});client.on('close', () => {console.log(`[${name}] 连接关闭`);});
}console.log('启动 TCP 和 WebSocket MQTT 测试客户端');setupClient(clients.tcp, 'TCP');
setupClient(clients.ws, 'WebSocket');// 进程退出时断开连接
process.on('SIGINT', () => {console.log('断开所有连接...');clients.tcp.end();clients.ws.end();process.exit();
});
使用方法
- 确保你安装了 Node.js 和 mqtt.js:
npm install mqtt
-
保存上面代码为
mqtt-test.js
-
运行:
node mqtt-test.js
说明
- 脚本会同时连接 HiveMQ 的 TCP 和 WebSocket Broker
- 连接成功后自动订阅
test/hello
主题 - 并发布一条带时间戳的测试消息
- 收到消息时会打印出来
- Ctrl+C 可退出并关闭连接