Emperor_Shun_Reading/electron/service/hardware.js

138 lines
3.6 KiB
JavaScript
Raw Normal View History

2024-08-22 01:03:01 +00:00
'use strict';
const { Service } = require('ee-core');
// 串口的功能
const { SerialPort } = require('serialport')
// 保存串口实例
var seriaPortIns = undefined;
// 这个是处理时间的库
var moment = require('moment')
// Modbus TCP
// create an empty modbus client
const ModbusRTU = require("modbus-serial")
var client = new ModbusRTU();
// open connection to a tcp line
// 创建Modbus TCP连接IP是15.18.200.23,端口502
// client.connectTCP("15.18.200.23", { port: 502 });
//-------
/**
* hardwareservice层为单例
* @class
*/
class HardwareService extends Service {
constructor(ctx) {
super(ctx);
}
/**
* 发送消息
* @param {*} seriaPort 串口实例
*/
sendSeriaPort(args) {
const port = seriaPortIns;
const msg = args.msg;
port.write(msg, 'hex')
console.log('测试发送消息' + msg);
}
/**
* 连接串口 只执行一次
* @param {*} options 串口参数
* @param {*} event 回调.
*/
connectSeriaPort(options, event) {
if (seriaPortIns != undefined) {
console.log("SerialPort is have");
return;
}
const channel = 'controller.hardware.connectSeriaPort';
const port = new SerialPort(options, (e) => {
console.log("SerialPort open");
console.log(e);
if (e === null) {
// 打开成功 把串口发送出去
let data2 = {
type: 'connect'
}
event.reply(`${channel}`, data2)
}
})
port.on('data', (data) => {
let data2 = {
type: 'received',
data: data
}
console.log(`Received data: ${data2}`)
event.reply(`${channel}`, data2)
})
setInterval(() => {
// console.log('setInterval')
if (!port.isOpen) {
// console.log('setInterval open')
port.open();
}
}, 1000)
port.on('close', () => {
let data2 = {
type: 'close'
}
console.log(`SerialPort close: ${data2}`)
event.reply(`${channel}`, data2)
})
port.on('error', (e) => {
let data2 = {
type: 'error'
}
console.log(`SerialPort error: ${e}`)
event.reply(`${channel}`, data2)
})
seriaPortIns = port;
}
/**
* test
*/
async test(args) {
let obj = {
status: 'ok',
params: args
}
return obj;
}
// 样例 ModbusTCP
tempModbusTCP() {
//http://momentjs.cn/ 时间库
//https://www.jianshu.com/p/50954625b158
// 读取非甲烷总烃的关于总烃、甲烷、NMHC这3个寄存器寄存器地址分别为22,25,28中的浓度
// 每隔5秒钟读取保持寄存器的值从寄存器地址22开始读取读10个寄存器到data数组中
setInterval(function () {
// 要连接后才能用
client.readHoldingRegisters(22, 10, function (err, data) {
// 获取当前时间
//moment.locale('zh-cn');
// console.log("----------------------------------------------------------------------");
// console.log("数据时间是:" + moment().format('YYYY年MM月DD日 HH时mm分ss秒'));
// console.log("总烃的浓度是:" + data.data[0] * 0.01 + "ppmV"); // 总烃浓度对应的寄存器地址为22
// console.log("CH4的浓度是:" + data.data[3] * 0.01 + "ppmV"); // CH4浓度对应的寄存器地址为22
// console.log("NHMC的浓度是:" + data.data[6] * 0.01 + "ppmV"); // NHMC浓度对应的寄存器地址为22
// console.log("----------------------------------------------------------------------");
//console.log(data.data);
});
}, 5000);
}
}
HardwareService.toString = () => '[class HardwareService]';
module.exports = HardwareService;