XNSim/XNSimHtml/utils/xnCoreService.js

595 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const ffi = require('ffi-napi');
const ref = require('ref-napi');
const path = require('path');
const os = require('os');
// 获取XNCore环境变量
const xnCorePath = process.env.XNCore || '';
// 根据操作系统类型确定动态库扩展名和路径
const isWindows = os.platform() === 'win32';
const libExtension = isWindows ? '.dll' : '.so';
const libPrefix = isWindows ? '' : 'lib';
// Login库配置
const loginLibName = `${libPrefix}Login${libExtension}`;
const loginLibPath = path.join(xnCorePath, 'lib', loginLibName);
// MonitorServer库配置
const monitorLibName = `${libPrefix}XNMonitorServer${libExtension}`;
const monitorLibPath = path.join(xnCorePath, 'lib', monitorLibName);
// 定义Buffer类型
const BufferType = ref.refType(ref.types.void);
const StringType = ref.types.CString;
const IntType = ref.types.int;
// 定义动态库函数接口
let loginLib;
let monitorLib;
try {
loginLib = ffi.Library(loginLibPath, {
'validateUser': ['int', [StringType, 'int', StringType, 'int']],
'getUserInfo': ['int', ['int', StringType, 'int']],
'cleanup': ['void', []],
'registerUser': ['int', [StringType, 'int', StringType, 'int', StringType, 'int']]
});
} catch (error) {
console.error(`加载 ${loginLibName} 失败:`, error);
}
try {
monitorLib = ffi.Library(monitorLibPath, {
'XN_Initialize': ['int', [StringType, 'int', StringType, 'int']],
'XN_Cleanup': ['void', []],
'XN_StartMonitorSystemInfo': ['int', [StringType, 'int']],
'XN_GetSystemInfo': ['int', [StringType, 'int']],
'XN_GetAllThreadInfo': ['int', [StringType, 'int']],
'XN_StopMonitorSystemInfo': ['void', []],
'XN_StartMonitorModelInfo': ['int', [StringType, 'int']],
'XN_GetModelInfo': ['int', [StringType, 'int']],
'XN_StopMonitorModelInfo': ['void', []],
'XN_InitializeEngineControl': ['int', [StringType, 'int']],
'XN_PauseEngine': ['void', [StringType, 'int']],
'XN_ResumeEngine': ['void', [StringType, 'int']],
'XN_StopEngine': ['void', [StringType, 'int']],
'XN_StartDataMonitor': ['int', [StringType, 'int', StringType, 'int']],
'XN_StopDataMonitor': ['void', [StringType, 'int', StringType, 'int']],
'XN_GetDataMonitorInfo': ['int', [StringType, 'int', StringType, 'int', StringType, 'int', StringType, 'int']],
'XN_InjectDataInterface': ['int', [StringType, 'int', StringType, 'int', StringType, 'int']],
'XN_StartInjectContinuous': ['int', [StringType, 'int', StringType, 'int', 'double', StringType, 'int']],
'XN_StopInjectContinuous': ['int', [StringType, 'int', StringType, 'int']],
'XN_InjectDataInterfaceFromCsv': ['int', [StringType, 'int', StringType, 'int', StringType, 'int']],
'XN_StopCsvDataInject': ['int', [StringType, 'int']],
'XN_GetCsvDataInjectStatus': ['int', [StringType, 'int']],
'XN_StartCollectData': ['int', [StringType, 'int', StringType, 'int', StringType, 'int']],
'XN_GetCollectDataStatus': ['int', [StringType, 'int']],
'XN_StopCollectData': ['int', [StringType, 'int']]
});
} catch (error) {
console.error(`加载 ${monitorLibName} 失败:`, error);
}
// 注册进程退出时的清理函数
function performCleanup() {
console.log('正在执行清理操作...');
try {
// 清理 loginLib
if (loginLib) {
loginLib.cleanup();
}
// 清理 monitorLib
if (monitorLib) {
// 停止所有监控
stopMonitorSystemInfo();
stopMonitorModelInfo();
// 停止所有数据监控和注入
stopDataMonitor('');
stopInjectContinuous('');
// 清理监控服务器资源
monitorLib.XN_Cleanup();
}
console.log('清理操作完成');
} catch (error) {
console.error('清理操作失败:', error);
}
}
// 转换字符串为Buffer的函数
function stringToBuffer(str) {
try {
if (!str) {
return { buffer: Buffer.alloc(0), length: 0 };
}
const buffer = Buffer.from(str, 'utf8');
return { buffer: buffer, length: buffer.length };
} catch (error) {
console.error('字符串转Buffer失败:', error);
return { buffer: Buffer.alloc(0), length: 0 };
}
}
// 初始化监控服务器
function initializeMonitor(domainId) {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
// 创建错误消息缓冲区
const errorMsg = Buffer.alloc(1024);
const result = monitorLib.XN_Initialize(domainId, domainId.length, errorMsg, errorMsg.length);
if (result !== 0) {
return `初始化失败: ${errorMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '初始化成功';
} catch (error) {
return `初始化失败: ${error.message}`;
}
}
// 清理监控服务器资源
async function cleanupMonitor() {
if (!monitorLib) {
return;
}
try {
monitorLib.XN_Cleanup();
} catch (error) {
console.error('清理监控服务器资源失败:', error);
throw error;
}
}
// 启动监控系统信息
function startMonitorSystemInfo() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
const result = monitorLib.XN_StartMonitorSystemInfo(errorMsg, errorMsg.length);
if (result !== 0) {
return `启动失败: ${errorMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '启动成功';
} catch (error) {
return `启动失败: ${error.message}`;
}
}
// 获取系统信息
function getSystemInfo() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const infoMsg = Buffer.alloc(8192);
const result = monitorLib.XN_GetSystemInfo(infoMsg, infoMsg.length);
if (result !== 0) {
return `获取失败: ${infoMsg.toString('utf8').replace(/\0/g, '')}`;
}
return infoMsg.toString('utf8').replace(/\0/g, '');
} catch (error) {
return `获取失败: ${error.message}`;
}
}
// 获取所有线程信息
function getAllThreadInfo() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const infoMsg = Buffer.alloc(8192);
const result = monitorLib.XN_GetAllThreadInfo(infoMsg, infoMsg.length);
if (result !== 0) {
return `获取失败: ${infoMsg.toString('utf8').replace(/\0/g, '')}`;
}
return infoMsg.toString('utf8').replace(/\0/g, '');
} catch (error) {
return `获取失败: ${error.message}`;
}
}
// 停止监控系统信息
function stopMonitorSystemInfo() {
if (!monitorLib) {
return;
}
try {
monitorLib.XN_StopMonitorSystemInfo();
} catch (error) {
return;
}
}
// 启动监控模型信息
function startMonitorModelInfo() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
const result = monitorLib.XN_StartMonitorModelInfo(errorMsg, errorMsg.length);
if (result !== 0) {
return `启动失败: ${errorMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '启动成功';
} catch (error) {
return `启动失败: ${error.message}`;
}
}
// 获取模型信息
function getModelInfo() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const infoMsg = Buffer.alloc(16384);
const result = monitorLib.XN_GetModelInfo(infoMsg, infoMsg.length);
if (result !== 0) {
return `获取失败: ${infoMsg.toString('utf8').replace(/\0/g, '')}`;
}
return infoMsg.toString('utf8').replace(/\0/g, '');
} catch (error) {
return `获取失败: ${error.message}`;
}
}
// 停止监控模型信息
function stopMonitorModelInfo() {
if (!monitorLib) {
return;
}
try {
monitorLib.XN_StopMonitorModelInfo();
} catch (error) {
return;
}
}
// 初始化引擎控制
function initializeEngineControl() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
const result = monitorLib.XN_InitializeEngineControl(errorMsg, errorMsg.length);
if (result !== 0) {
return `初始化引擎控制失败: ${errorMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '初始化引擎控制成功';
} catch (error) {
return `初始化引擎控制失败: ${error.message}`;
}
}
// 暂停引擎
function pauseEngine() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
monitorLib.XN_PauseEngine(errorMsg, errorMsg.length);
const error = errorMsg.toString('utf8').replace(/\0/g, '');
return error ? `暂停引擎失败: ${error}` : '暂停引擎成功';
} catch (error) {
return `暂停引擎失败: ${error.message}`;
}
}
// 恢复引擎
function resumeEngine() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
monitorLib.XN_ResumeEngine(errorMsg, errorMsg.length);
const error = errorMsg.toString('utf8').replace(/\0/g, '');
return error ? `恢复引擎失败: ${error}` : '恢复引擎成功';
} catch (error) {
return `恢复引擎失败: ${error.message}`;
}
}
// 停止引擎
async function stopEngine() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
monitorLib.XN_StopEngine(errorMsg, errorMsg.length);
const error = errorMsg.toString('utf8').replace(/\0/g, '');
return error ? `停止引擎失败: ${error}` : '停止引擎成功';
} catch (error) {
return `停止引擎失败: ${error.message}`;
}
}
// 启动数据监控
function startDataMonitor(structName) {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
const result = monitorLib.XN_StartDataMonitor(structName, structName.length, errorMsg, errorMsg.length);
if (result !== 0) {
return `启动数据监控失败: ${errorMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '启动数据监控成功';
} catch (error) {
return `启动数据监控失败: ${error.message}`;
}
}
// 停止数据监控
function stopDataMonitor(structName) {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
monitorLib.XN_StopDataMonitor(structName, structName.length, errorMsg, errorMsg.length);
const error = errorMsg.toString('utf8').replace(/\0/g, '');
return error ? `停止数据监控失败: ${error}` : '停止数据监控成功';
} catch (error) {
return `停止数据监控失败: ${error.message}`;
}
}
// 获取数据监控信息
function getDataMonitorInfo(structName, interfaceName, bufferSize = 8192) {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const infoMsg = Buffer.alloc(1024);
const dataBuffer = Buffer.alloc(bufferSize); // 使用指定的缓冲区大小
const result = monitorLib.XN_GetDataMonitorInfo(
structName, structName.length,
interfaceName, interfaceName.length,
dataBuffer, dataBuffer.length,
infoMsg, infoMsg.length
);
if (result !== 0) {
return `获取数据监控信息失败: ${infoMsg.toString('utf8').replace(/\0/g, '')}`;
}
return {
data: dataBuffer.toString('utf8').replace(/\0/g, ''),
info: infoMsg.toString('utf8').replace(/\0/g, '')
};
} catch (error) {
return `获取数据监控信息失败: ${error.message}`;
}
}
// 注入数据接口
function injectDataInterface(structName, interfaceNameAndData) {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const infoMsg = Buffer.alloc(1024);
const result = monitorLib.XN_InjectDataInterface(
structName, structName.length,
interfaceNameAndData, interfaceNameAndData.length,
infoMsg, infoMsg.length
);
if (result !== 0) {
return `注入数据接口失败: ${infoMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '注入数据接口成功';
} catch (error) {
return `注入数据接口失败: ${error.message}`;
}
}
// 持续注入数据接口
function startInjectContinuous(structName, interfaceNameAndData, frequency) {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const infoMsg = Buffer.alloc(1024);
const result = monitorLib.XN_StartInjectContinuous(
structName, structName.length,
interfaceNameAndData, interfaceNameAndData.length,
frequency,
infoMsg, infoMsg.length
);
if (result !== 0) {
return `启动持续注入数据失败: ${infoMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '启动持续注入数据成功';
} catch (error) {
return `启动持续注入数据失败: ${error.message}`;
}
}
// 停止持续注入数据接口
function stopInjectContinuous(structName) {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const infoMsg = Buffer.alloc(1024);
const result = monitorLib.XN_StopInjectContinuous(
structName, structName.length,
infoMsg, infoMsg.length
);
if (result !== 0) {
return `停止持续注入数据失败: ${infoMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '停止持续注入数据成功';
} catch (error) {
return `停止持续注入数据失败: ${error.message}`;
}
}
// 从CSV文件注入数据
function injectDataInterfaceFromCsv(structName, csvFilePath) {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
const result = monitorLib.XN_InjectDataInterfaceFromCsv(
structName,
structName.length,
csvFilePath,
csvFilePath.length,
errorMsg,
errorMsg.length
);
if (result !== 0) {
return `注入失败: ${errorMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '注入成功';
} catch (error) {
return `注入失败: ${error.message}`;
}
}
// 停止CSV数据注入
function stopCsvDataInject() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
const result = monitorLib.XN_StopCsvDataInject(errorMsg, errorMsg.length);
if (result !== 0) {
return `停止失败: ${errorMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '停止成功';
} catch (error) {
return `停止失败: ${error.message}`;
}
}
// 获取CSV数据注入状态
function getCsvDataInjectStatus() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const infoMsg = Buffer.alloc(1024);
const result = monitorLib.XN_GetCsvDataInjectStatus(infoMsg, infoMsg.length);
if (result === -1) {
return `获取状态失败: ${infoMsg.toString('utf8').replace(/\0/g, '')}`;
}
return result; // 直接返回result值
} catch (error) {
return `获取状态失败: ${error.message}`;
}
}
// 启动数据采集
function startCollectData(collectDataInfo, dcsFilePath) {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
const result = monitorLib.XN_StartCollectData(
collectDataInfo, collectDataInfo.length,
dcsFilePath, dcsFilePath.length,
errorMsg, errorMsg.length
);
if (result !== 0) {
return `启动数据采集失败: ${errorMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '启动数据采集成功';
} catch (error) {
return `启动数据采集失败: ${error.message}`;
}
}
// 获取数据采集状态
function getCollectDataStatus() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const infoMsg = Buffer.alloc(1024);
const result = monitorLib.XN_GetCollectDataStatus(infoMsg, infoMsg.length);
if (result === -1) {
return `获取状态失败: ${infoMsg.toString('utf8').replace(/\0/g, '')}`;
}
return result; // 返回状态0-成功1-正在采集
} catch (error) {
return `获取状态失败: ${error.message}`;
}
}
// 停止数据采集
function stopCollectData() {
if (!monitorLib) {
return '监控服务器库未加载';
}
try {
const errorMsg = Buffer.alloc(1024);
const result = monitorLib.XN_StopCollectData(errorMsg, errorMsg.length);
if (result !== 0) {
return `停止数据采集失败: ${errorMsg.toString('utf8').replace(/\0/g, '')}`;
}
return '停止数据采集成功';
} catch (error) {
return `停止数据采集失败: ${error.message}`;
}
}
module.exports = {
loginLib,
monitorLib,
performCleanup,
stringToBuffer,
initializeMonitor,
cleanupMonitor,
startMonitorSystemInfo,
getSystemInfo,
getAllThreadInfo,
stopMonitorSystemInfo,
startMonitorModelInfo,
getModelInfo,
stopMonitorModelInfo,
initializeEngineControl,
pauseEngine,
resumeEngine,
stopEngine,
startDataMonitor,
stopDataMonitor,
getDataMonitorInfo,
injectDataInterface,
startInjectContinuous,
stopInjectContinuous,
injectDataInterfaceFromCsv,
stopCsvDataInject,
getCsvDataInjectStatus,
startCollectData,
getCollectDataStatus,
stopCollectData
};