在物联网、实时通信场景中,MQTT协议因轻量、低功耗的特点被广泛应用,而Node.js凭借高效的异步I/O,非常适合快速开发MQTT客户端。本文将基于mqtt.js库,实现MQTT客户端的连接、消息订阅、发布全流程,代码可直接复制运行,新手也能快速上手。

一、环境准备

1. 初始化Node.js项目:npm init -y

2. 安装依赖包:npm install mqtt --save(mqtt.js是Node.js生态中最常用的MQTT客户端库,支持MQTT 3.1.1/5.0协议)

3. 准备MQTT服务器:可使用公共MQTT服务器(如mqtt://test.mosquitto.org),也可本地搭建EMQ X服务器,无需额外配置,直接可用。

二、完整代码实现(订阅+发布)

// 引入mqtt库
const mqtt = require('mqtt');

// 1. 连接MQTT服务器(公共服务器,无需账号密码)
const client = mqtt.connect('mqtt://test.mosquitto.org', {
  clientId: 'nodejs_mqtt_client_' + Math.random().toString(16).substr(2, 8), // 随机客户端ID,避免冲突
  clean: true, // 断开连接后清除会话
  connectTimeout: 4000 // 连接超时时间
});

// 2. 连接成功回调
client.on('connect', () => {
  console.log('MQTT客户端连接成功');
  // 订阅主题(自定义主题,如:nodejs/mqtt/demo)
  const topic = 'nodejs/mqtt/demo';
  client.subscribe(topic, (err) => {
    if (!err) {
      console.log(`成功订阅主题:${topic}`);
      // 订阅成功后,发布一条测试消息
      client.publish(topic, 'Hello MQTT! 我是Node.js客户端', (err) => {
        if (!err) {
          console.log('消息发布成功');
        }
      });
    }
  });
});

// 3. 接收订阅的消息
client.on('message', (topic, message) => {
  console.log(`收到主题【${topic}】的消息:${message.toString()}`);
});

// 4. 处理连接错误
client.on('error', (err) => {
  console.error('MQTT连接失败:', err);
  client.end(); // 错误时断开连接
});

// 5. 断开连接回调
client.on('close', () => {
  console.log('MQTT客户端已断开连接');
});

三、代码说明与扩展

1. 核心逻辑:通过mqtt.connect()建立连接,connect事件触发后执行订阅和发布操作,message事件监听接收消息,异常场景(错误、断开)做兜底处理。

2. 扩展技巧:若使用带账号密码的MQTT服务器,可在connect配置中添加username和password字段;如需持久化会话,将clean设为false;可订阅多个主题,只需多次调用client.subscribe()。

3. 运行测试:执行node mqtt-client.js,即可看到连接、订阅、发布、接收消息的完整日志,可多开几个终端运行,测试消息互通。

更多推荐