4. JavaScript MQTT.js客户端连接测试
任务目标
使用MQTT.js库在浏览器或Node.js环境中实现MQTT客户端的连接、消息订阅与发布,验证与Broker的消息收发闭环。
环境准备
安装MQTT.js库(Node.js环境):
npm install mqtt
浏览器环境可直接通过CDN引入:
<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
需要一个可用的MQTT Broker,本案例使用公共测试Broker:broker.emqx.io(WebSocket端口8084,TCP端口1883)。
完整实现代码
以下代码同时兼容Node.js与浏览器环境,实现连接、订阅、发布与消息接收的完整闭环:
// MQTT.js客户端连接测试
const mqtt = require('mqtt');
// 1. 连接Broker(Node.js使用TCP,浏览器使用WebSocket)
const brokerUrl = 'mqtt://broker.emqx.io:1883'; // 浏览器环境改为: 'ws://broker.emqx.io:8084'
const client = mqtt.connect(brokerUrl, {
clientId: 'mqtt_test_' + Math.random().toString(16).substr(2, 8),
clean: true,
connectTimeout: 4000,
reconnectPeriod: 1000
});
// 2. 连接成功回调
client.on('connect', () => {
console.log('[连接成功] 已连接到:', brokerUrl);
// 订阅主题
const topic = 'test/topic/example';
client.subscribe(topic, { qos: 1 }, (err) => {
if (err) {
console.error('[订阅失败]', err);
} else {
console.log('[订阅成功] 主题:', topic);
}
});
// 发布消息到同一主题
const message = JSON.stringify({
msg: 'Hello MQTT.js',
timestamp: Date.now()
});
client.publish(topic, message, { qos: 1 }, (err) => {
if (err) {
console.error('[发布失败]', err);
} else {
console.log('[发布成功] 消息:', message);
}
});
});
// 3. 接收消息回调
client.on('message', (topic, payload) => {
console.log('[收到消息] 主题:', topic);
console.log('[消息内容]', payload.toString());
// 验证闭环:收到自己发布的消息后断开连接
client.end(true);
});
// 4. 错误处理
client.on('error', (err) => {
console.error('[连接错误]', err);
client.end(true);
});
// 5. 断线重连回调
client.on('reconnect', () => {
console.log('[重连中] 正在尝试重新连接...');
});
// 6. 关闭连接回调
client.on('close', () => {
console.log('[连接关闭] 客户端已断开');
process.exit(0); // Node.js环境退出进程
});
运行方式
Node.js环境:
node mqtt_client_test.js
浏览器环境:将代码中brokerUrl改为ws://broker.emqx.io:8084,移除require('mqtt')行,并将剩余代码放入<script>标签中。
验证方法与通过条件
运行程序后,观察控制台输出,需依次满足以下条件即判定测试通过:
- 出现
[连接成功]日志,说明TCP/WebSocket连接建立成功; - 出现
[订阅成功]日志,说明订阅操作被Broker确认; - 出现
[发布成功]日志,说明消息已发送至Broker; - 出现
[收到消息]及对应的[消息内容]日志,且消息内容与发布内容一致,说明Broker正确路由消息至订阅者; - 程序自动退出(Node.js)或连接关闭日志出现,说明
client.end()正常执行。
若在10秒内未收到消息,请检查网络连通性及Broker地址是否正确。
常见问题
- 连接超时:公共Broker可能因网络限制不可达,可更换为本地Broker(如Mosquitto,默认端口1883)测试。
- 浏览器跨域限制:浏览器环境必须使用WebSocket协议(
ws://)而非TCP,且Broker需开启WebSocket监听。 - 消息未收到:确认订阅与发布使用完全相同的主题字符串(区分大小写)。