使用 NodeJS 搭建 MQTT 服务端

引言

随着物联网(IoT)的迅速发展,MQTT协议因其轻量级和高效的特性,逐渐成为设备间数据传输的主流协议。本文将介绍如何使用NodeJS搭建一个基本的MQTT服务端,帮助开发者快速构建物联网应用。

什么是MQTT?

MQTT(Message Queuing Telemetry Transport)是一种发布/订阅(Publish/Subscribe)消息传输协议,专为低带宽、不可靠网络环境下的设备通信而设计。它允许客户端订阅感兴趣的主题,当有新消息时,服务端会推送给相关的订阅者。

准备工作

  • NodeJS:请确保安装了 NodeJS(推荐版本 >= 14.x)。
  • MQTT Broker库:我们将使用MoscaAedes库,它们是基于 NodeJS 的轻量级 MQTT broker 实现。
  • 本次实战依然基于 MacOS

步骤1:创建项目并安装依赖

  1. 初始化一个新的NodeJS项目:

    mkdir test-mqtt-server
    cd test-mqtt-server
    npm init -y
    
  2. 安装 Aedes 库(或 M)以及MQTT

    npm install aedes mqtt --save
    

步骤2:编写 MQTT 服务端代码

在项目根目录下创建server.js文件,编写MQTT服务端的基础代码:

const aedes = require('aedes')();
const server = require('net').createServer(aedes.handle);
const PORT = 1883;server.listen(PORT, function () {console.log(`MQTT server is running on port ${PORT}`);
});aedes.on('client', (client) => {console.log(`Client Connected: ${client.id}`);
});aedes.on('clientDisconnect', (client) => {console.log(`Client Disconnected: ${client.id}`);
});aedes.on('publish', (packet, client) => {console.log(`Message Published: ${packet.payload.toString()}`);
});

步骤3:运行并测试服务端

  1. 启动MQTT服务端:

    node server.js
    
  2. 使用MQTT客户端工具(如MQTTX)连接到服务端localhost:1883

  3. 订阅和发布消息,观察服务端输出日志以确认服务端是否正确接收到消息。

步骤4:提升安全性

在生产环境中,为了提升MQTT服务端的安全性,可以通过设置用户名和密码来限制访问。以下是增强安全性的示例代码,使用了Aedesauthenticate方法来添加用户认证。

const aedes = require("aedes")();
const server = require("net").createServer(aedes.handle);
const PORT = 1883;// 用户认证信息(示例),包含用户名、密码和ClientID
const USERS = {user1: { password: "password1", clientId: "client1" },user2: { password: "password2", clientId: "client2" },
};server.listen(PORT, function () {console.log(`MQTT server is running on port ${PORT}`);
});// 用户认证方法,验证ClientID、用户名和密码
aedes.authenticate = (client, username, password, callback) => {const user = USERS[username];if (!user) {// 用户名不存在const error = new Error("Authentication Failed: Username not found");error.returnCode = 4;return callback(error, null);}if (user.password !== password.toString()) {// 密码错误const error = new Error("Authentication Failed: Incorrect password");error.returnCode = 4;return callback(error, null);}if (user.clientId !== client.id) {// ClientID不匹配const error = new Error(`Authentication Failed: ClientID "${client.id}" is not authorized`);error.returnCode = 4;return callback(error, null);}// 认证成功callback(null, true);
};aedes.on("client", (client) => {console.log(`Client Connected: ${client.id}`);
});aedes.on("clientDisconnect", (client) => {console.log(`Client Disconnected: ${client.id}`);
});aedes.on("publish", (packet, client) => {console.log(`Message Published: ${packet.payload.toString()}`);
});

步骤5:使用 Topic

在生产环境中,为了提升MQTT服务端的安全性,可以通过设置用户名和密码来限制访问。以下是增强安全性的示例代码,使用了Aedesauthenticate方法来添加用户认证。

在MQTT服务中,Topic(主题)是一个用于分类和过滤消息的机制。每个客户端可以订阅或发布特定的主题,服务端会根据主题将消息路由到相应的订阅者。

以下是一个示例,用于展示如何在Node.js中使用MQTT主题来管理和分类不同类型的消息。

场景:设备每 5 分钟上报一次温度,当服务端接收到阀值温度时,打开设备通风开关。

服务端核心代码

...const TEMPERATURE_THRESHOLD = 25;  // 温度阈值...
// 当接收到温度数据时,根据温度值决定是否开启设备
aedes.on('publish', (packet, client) => {const topic = packet.topic;const message = packet.payload.toString();if (topic === 'sensor/temperature') {console.log(`Received temperature: ${message}°C`);// 判断温度是否超过阈值const temperature = parseFloat(message);if (temperature > TEMPERATURE_THRESHOLD) {console.log('Temperature exceeds threshold. Sending switch ON command.');aedes.publish({ topic: 'command/switch', payload: 'ON' });}}
});

总结

本文介绍了如何使用NodeJS搭建一个基本的MQTT服务端,为实现物联网设备间的消息通信奠定基础。在实际项目中,可能需要根据需求进一步扩展MQTT服务端的功能,如加入持久化存储、负载均衡等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13968.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

学术界的秘密武器:Zotero7大插件推荐

还在为海量文献管理头疼吗?还在为找不到合适的插件犯愁吗?别急,今天我就要带你解锁Zotero的终极武器 - 那些让你爱不释手的必备插件! 作为一个从小白到文献管理达人的过来人,我可以负责任地说:没有这些插件,你的Zotero只能发挥一半功力!安装了这些插件,你的效率绝对能飙升! …

Linux·进程信号

信号是一种用户、OS、其他进程,向目标进程发送异步事件的一种方式。 在系统中信号是OS出场时程序员就内置好了的,因此任何进程都认识所有信号,信号产生之前,信号的处理方案就已经设定好了,一般有三种 1. 默认行为 2.…

BizDevOps:从理念到实践,贯通企业全链路协同

👆 点击蓝字 关注我们 引言 BizDevOps的概念由DevOps发展和进化而来,其目标超越了开发和运维的协同,进一步实现业务、研发和运维的全链条协作,让业务作为价值的起点及核心目标。 BizDevOps的核心驱动力在于解决效率和正确性上的割…

工厂方法模式和抽象工厂模式

序 本文主要是记录学习设计模式当中的工厂方法和抽象工厂时碰到的疑惑和对答案的探讨 刚接触时的工厂方法模式和抽象工厂模式 工厂方法模式 类图 代码 //工厂public interface TVFactory {TV produce(); }public class TclTVFactory implements TVFactory{Overridepublic T…

NVR小程序接入平台EasyNVR多品牌NVR管理工具/设备:RTMP协议摄像头的接入

随着安防技术的不断进步,越来越多的摄像头开始支持RTMP(Real Time Messaging Protocol)协议,这种协议使得视频流的实时传输和分发变得更加高效和便捷。NVR小程序接入平台EasyNVR作为一款功能强大的流媒体服务器,支持多…

硬件基础20 数模转换器D/A DAC

目录 一、DAC基本原理 二、倒T形电阻网络D/A转换器 三、权电流型D/A转换器 四、重要技术指标与参数 1、分辨率/位数 2、转换精度 (1)、比例系数误差 (2)、失调误差 3、转换速度 4、温度系数 五、DAC的应用 1、数字式可…

Memory consistency model 梳理目录

(图片来源:https://mp.weixin.qq.com/s/uz4fZgJSRNm-MIRdXgBMmw) 闲聊内存模型(Memory Model)https://blog.csdn.net/zhangshangjie1/article/details/143743250?sharetypeblogdetail&sharerId143743250&sharereferPC&sharesourcezhangshangjie1&…

WPF Prism框架

Prism 是一个开源框架,专门用于开发可扩展、模块化和可测试的企业级 XAML 应用程序,适用于 WPF(Windows Presentation Foundation)和 Xamarin Forms 等平台。它基于 MVVM(Model-View-ViewModel)设计模式&am…

智能零售柜商品识别

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

SSH远程连接工具详解

SSH远程连接工具指的是基于SSH(Secure Shell)协议进行远程连接和管理的工具。SSH是一种加密的网络协议,用于在不安全的网络环境中安全地传输数据,并实现远程访问和管理。以下是对远程SSH工具的详细解释: 一、SSH协议概…

卷积层的堆叠、Stacking堆叠法

3个3x3的卷积层串联的效果则相当于1个7x7的卷积层。那为什么选择使用3个3x3的卷积层而不是使用1个7x7的卷积层呢? (1)3个串联的3x3的卷积层,拥有比1个7x7的卷积层更少的参数,参数量是后者的(3x3x3 ) /&…

【模块一】kubernetes容器编排进阶实战之containerd安装及nerdctl客户端⼯具

安装containerd apt/yum安装 #验证仓库版本 [rootk8s-node3 ~]#apt-cache madison containerd containerd | 1.7.12-0ubuntu2~22.04.1 | https://mirrors.aliyun.com/ubuntu jammy-updates/main amd64 Packages containerd | 1.6.12-0ubuntu1~22.04.3 | https://mirrors.aliy…

公司电脑加全屏水印怎么加(怎么打水印满屏)?4个方法精选!包教包会!

在企业管理中,为了保护公司机密信息的安全,给公司电脑添加全屏水印已成为一种常见的安全措施。 全屏水印不仅可以震慑潜在的窥探者,还能在信息不慎泄露时提供追溯线索。 那么,如何给公司电脑添加全屏水印呢? 以下是4…

public or static包下的 html 丢了(404)? 你快回来! 我一人承受不来

没想到吧,我把html还是放到了jar包中~ 环境: Spring Boot 版本 2.XJava 版本 1.8.0 及以上 问题: public or static包下的 html 丢了(404)? 话不多说先上图 我的目录结构是这样的 src └─…

使用多种机器学习调参模型进行二分类建模的全流程,代做分析辅导

使用多种机器学习调参模型进行二分类建模的全流程教程 机器学习全流程分析各个模块用到的总的参数文件 0. 分析参数文件 参数文件名称:total_analysis_params_demo.xlsx ,很多分析模块都是这个总的参数文件,我的这个总的参数文件如果有更新…

国家博物馆数据的爬取(包括xlsx文件、csv文件、图片爬取)

1、请求html数据 右键检查这里静态的数据被注释掉了,只能读取一条数据 import json import pandas as pd import requests from bs4 import BeautifulSoup import csv from urllib.parse import quote # 起始网址 header={User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; …

云技术基础介绍

云技术介绍 一、云技术历史 二、云服务 三、公有云服务商 四、云分类 1. 服务层级 IaaS (基础设施即服务) PaaS (平台即服务) SaaS (软件即服务) 2. 云部署模式的分类 公有云 (Public Cloud) 私有云 (Private Cloud) 混合云 (Hybrid Cloud) 社区云 (Community Clo…

常用的c++新特性-->day09

原子变量 C11提供了一个原子类型std::atomic,通过这个原子类型管理的内部变量就可以称之为原子变量,我们可以给原子类型指定bool、char、int、long、指针等类型作为模板参数(不支持浮点类型和复合类型)。 原子变量会把线程对数据的…

新的服务器Centos7.6 安装基础的环境配置(新服务器可直接粘贴使用配置)

常见的基础服务器配置之Centos命令 正常来说都是安装一个docker基本上很多问题都可以解决了,我基本上都是通过docker去管理一些容器如:mysql、redis、mongoDB等之类的镜像,还有一些中间件如kafka。下面就安装一个 docker 和 nginx 的相关配置…

RAG与知识库搭建,手把手教你构建RAG系统

0. 简介 自从发现可以利用自有数据来增强大语言模型(LLM)的能力以来,如何将 LLM 的通用知识与个人数据有效结合一直是热门话题。关于使用微调(fine-tuning)还是检索增强生成(RAG)来实现这一目标…