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