MQTT到串口的转发(node.js)

        本文针对以下应用场景:已有通过串口通信的设备或软件,想要实现跨网的远程控制。

        

        node.js安装

       从 Node.js — Run JavaScript Everywhere下载LTS版本安装包,运行安装程序。(傻瓜安装,按提示点击即可)

        设置环境变量,在path新增node.js安装路径 

    

        此时从命令提示符中输入npm -v和node -v可以看到版本表示安装成功

        因为要用到mqtt和串口,所以需要安装对应的模块 

npm install mqtt
npm install serialport

        接下来就是源码,我们的配置文件名为config.json,里面包含了连接mqtt服务器相关的信息,订阅及发布的主题等。

        首先读取配置文件,如果不存在则创建文件并写入配置参数。如果配置文件存在则读取数据,并使用读到的配置信息去连接mqtt服务器以及订阅和发布消息。在这里我使用了固定串口,如果有需要调整串口也可以放到配置文件中。

        整个程序的功能是连接mqtt服务器并订阅一个主题,如果从该主题收到数据则从串口发出,如果串口收到数据则从另一个主题发布出去。

const mqtt = require('mqtt');
const {SerialPort} = require('serialport');
const fs=require('fs');
const filepath='config.json';var config=null;
fs.readFile(filepath, 'utf8', (err, data) => {if (err) {console.error('Error reading configuration:', err);config={mqtt_config:{url:'mqtt://39.105.166.225:1883',options:{username: 'admin',password: '123456',clientid: 'mushike',keepalive:60,qos:1, },},sub_config:{subtopic1:'test111',subtopic2:'test333',},pub_config:{pubtopic1:'test222',pubtopic2:'test444',},    };fs.writeFile(filepath,JSON.stringify(config,null,2),(err)=>{if(err){console.error('Error creating file:', err);}else{console.log('File created successfully!');}});} else {const storedConfig = JSON.parse(data);config=storedConfig;};// 连接 MQTT Broker 并订阅主题const client = mqtt.connect(config.mqtt_config.url,config.mqtt_config.options);client.on('connect', function () {console.log('Connected to MQTT broker');client.subscribe(config.sub_config.subtopic1);});// 监听 MQTT 消息client.on('message', function (topic, message) {console.log('Received message from MQTT:', message);port.write(message.toString() + '\n'); // 将收到的消息写入串口});client.on('error', function (err) {console.error('Error connecting to MQTT broker:', err);});});const portSettings = {path:'COM6',baudRate: 9600,dataBits: 8, // 数据位stopBits: 1, // 停止位parity: 'none', // 奇偶校验位autoOpen:true};// 串口设置
const port = new SerialPort(portSettings);port.on('open',function(){console.log('serial is open');port.on('data', function(data) {console.log('Data received:', data);client.publish(config.pub_config.pubtopic1,data);});
});

        运行程序使用node test.js

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络传输层

叠甲:以下文章主要是依靠我的实际编码学习中总结出来的经验之谈,求逻辑自洽,不能百分百保证正确,有错误、未定义、不合适的内容请尽情指出! 文章目录 1.端口号的基础2.传输层两协议2.1.UDP 协议2.1.1.协议结构2.1.2.封…

传统关系型数据库与hive的区别

数据库和Hive之间存在本质的区别,主要体现在设计目的、数据处理方式、数据存储、查询延迟、数据更新能力、以及适用场景等方面。下面详细阐述它们之间的主要差异: 设计目的与应用场景: 数据库:主要是面向事务处理(OLTP…

虚拟海外仓用什么系统,怎么选性价比高适合自己的WMS系统

虚拟海外仓作为一种新兴的仓储模式,还是收到很多跨境卖家欢迎的。然而对虚拟海外仓的经营企业来说,选择什么样的wms系统来提升自己仓库管理的效率,还是需要花费一些心思的。 1.虚拟海外仓有什么特点 所谓的虚拟海外仓,就是整合全…

CPP Con 2020:Type Traits I

先谈谈Meta Programming 啥是元编程呢?很简单,就是那些将其他程序当作数据来进行处理和传递的编程(私人感觉有点类似于函数式?)这个其他程序可以是自己也可以是其他程序。元编程可以发生在编译时也可以发生在运行时。…

LAMDA面试准备(2024-05-23)

有没有学习过机器学习,提问了 FP-Growth 相比 Apriori 的优点 1. 更高的效率和更少的计算量(时间) FP-Growth 通过构建和遍历 FP-树 (Frequent Pattern Tree) 来挖掘频繁项集,而不需要像 Apriori 那样生成和测试大量的候选项集。具…

【阿里前端面试题】知道了解浏览器渲染对自己有什么帮助?

大家好,我是“寻找DX3906”。每天进步一点。日积月累,有朝一日定会厚积薄发! 前言: 前面已经和大家分享了3篇面试题: 《【阿里前端面试题】浏览器的加载渲染过程》 《【阿里前端面试题】客户端和服务器交互&#xff0…

5.23.2 深度学习提高乳房 X 光检查中乳腺癌的检测率

开发了一种深度学习算法,该算法可以使用“端到端”训练方法在筛查乳房 X 光检查中准确检测出乳腺癌,该方法有效地利用了具有完整临床注释或仅具有整个图像的癌症 标签 的训练数据集。 在这种方法中,仅在初始训练阶段才需要病变注释&#xff…

springboot vue 开源 会员收银系统 (2) 搭建基础框架

前言 完整版演示 前面我们对会员系统https://blog.csdn.net/qq_35238367/article/details/126174288进行了分析 确定了技术选型 和基本的模块 下面我们将从 springboot脚手架开发一套收银系统 使用脚手架的好处 不用编写基础的rabc权限系统将工作量回归业务本身生成代码 便于…

conda使用常用命令

Conda是一个非常常用的Python包管理器,也是Anaconda Python发行版的一部分。它可以帮助用户安装、更新、卸载Python包,以及管理Python虚拟环境。在这篇博客中,我们将总结一些常用的Conda命令及其用法。 安装和更新Conda 在使用Conda之前&…

React 性能优化

性能优化 React 性能优化方案,说出来可能有很多,但是那些是所有前端项目、框架都需要做的。如 代码分割,代码压缩,使用生产版本的代码等(前端框架都需要,通用方案) 渲染列表时合理使用 key &a…

Tensorflow入门实战 P01-实现手写数字识别mnist

目录 1、背景:MNIST手写数字识别 2、完整代码(Tensorflow): 3、运行过程及结果: 4、小结(还是很清晰的) 5、 展望 🍨 本文为🔗365天深度学习训练营 中的学习记录博客…

Kafka之【生产消息】

消息(Record) 在kafka中传递的数据我们称之为消息(message)或记录(record),所以Kafka发送数据前,需要将待发送的数据封装为指定的数据模型: 相关属性必须在构建数据模型时指定,其中…

深入了解YUM:原理、作用及异常处理最佳实践20240523

深入了解YUM:原理、作用及异常处理最佳实践 引言 作为一名Linux系统管理员或开发者,你一定对软件包管理有深刻的理解。在CentOS等基于RPM的系统中,YUM(Yellowdog Updater, Modified)是一个强大的包管理工具。它不仅简…

本地spark3.5(不整合hive) 集成paimon0.9

spark官网下载集成hadoop的spark包: spark-3.5.1-bin-hadoop3.... 解压后 环境变量配置 SPARK_HOME spark-defaults.conf 中增加一行配置(避免启动spark-sql报错hive元数据连不上): spark.sql.catalogImplementationhive 打开paimon官网: https://paimon.apache.org/docs/mas…

JavaEE技术之分布式事务(理论、解决方案、Seata解决分布式事务问题、Seata之原理简介、断点查看数据库表数据变化)

文章目录 JavaEE技术之分布式事务准备:1. 本地事务回顾1.1 什么是事务1.2 事务的作用1.3 事务ACID四大特性1.4 事务的并发问题1.5 MySQL事务隔离级别1.6 事务相关命令(了解)1.7 事务传播行为(propagation behavior)1.8 伪代码练习1.9 回滚策略1.10 超时事…

144.栈和队列:有效的括号(力扣)

题目描述 代码解决 class Solution { public:bool isValid(string s) {// 如果字符串长度为奇数&#xff0c;不可能是有效的括号字符串if(s.size() % 2 ! 0) return false;// 使用栈来存放括号stack<char> st;// 遍历字符串中的每一个字符for(int i 0; i < s.size();…

Error:(6, 43) java: 程序包org.springframework.data.redis.core不存在

目录 一、在做SpringBoot整合Redis的项目时&#xff0c;报错&#xff1a; 二、尝试 三、解决办法 一、在做SpringBoot整合Redis的项目时&#xff0c;报错&#xff1a; 二、尝试 给依赖加版本号&#xff0c;并且把版本换了个遍&#xff0c;也不行&#xff0c;也去update过ma…

MYSQL变更性别

Salary 表&#xff1a; ----------------------- | Column Name | Type | ----------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int | ----------------------- id 是这个表的主键&#xff…

Parasoft C++Test软件静态分析操作指南_软件质量度量

系列文章目录 Parasoft CTest软件安装指南 Parasoft CTest软件静态分析操作指南_编码规范/标准检查 Parasoft CTest软件静态分析操作指南_软件质量度量 Parasoft CTest软件静态分析_自动提取静态分析数据生成文档 Parasoft CTest软件单元测试_操作指南 Parasoft CTest软件单元…

C语言章节学习归纳--数据类型、运算符与表达式

3.1 C语言的数据类型&#xff08;理解&#xff09; 首先&#xff0c;对变量的定义可以包括三个方面&#xff1a; 数据类型 存储类型 作用域 所谓数据类型是按被定义变量的性质&#xff0c;表示形式&#xff0c;占据存储空间的多少&#xff0c;构造特点来划分的。在C语言中&…