Emperor_Shun_Reading/electron/controller/framework.js

547 lines
12 KiB
JavaScript
Raw Normal View History

2024-08-22 01:03:01 +00:00
'use strict';
const path = require('path');
const fs = require('fs');
const { exec } = require('child_process');
const { Controller } = require('ee-core');
const { app: electronApp, shell } = require('electron');
const dayjs = require('dayjs');
const Ps = require('ee-core/ps');
const Log = require('ee-core/log');
const Services = require('ee-core/services');
const Conf = require('ee-core/config');
const Addon = require('ee-core/addon');
const EE = require('ee-core/ee');
const { getNetworkIFaceOne, getMac, getAllMac, getAllPhysicsMac } = require('@lzwme/get-physical-address');
const os = require('os');
// 网络
const net = require('net');
// 串口
const { SerialPort } = require('serialport')
// 保存串口实例
var GlobalSeriaPortIns = undefined;
/**
* electron-egg framework - 功能demo
* @class
*/
class FrameworkController extends Controller {
constructor(ctx) {
super(ctx);
}
/**
* 所有方法接收两个参数
* @param args 前端传的参数
* @param event - ipc通信时才有值详情见控制器文档
*/
/**
* 发送串口消息
* @param {*} seriaPort 串口实例
*/
sendSeriaPort(args) {
const port = GlobalSeriaPortIns;
const msg = args.msg;
port.write(msg, 'hex')
// console.log('测试发送消息'+msg);
}
/**
* 连接串口 只执行一次
* @param {*} options 串口参数
* @param {*} event 回调.
*/
connectSeriaPort(options, event) {
// 保证执行一次
if (GlobalSeriaPortIns != 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)
})
GlobalSeriaPortIns = port;
}
/**
* 发送tcp 消息
* @param {*} args 包含host port msg type { 1 hex, 2 ascii}
* @param {*} event
*/
sendTcpSocket(args, event) {
const channel = 'controller.example.sendTcpSocket';
console.log("tcp params")
console.log(args);
const client = new net.Socket();
// client.setEncoding('ascii');
const HOST = args.host;
const PORT = args.port;
const msg = args.msg;
// const HOST = '192.168.5.134';
// const PORT = 9080;
client.connect(PORT, HOST, function () {
console.log('Connected to: ' + HOST + ':' + PORT);
});
client.on('data', function (data) {
console.log('Received: ' + data);
event.sender.send(`${channel}`, data);
});
//两种码的发送 ok
// client.write('Hello, server!','ascii');
if (args.type == 1) {
client.write(msg, 'hex');
} else {
client.write(msg, 'ascii');
}
client.on('close', function () {
console.log('Connection closed');
});
client.end();
}
/**
* 获取extraResources 目录下的json 配置文件
* @param {*} name 配置文件名
* @returns 返回json 字符传
*/
getExResConfig(name) {
let configPath = path.join(Ps.getExtraResourcesDir(), name);;
console.log(configPath)
// let configJSON = null;
let dataString = null;
try {
// 同步读取配置文件
dataString = fs.readFileSync(configPath, 'utf8');
// 解析 JSON 格式的配置数据
// configJSON = JSON.parse(data);
// console.log('读取到的配置:', configJSON);
// 在这里可以根据需要使用配置数据进行操作
} catch (err) {
console.error('无法读取配置文件:', err);
}
return dataString;
}
/**
* json数据库操作
*/
async jsondbOperation(args) {
const { action, info, delete_name, update_name, update_age, search_age, data_dir } = args;
const data = {
action,
result: null,
all_list: []
};
switch (action) {
case 'add':
data.result = await Services.get('database.jsondb').addTestData(info);
break;
case 'del':
data.result = await Services.get('database.jsondb').delTestData(delete_name);
break;
case 'update':
data.result = await Services.get('database.jsondb').updateTestData(update_name, update_age);
break;
case 'get':
data.result = await Services.get('database.jsondb').getTestData(search_age);
break;
case 'getDataDir':
data.result = await Services.get('database.jsondb').getDataDir();
break;
case 'setDataDir':
data.result = await Services.get('database.jsondb').setCustomDataDir(data_dir);
break;
}
data.all_list = await Services.get('database.jsondb').getAllTestData();
return data;
}
/**
* sqlite数据库操作
*/
async sqlitedbOperation(args) {
const { action, info, delete_name, update_name, update_age, search_age, data_dir } = args;
const data = {
action,
result: null,
all_list: [],
code: 0
};
try {
// test
Services.get('database.sqlitedb').getDataDir();
} catch (err) {
console.log(err);
data.code = -1;
return data;
}
switch (action) {
case 'add':
data.result = await Services.get('database.sqlitedb').addTestDataSqlite(info);;
break;
case 'del':
data.result = await Services.get('database.sqlitedb').delTestDataSqlite(delete_name);;
break;
case 'update':
data.result = await Services.get('database.sqlitedb').updateTestDataSqlite(update_name, update_age);
break;
case 'get':
data.result = await Services.get('database.sqlitedb').getTestDataSqlite(search_age);
break;
case 'getDataDir':
data.result = await Services.get('database.sqlitedb').getDataDir();
break;
case 'setDataDir':
data.result = await Services.get('database.sqlitedb').setCustomDataDir(data_dir);
break;
}
data.all_list = await Services.get('database.sqlitedb').getAllTestDataSqlite();
return data;
}
/**
* 调用其它程序exebash等可执行程序
*/
openSoftware(softName) {
if (!softName) {
return false;
}
let softwarePath = path.join(Ps.getExtraResourcesDir(), softName);
Log.info('[openSoftware] softwarePath:', softwarePath);
// 检查程序是否存在
if (!fs.existsSync(softwarePath)) {
return false;
}
// 命令行字符串 并 执行
let cmdStr = 'start ' + softwarePath;
exec(cmdStr);
return true;
}
/**
* 检查是否有新版本
*/
checkForUpdater() {
Addon.get('autoUpdater').checkUpdate();
return;
}
/**
* 下载新版本
*/
downloadApp() {
Addon.get('autoUpdater').download();
return;
}
/**
* 检测http服务是否开启
*/
async checkHttpServer() {
const httpServerConfig = Conf.getValue('httpServer');
const url = httpServerConfig.protocol + httpServerConfig.host + ':' + httpServerConfig.port;
const data = {
enable: httpServerConfig.enable,
server: url
}
return data;
}
/**
* 一个http请求访问此方法
*/
async doHttpRequest() {
const { CoreApp } = EE;
// http方法
const method = CoreApp.request.method;
// http get 参数
let params = CoreApp.request.query;
params = (params instanceof Object) ? params : JSON.parse(JSON.stringify(params));
// http post 参数
const body = CoreApp.request.body;
const httpInfo = {
method,
params,
body
}
Log.info('httpInfo:', httpInfo);
if (!body.id) {
return false;
}
const dir = electronApp.getPath(body.id);
shell.openPath(dir);
return true;
}
/**
* 一个socket io请求访问此方法
*/
async doSocketRequest(args) {
if (!args.id) {
return false;
}
const dir = electronApp.getPath(args.id);
shell.openPath(dir);
return true;
}
/**
* 异步消息类型
*/
async ipcInvokeMsg(args, event) {
let timeNow = dayjs().format('YYYY-MM-DD HH:mm:ss');
const data = args + ' - ' + timeNow;
return data;
}
/**
* 同步消息类型
*/
async ipcSendSyncMsg(args) {
let timeNow = dayjs().format('YYYY-MM-DD HH:mm:ss');
const data = args + ' - ' + timeNow;
return data;
}
/**
* 双向异步通信
*/
async ipcSendMsg(args, event) {
const { type, content } = args;
const data = await Services.get('framework').bothWayMessage(type, content, event);
return data;
}
/**
* 不建议使用请使用electron的api来获取文件的本机路径然后读取并上传
* 使用http的files属性实际上多余拷贝一次文件
*/
async uploadFile() {
const { CoreApp } = EE;
let tmpDir = Ps.getLogDir();
const files = CoreApp.request.files;
let file = files.file;
let tmpFilePath = path.join(tmpDir, file.originalFilename);
try {
let tmpFile = fs.readFileSync(file.filepath);
fs.writeFileSync(tmpFilePath, tmpFile);
} finally {
await fs.unlink(file.filepath, function () { });
}
const fileStream = fs.createReadStream(tmpFilePath);
const uploadRes = await Services.get('framework').uploadFileToSMMS(fileStream);
return uploadRes;
}
/**
* 启动java项目
*/
async startJavaServer() {
let data = {
code: 0,
msg: '',
server: ''
}
const javaCfg = Conf.getValue('addons.javaServer') || {};
if (!javaCfg.enable) {
data.code = -1;
data.msg = 'addon not enabled!';
return data;
}
await Addon.get('javaServer').createServer();
data.server = 'http://localhost:' + javaCfg.port;
return data;
}
/**
* 关闭java项目
*/
async closeJavaServer() {
let data = {
code: 0,
msg: '',
}
const javaCfg = Conf.getValue('addons.javaServer') || {};
if (!javaCfg.enable) {
data.code = -1;
data.msg = 'addon not enabled!';
return data;
}
await Addon.get('javaServer').kill();
return data;
}
/**
* java运行状态
*/
async runStatus() {
let data = {
code: 0,
msg: '',
flag: false
}
const flag = await Addon.get('javaServer').check();
//Log.info("[FrameworkController:runStatus] flag-----------"+flag);
data.flag = flag;
return data;
}
/**
* 任务
*/
someJob(args, event) {
let jobId = args.id;
let action = args.action;
let result;
switch (action) {
case 'create':
result = Services.get('framework').doJob(jobId, action, event);
break;
case 'close':
Services.get('framework').doJob(jobId, action, event);
break;
default:
}
let data = {
jobId,
action,
result
}
return data;
}
/**
* 创建任务池
*/
async createPool(args, event) {
let num = args.number;
Services.get('framework').doCreatePool(num, event);
// test monitor
Services.get('framework').monitorJob();
return;
}
/**
* 通过进程池执行任务
*/
someJobByPool(args, event) {
let jobId = args.id;
let action = args.action;
let result;
switch (action) {
case 'run':
result = Services.get('framework').doJobByPool(jobId, action, event);
break;
default:
}
let data = {
jobId,
action,
result
}
return data;
}
/**
* 测试接口
*/
hello(args) {
Log.info('hello ', args);
}
}
FrameworkController.toString = () => '[class FrameworkController]';
module.exports = FrameworkController;