MQTT 服务搭建

MQTT 服务搭建(Node.js)

最近在写自己的毕设,采用的技术栈是 node + MySQL 和 Vue3 + Element Plus,还用了一个即时通讯协议 MQTT。

对这个 MQTT 的东西感到比较疑惑,网上资料也参差不齐,所以打算做一个总结。

MQTT 协议介绍

MQTT协议(Message Queuing Telemetry Transport,消息队列遥测传输)是一种基于发布/订阅模式的轻量级消息协议,它适用于网络带宽有限或网络环境不稳定的情况。有如下优点:

  • 轻量级与带宽小:MQTT协议设计简单,消息头部较小,协议传输的数据量也较小。即使在网络状况较差的情况下,MQTT也能提供不错的体验。
  • 发布/订阅模型:MQTT协议采用发布/订阅模型,设备之间通过中间代理服务器进行通信。发布者将消息发布到代理服务器上,订阅者从代理服务器接收与其订阅主题相关的消息。
  • 可靠性:MQTT协议支持三种不同的服务质量(QoS)级别,包括最多一次传递、至少一次传递和只有一次传递,从而提供了不同的消息传输可靠性选项。
  • 异步通信:MQTT协议使用异步通信模型,客户端可以通过订阅主题来接收实时的消息,从而支持实时事件驱动的应用场景。

一些小知识:

如果 MQTT Client 想接收离线信息:

Client 必须使用持久化的对话

持久化会话要求客户端必须使用固定的 Client ID 连接

MQTT 中的 QoS 等级:

QoS 0, At most once, 至多一次

QoS 1, At least once, 至少一次

QoS 1, Exactly once, 确保能,且只能收到一次

代码环节

在查询一些资料后发现 mosca 已经停止维护了,它的开发者已经推出了一个叫 aedes 的库,支持性更好。

安装 aedes

首先得先安装 aedes.js 和 mqtt.js

shell 复制代码
yarn add aedes
yarn add mqtt

我的文件目录是这样的

lua 复制代码
 ├── index.js
 ├── pub.js
 ├── sub.js
 └── pakage.js

MQTT 服务器部署

首先完成 MQTT 本地服务器的部署,新建一个文件 index.js

js 复制代码
const aedes = require('aedes')();
const mqttServer = require('net').createServer(aedes.handle);
const mqttPort = 1883;

mqttServer.listen(port, function () {
    console.log('mqtt server started and listening on port ', port)
});

// 身份验证
aedes.authenticate = function (_client, username, password, callback) {
    // with no error, successful be true
    // callback(error, successful)
    callback(null, (username === 'user' && password.toString() === '123456'));
}

// 客户端连接
aedes.on('client', function (client) {
    console.log('Client Connected: \x1b[33m' + (client ? client.id : client) +
    '\x1b[0m', 'to broker', aedes.id);
});

// 客户端断开
aedes.on('clientDisconnect', function (client) {
    console.log('Client Disconnected: \x1b[31m' + (client ? client.id : client) + 
    '\x1b[0m', 'to broker', aedes.id);
});

订阅者创建

新建一个 sub.js 文件

js 复制代码
const mqtt = require("mqtt");

const client = mqtt.connect("mqtt://127.0.0.1:1883", {
  username: "user",
  password: "123456",
});

client.on("connect", function () {
  console.log("服务器连接成功");
  console.log(client.options.clientId);
  client.subscribe("text", { qos: 1 }); // 订阅text消息
});

client.on("message", function (top, message) {
  console.log("当前topic:", top);
  console.log(message.toString());
});

client.on("error", function (error) {
  console.log(error);
});

client.on("disconnect", function (packet) {
  console.log('连接断开');
});

发布者创建

新建一个 pub.js 文件

js 复制代码
const mqtt = require("mqtt");

const client  = mqtt.connect('mqtt://127.0.0.1:1883',{
  username: "user",
  password: '123456'
});

client.on("connect", function() {
  console.log("服务器连接成功");
  console.log(client.options.clientId);
  client.publish("text", JSON.stringify({id: 1}), { qos: 0, retain: true }); // 发布主题text消息
});

client.on('error', function (error) {
  console.log(error)
})

client.on('disconnect', function (packet) {
  console.log(packet)
})

所有文件都创建完毕后,依次执行:

shell 复制代码
node index
node sub
node pub

这样,一个简易的 demo 就做好了。

有更多需求的可以参考官方 api,链接就在下面,需要一定的英语能力。

参考文章:

aedes 的官方示例(英文)

aedes api 参考

MQTT 持久会话与 Clean Session 详解 | EMQ (emqx.com)

nodejs 快速搭建MQTT服务器_node aedes-CSDN博客

相关推荐
门思科技1 小时前
LoRaWAN 网络排障的五层漏斗:从"上不到云"到"数值不对",每一层该用什么工具证明
前端
计算机魔术师1 小时前
Cursor 官方插件商城现恶意 Claude Code 扩展,约 11 小时影响最多 5000 名开发者
前端
掘金者阿豪1 小时前
MongoDB迁移到金仓数据库:商品属性继续灵活存,订单报表交给 SQL
前端·后端
栉甜2 小时前
Vue2学习内容(上)
前端·javascript·vue.js·学习
梦曦i2 小时前
v0.2.0 架构升级:class + reactive 重塑状态管理
前端·uni-app x
布丁爱干饭2 小时前
寄给午后
前端
java1234_小锋2 小时前
【技术专题】CSS3 网页技术 - CSS3 布局进阶
前端·css·css3
zhippt_10143 小时前
只剩截图没有源文件?图转PPT把图片还原成可编辑幻灯片
前端·人工智能·powerpoint
shmily麻瓜小菜鸡3 小时前
TypeScript 知识点补充(第三部分:工程化与高级类型)
前端·javascript·typescript
10岁的博客3 小时前
Chrome 扩展安全攻防实录:从权限模型到真实漏洞复盘
前端·chrome·安全