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.jsmqtt.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博客

相关推荐
freewlt18 分钟前
React Server Components 深度解析:从原理到实战的完整指南
前端·javascript·react.js
zhensherlock37 分钟前
Protocol Launcher 系列:1Writer iOS 上的 Markdown 文档管理
javascript·笔记·ios·typescript·node.js·iphone·ipad
ZC跨境爬虫1 小时前
Playwright进阶操作:鼠标拖拽与各类点击实战(含自定义拖拽实例)
前端·爬虫·python·ui
小江的记录本1 小时前
【RabbitMQ】RabbitMQ核心知识体系全解(5大核心模块:Exchange类型、消息确认机制、死信队列、延迟队列、镜像队列)
java·前端·分布式·后端·spring·rabbitmq·mvc
心静财富之门1 小时前
《前端零基础入门:HTML + CSS + JavaScript 全套速查表(详细版 + 实例)》
前端·javascript·python
星空1 小时前
前端--A_4--HTML表单
前端
We་ct1 小时前
JS手撕:DOM操作 & 浏览器API高频场景详解
开发语言·前端·javascript·面试·状态模式·操作·考点
吴声子夜歌1 小时前
Node.js——操作MongoDB
数据库·mongodb·node.js
小江的记录本1 小时前
【RocketMQ】RocketMQ核心知识体系全解(5大核心模块:架构模型、事务消息两阶段提交、回查机制、延迟消息、顺序消息)
linux·运维·服务器·前端·后端·架构·rocketmq
三万棵雪松1 小时前
【Linux 物联网网关主控系统-Web部分(二)】
linux·前端·物联网