138 lines
3.6 KiB
JavaScript
138 lines
3.6 KiB
JavaScript
'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 });
|
||
//-------
|
||
|
||
/**
|
||
* hardware(service层为单例)
|
||
* @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;
|