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

相关推荐
CL_IN31 分钟前
企业数据集成:实现高效调拨出库自动化
java·前端·自动化
浪九天2 小时前
Vue 不同大版本与 Node.js 版本匹配的详细参数
前端·vue.js·node.js
qianmoQ2 小时前
第五章:工程化实践 - 第三节 - Tailwind CSS 大型项目最佳实践
前端·css
椰果uu3 小时前
前端八股万文总结——JS+ES6
前端·javascript·es6
微wx笑3 小时前
chrome扩展程序如何实现国际化
前端·chrome
~废弃回忆 �༄3 小时前
CSS中伪类选择器
前端·javascript·css·css中伪类选择器
CUIYD_19893 小时前
Chrome 浏览器(版本号49之后)‌解决跨域问题
前端·chrome
IT、木易3 小时前
跟着AI学vue第五章
前端·javascript·vue.js
薛定谔的猫-菜鸟程序员3 小时前
Vue 2全屏滚动动画实战:结合fullpage-vue与animate.css打造炫酷H5页面
前端·css·vue.js
春天姐姐4 小时前
vue3项目开发总结
前端·vue.js·git