4. MQTT遗嘱消息配置与断线触发验证

MQTT遗嘱消息配置与断线触发验证 学习卡片

任务目标

使用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>标签中。

验证方法与通过条件

运行程序后,观察控制台输出,需依次满足以下条件即判定测试通过:

  1. 出现[连接成功]日志,说明TCP/WebSocket连接建立成功;
  2. 出现[订阅成功]日志,说明订阅操作被Broker确认;
  3. 出现[发布成功]日志,说明消息已发送至Broker;
  4. 出现[收到消息]及对应的[消息内容]日志,且消息内容与发布内容一致,说明Broker正确路由消息至订阅者;
  5. 程序自动退出(Node.js)或连接关闭日志出现,说明client.end()正常执行。

若在10秒内未收到消息,请检查网络连通性及Broker地址是否正确。

常见问题

  • 连接超时:公共Broker可能因网络限制不可达,可更换为本地Broker(如Mosquitto,默认端口1883)测试。
  • 浏览器跨域限制:浏览器环境必须使用WebSocket协议(ws://)而非TCP,且Broker需开启WebSocket监听。
  • 消息未收到:确认订阅与发布使用完全相同的主题字符串(区分大小写)。