Commit dc12608e authored by wubi's avatar wubi

更新前端

parent 84a741c2
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
\ No newline at end of file
This diff is collapsed.
const { app, BrowserWindow,Menu, ipcMain, dialog, protocol, session, globalShortcut} = require('electron')
let currentAction
let currentCallbak
let currentWin
let currentToken
let uiwindow
const path = require('path')
const { Writable } = require('stream');
const fs = require('fs').promises;
const record = require('node-record-lpcm16');
const { spawn, exec,execFile} = require('child_process');
const sudoPrompt = require('sudo-prompt');
const os = require('os');
const Store = require('electron-store');
const { setEngine } = require('crypto');
const { stdout, stderr } = require('process');
const configStore = new Store();
const psTree = require('ps-tree');
Menu.setApplicationMenu(null);
// 确保单实例运行
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
app.quit();
} else {
app.on('second-instance', (event, commandLine, workingDirectory) => {
if (uiwindow) {
if (uiwindow.isMinimized()) uiwindow.restore();
uiwindow.focus();
}
});
}
//主界面
const createWindow = () => {
const win = new BrowserWindow({
width: 1400,
height: 900,
title: '物联网测试验证平台',
autoHideMenuBar: true,
// icon: path.join(__dirname, 'white.png'),
webPreferences: {
webSecurity:false,
webviewTag: true,
nodeIntegrationInSubFrames:true,
nodeIntegration:true,//允许页面中访问nodejs
enableRemoteModule: true,
contextIsolation: true, //禁用上下文隔离
preload: path.join(__dirname, 'preload.js'),
session: {
cache: false
}
}
})
uiwindow = win
uiwindow.on('close', () => {
uiwindow.destroy();
});
//win.webContents.on('did-fail-load', () => {
// console.log("load error")
// 在页面加载失败时弹出配置页面
//showConfigPage();
//});
//open debug
win.webContents.openDevTools()
var url = "http://192.168.0.73:8085"//loadSavedURLConfig()
//if(token1!= "." && token1!= "" && typeof(token1)!="undefined"){
// url = url+"?"+"token="+token1
//}
console.log('url:',url)
win.webContents.session.clearCache(() => {
//win.loadURL(url);
});
// win.loadURL(url)
win.loadFile(path.join(__dirname, 'web/index.html'));
}
const userDataPath=app.getPath('userData')
// 配置文件路径(用户目录,无权限问题)
const configPath = path.join(userDataPath, 'serverConfig.json');
// 初始化配置文件
async function initConfigFile() {
try {
await fs.access(configPath);
} catch {
await fs.writeFile(configPath, JSON.stringify({ serverUrl: '' }, null, 2));
}
}
// 读取服务地址
async function getServerUrl() {
await initConfigFile()
const content = await fs.readFile(configPath, 'utf8');
return JSON.parse(content).serverUrl || '';
}
// 写入服务地址
async function setServerUrl(url) {
await initConfigFile()
const content = await fs.readFile(configPath, 'utf8');
const config = JSON.parse(content);
config.serverUrl = url;
await fs.writeFile(configPath, JSON.stringify(config, null, 2));
}
//IPC设置标题
function handleSetTitle (event, title) {
const webContents = event.sender
const win = BrowserWindow.fromWebContents(webContents)
win.setTitle(title)
win.webContents.executeJavaScript('result("调用成功")')
}
//统一事件处理 doAction
function handleAction(event, action, callback) {
const webContents = event.sender
const win = BrowserWindow.fromWebContents(webContents)
currentWin = win
console.log(action)
const json = JSON.parse(action)
console.log('TAG:handleAction ','action=',json.action,';callback=',callback,';tagType:',json.tagType)
tagType = json.tagType
currentAction = json.action
currentCallbak = callback
switch(json.action){
case 'OPEN_OCR':
//createTakePhotoOCR()
break;
}
}
function setToken(event, token){
console.log("setToken:",token);
currentToken = token;
}
function getToken(){
console.log("getToken:",currentToken);
return currentToken;
}
const runServe=()=>{
//启动node-red
//指定运行目录的绝对路径(示例为Electron应用内的子目录)
const targetDir = path.join(__dirname, 'nr');
const nodeRedProcess = spawn('node', ['main.js', '-c=config.js'], {
cwd: targetDir, // 关键参数
stdio: 'inherit' // 可选:继承父进程的输入输出
});
// startNodeRed()
//启动mqtt服务
const mqttTargetDir = path.join(__dirname, 'mqtt');
const mqttNodeRedProcess = spawn('node', ['mqtt.js'], {
cwd: mqttTargetDir, // 关键参数
stdio: 'inherit' // 可选:继承父进程的输入输出
});
}
app.whenReady().then(async () => {
// 定义自定义路径(示例:应用根目录下的 'user_data' 文件夹)
const customUserDataPath = path.join(app.getAppPath(), 'user_data');
await initConfigFile();
// 响应渲染进程的"获取服务地址"请求
ipcMain.handle('get-server-url', getServerUrl);
// 响应渲染进程的"设置服务地址"请求
ipcMain.handle('set-server-url', (_, url) => setServerUrl(url));
// 设置用户数据目录
app.setPath('userData', customUserDataPath);
//注册设置标题函数
ipcMain.on('set-title', handleSetTitle)
//注册action
ipcMain.on('doAction', handleAction)
//token
ipcMain.handle('set-token',setToken);
ipcMain.handle('get-token',getToken);
//注册atom自定义协议,用于h5页面访问本地文件
protocol.registerFileProtocol('atom', (request, callback) => {
const url = request.url.substr(7)
const dURL = decodeURI(path.normalize(url))
console.log("dURL:",dURL)
callback(dURL)
})
global.sharedObject = {
argv: process.argv
}
console.log("sharedObject:",global.sharedObject.argv[0],";",global.sharedObject.argv[1],";",global.sharedObject.argv[2])
token1 = global.sharedObject.argv[1]
token2 = global.sharedObject.argv[2]
console.log("token1:",token1,",token2:",token2,";")
createWindow()
runServe()
})
/**
* 清除占用指定端口的进程
* @param {number} port - 端口号(如 10883)
* @returns {Promise<void>}
*/
function clearPortProcess(port) {
return new Promise((resolve, reject) => {
// 根据系统选择命令(Linux/macOS 使用 lsof,Windows 使用 netstat)
let command;
if (process.platform === 'win32') {
// Windows:查找端口对应的PID并终止
command = `netstat -ano | findstr :${port} | findstr LISTENING | for /f "tokens=5" %a in ('more') do taskkill /F /PID %a`;
} else {
// Linux/macOS:查找端口对应的PID并终止
command = `lsof -t -i :${port} | xargs -r kill -9`;
}
exec(command, (error, stdout, stderr) => {
if (error) {
// 忽略"未找到进程"的错误(非致命)
if (stderr.includes('找不到') || stdout.trim() === '') {
console.log(`端口 ${port} 未被占用,无需清理`);
return resolve();
}
return reject(new Error(`清理端口失败: ${stderr}`));
}
console.log(`已成功终止占用端口 ${port} 的进程`);
resolve();
});
});
}
app.on('before-quit', async (event) => {
event.preventDefault(); // 阻止默认退出,等待清理完成
try {
console.log('开始清理 10883 端口...');
await clearPortProcess(10883); // 执行清理逻辑
console.log('清理完成,退出应用');
app.exit(0); // 强制退出(0 表示正常退出)
} catch (err) {
console.error('清理失败,强制退出:', err);
app.exit(1); // 异常退出(非0状态码)
}
});
This diff is collapsed.
Bag Attributes
friendlyName: anyname
localKeyID: 54 69 6D 65 20 31 37 35 33 32 35 39 35 33 38 30 31 32
subject=C = cn, ST = beijing, L = beijing, O = zywl, OU = zywl, CN = sunny
issuer=C = cn, ST = beijing, L = beijing, O = zywl, OU = zywl, CN = sunny
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIEbGP1FDANBgkqhkiG9w0BAQsFADBfMQswCQYDVQQGEwJj
bjEQMA4GA1UECBMHYmVpamluZzEQMA4GA1UEBxMHYmVpamluZzENMAsGA1UEChME
enl3bDENMAsGA1UECxMEenl3bDEOMAwGA1UEAxMFc3VubnkwHhcNMjUwNzIzMDgz
MjE3WhcNMzUwNzIxMDgzMjE3WjBfMQswCQYDVQQGEwJjbjEQMA4GA1UECBMHYmVp
amluZzEQMA4GA1UEBxMHYmVpamluZzENMAsGA1UEChMEenl3bDENMAsGA1UECxME
enl3bDEOMAwGA1UEAxMFc3VubnkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCKM1kYyIHUC/HiT0yvhXxRdhJwlbmPJgGArvMmFZDnDYeQ3ptNAeMtZl6E
cpRzLAexjziz8wxA9AbYJ7JG085pzXVuH4BuytfU8C54BsMMgaaT9MICTt1EbHdB
BnD32PRUODBPJmIQ8FWterFO7gm/8ZWPamc7jAaNp+F6xk7Go/PlJfGaoA7LEUqI
Y9TuDx4EVQw/AuKuu7+fGqi3KIJSP4T+4o8WdhjYEMUS1o9OSIbZvF2i8LQvYJ6/
6DK8zmVAaaEfnos7XxV2kjBMHfLYPoDZfAgHS26I4owR4HQTBX+WnAjDwsY2jJ6o
kRadJJi31GxtSwME4vw5j5mcXE4LAgMBAAGjITAfMB0GA1UdDgQWBBTBCkBL+sYq
YSjQK4UG4qzUPckFLTANBgkqhkiG9w0BAQsFAAOCAQEAQGPGRwDZh9rzKJ+xK16w
OB1QEesE6iOtfBnRZ8RCtO2i3sSOjNP/oKAn1KFyKNTstLX5lZkrDmvTiuOQGl6R
b6kwLyEW/GJCZllmpEwPvSLCAC6hm/FSnhnwgwK5wvdhl+3ndmcpTvWv1N1x+gAT
whK/ZldqzpcuyYuSK6m19QQKUCjjHCI3Bga7p7owDzNQ5fgR4l0yxScPV5qhLED/
wNeo1Ku+6rxcW/VRq4jyX4einPCHMH+TulG9QzxDONCcNvx/AdWiu+bYCDdQik/j
BR61ApB1X2pibvmcBycPuONalei7Tk3E2eOGAYf7iawnfOgobByG0fzm34PiEsPL
3g==
-----END CERTIFICATE-----
......@@ -429,7 +429,7 @@
},
"node-red-contrib-oscar-yolo": {
"name": "node-red-contrib-oscar-yolo",
"version": "1.0.1",
"version": "1.0.3",
"local": false,
"user": false,
"nodes": {
......@@ -1300,5 +1300,77 @@
"file": "/home/wubi/work/iot_test/nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/node_modules/node-red-contrib-coap/coap/coap-request.js"
}
}
},
"node-red-contrib-zigbee2mqtt": {
"name": "node-red-contrib-zigbee2mqtt",
"version": "2.7.5",
"local": true,
"user": true,
"nodes": {
"in": {
"name": "in",
"types": [
"zigbee2mqtt-in"
],
"enabled": true,
"local": true,
"user": false,
"module": "node-red-contrib-zigbee2mqtt",
"file": "/home/wubi/work/iot_test/nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/node_modules/node-red-contrib-zigbee2mqtt/nodes/in.js"
},
"get": {
"name": "get",
"types": [
"zigbee2mqtt-get"
],
"enabled": true,
"local": true,
"user": false,
"module": "node-red-contrib-zigbee2mqtt",
"file": "/home/wubi/work/iot_test/nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/node_modules/node-red-contrib-zigbee2mqtt/nodes/get.js"
},
"out": {
"name": "out",
"types": [
"zigbee2mqtt-out"
],
"enabled": true,
"local": true,
"user": false,
"module": "node-red-contrib-zigbee2mqtt",
"file": "/home/wubi/work/iot_test/nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/node_modules/node-red-contrib-zigbee2mqtt/nodes/out.js"
},
"bridge": {
"name": "bridge",
"types": [
"zigbee2mqtt-bridge"
],
"enabled": true,
"local": true,
"user": false,
"module": "node-red-contrib-zigbee2mqtt",
"file": "/home/wubi/work/iot_test/nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/node_modules/node-red-contrib-zigbee2mqtt/nodes/bridge.js"
},
"server": {
"name": "server",
"types": [
"zigbee2mqtt-server"
],
"enabled": true,
"local": true,
"user": false,
"module": "node-red-contrib-zigbee2mqtt",
"file": "/home/wubi/work/iot_test/nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/node_modules/node-red-contrib-zigbee2mqtt/nodes/server.js"
},
"api": {
"name": "api",
"types": [],
"enabled": true,
"local": true,
"user": false,
"module": "node-red-contrib-zigbee2mqtt",
"file": "/home/wubi/work/iot_test/nr/database/entity/5a7e757d-14e6-4e52-98fb-029d30fe6e35/node_modules/node-red-contrib-zigbee2mqtt/api.js"
}
}
}
}
\ No newline at end of file
......@@ -17,8 +17,8 @@
},
"dialog": {
"export": {
"pretty": true,
"json-view": true
"pretty": false,
"json-view": false
}
}
},
......@@ -27,13 +27,13 @@
"menu-deploymenu-item-full": true,
"menu-deploymenu-item-node": false,
"debug": {
"filter": "filterAll",
"filter": "filterSelected",
"filteredNodes": [
"c24cc8c42d8363c8",
"ebf4104ff1d325fd",
"b1cc61ff14b43511",
"63bac2c98fb58711",
"91e4e21768b60e69"
"91e4e21768b60e69",
"df4aa3974a4b28c2",
"ebf4104ff1d325fd"
]
}
}
......
......@@ -18,22 +18,22 @@
"dialog": {
"export": {
"pretty": true,
"json-view": true
"json-view": false
}
}
},
"menu-menu-item-sidebar": false,
"menu-menu-item-sidebar": true,
"menu-deploymenu-item-flow": false,
"menu-deploymenu-item-full": true,
"menu-deploymenu-item-node": false,
"debug": {
"filter": "filterAll",
"filter": "filterSelected",
"filteredNodes": [
"c24cc8c42d8363c8",
"ebf4104ff1d325fd",
"b1cc61ff14b43511",
"63bac2c98fb58711",
"91e4e21768b60e69"
"91e4e21768b60e69",
"df4aa3974a4b28c2",
"ebf4104ff1d325fd"
]
}
}
......
{
"$": "12ee322ac6282cf7980513eba07951e8Rc40ePOG+3odVSGAjKHviiNBfSXB3EIkDIqLm71E3oOfHkwVoSNI2I+eq2vgaXx+PNHKJT6ooQg="
"$": "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"
}
\ No newline at end of file
{
"$": "efce33599da4441dbcdde6320ec1e1eftUA="
"$": "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"
}
\ No newline at end of file
......@@ -7,6 +7,7 @@
"node-red-contrib-coap": "~0.8.0",
"node-red-contrib-loop": "~1.0.1",
"node-red-contrib-loop-processing": "~0.5.1",
"node-red-contrib-zigbee2mqtt": "~2.7.5",
"node-red-node-serialport": "~2.0.3"
}
}
......@@ -62,6 +62,7 @@
"mime": "3.0.0",
"moment": "2.30.1",
"moment-timezone": "0.5.45",
"monaco-editor": "^0.52.2",
"mqtt": "5.7.0",
"multer": "1.4.5-lts.1",
"mustache": "4.2.0",
......
......@@ -105,7 +105,7 @@ jQuery.propHooks.disabled = {
* limitations under the License.
**/
const HOST_IP = "http://192.168.0.82:8082";
const HOST_IP = "https://192.168.0.72:8082";
var RED = (function() {
......@@ -458,7 +458,7 @@ var RED = (function() {
dataType: "text",
data: JSON.stringify({
"wlpTemplateDtoFilter": {
"templateType": 1,
// "templateType": 1,
"type": 1,
"templateNodeId":`${flowId}`
}
......@@ -75582,7 +75582,7 @@ async function saveNode(){
dataType: "json",
data: JSON.stringify({
"wlpTemplateDtoFilter": {
"templateType": 1,
// "templateType": 1,
"type": 1,
"templateNodeId":`${data.id}`
}
......@@ -75731,4 +75731,4 @@ async function saveNode(){
}});
}
\ No newline at end of file
}
......@@ -53,7 +53,8 @@ module.exports = {
* the user's home directory. To use a different location, the following
* property can be used
*/
//userDir: '/home/nol/.node-red/',
// userDir: '/home/nol/.node-red/',
// userDir: path.join(userDataPath, 'nodered-data'),
/** Node-RED scans the `nodes` directory in the userDir to find local node files.
* The following property can be used to specify an additional directory to scan.
......@@ -90,20 +91,22 @@ module.exports = {
*/
/** Option 1: static object */
//https: {
// key: require("fs").readFileSync('privkey.pem'),
// cert: require("fs").readFileSync('cert.pem')
//},
https: {
key: require("fs").readFileSync('../../../../../privkey.pem'),
cert: require("fs").readFileSync('../../../../../cert.pem'),
rejectUnauthorized: false
},
/** Option 2: function that returns the HTTP configuration object */
// https: function() {
// // This function should return the options object, or a Promise
// // that resolves to the options object
// return {
// key: require("fs").readFileSync('privkey.pem'),
// cert: require("fs").readFileSync('cert.pem')
// }
// },
https: function() {
// This function should return the options object, or a Promise
// that resolves to the options object
return {
key: require("fs").readFileSync('../../../../../privkey.pem'),
cert: require("fs").readFileSync('../../../../../cert.pem'),
rejectUnauthorized: false
}
},
/** If the `https` setting is a function, the following setting can be used
* to set how often, in hours, the function will be called. That can be used
......
......@@ -9,13 +9,36 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"js-yaml": "^4.1.0",
"monaco-editor": "^0.52.2",
"node-red-contrib-oscar-yolo": "^1.0.1"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"license": "Python-2.0"
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/monaco-editor": {
"version": "0.52.2",
"resolved": "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.52.2.tgz",
"integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ=="
},
"node_modules/node-red-contrib-oscar-yolo": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/node-red-contrib-oscar-yolo/-/node-red-contrib-oscar-yolo-1.0.1.tgz",
"integrity": "sha512-Ax+bpF1u4XABausKc6De27MAj0MNDO2I0HGzUcCWtROtmlwyKdEnqmJ+365arfSSpm8WrlP9plTInAf3HhWVEw==",
"version": "1.0.3",
"license": "ISC"
}
}
......
......@@ -10,6 +10,8 @@
"author": "",
"license": "ISC",
"dependencies": {
"js-yaml": "^4.1.0",
"monaco-editor": "^0.52.2",
"node-red-contrib-oscar-yolo": "^1.0.1"
}
}
Bag Attributes
friendlyName: anyname
localKeyID: 54 69 6D 65 20 31 37 35 33 32 35 39 35 33 38 30 31 32
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCKM1kYyIHUC/Hi
T0yvhXxRdhJwlbmPJgGArvMmFZDnDYeQ3ptNAeMtZl6EcpRzLAexjziz8wxA9AbY
J7JG085pzXVuH4BuytfU8C54BsMMgaaT9MICTt1EbHdBBnD32PRUODBPJmIQ8FWt
erFO7gm/8ZWPamc7jAaNp+F6xk7Go/PlJfGaoA7LEUqIY9TuDx4EVQw/AuKuu7+f
Gqi3KIJSP4T+4o8WdhjYEMUS1o9OSIbZvF2i8LQvYJ6/6DK8zmVAaaEfnos7XxV2
kjBMHfLYPoDZfAgHS26I4owR4HQTBX+WnAjDwsY2jJ6okRadJJi31GxtSwME4vw5
j5mcXE4LAgMBAAECggEAaaMsVJxXWO20fAefl38ScvYszDA2gaxMc7/HDnJnq6WU
3XC7BxcNPtPEJburq4mZa+kNL8f1suSVIr7dL/SRECDDxWSA+K9GYXciHg8VIscr
vGbXsYn06mt6kJLK4TjOMl4s1yOAzG/ZHdzuEWY0v6p7Zv+vXz3+eGM+IGnbJ0xk
knN2s1QRpd1SjN7JFlWWf/H4+echSrq8sMrZEj8awrdc8RwcidHEPPT2GhLpAJfj
WaTZm2Nuap+mgLjcynZOjwJl8bpvblS1iEu2tYCHsIr0MNc9ui2i/m5oPgYz8fLZ
8ik+SRGHl+4rWeSbmEMLrvLnClHMXGXNhJ9TjNHq6QKBgQDP04U8poDQfbWzgZtE
R5wonQZ81wSgeuh7iYhjHszvLIQYa+WRy3/yhPbhWlnb0HcMtJA3v9VmCnWqrOA+
rugmBeX93MhIMznalL86JZpzQ9U7Bjz7H8EPInwc+bBC0KJwIItuycLohMZGvuFJ
q9IcOw+AR6GTSCMuKZRqVgeatQKBgQCqPDd8NcKBzemSd5YXRmsLKmEsGTzrhG4C
LeN0Ym2MMsSRc+WfMohj/e1JX9a+eyv0giXm5X+CQjhIHHUq98LZD+EYT8eF4Cgc
57cIpLtEFyjqRTAv0NlWAxWuzWGs7sSwG7QnbtOnSwStYyILMRhpyKOC7NN3Ex4P
P0MsJX/9vwKBgEzmXbS1f5CmE2fam1NGlBfLEq16+nFPSVr85wSWTwppFG/c7NNn
024vmRKF1h4qIwMGhR670wCw+h0vXsKTAb+gCxxGZ62flta0l5WyeFYSUYJHqqTZ
eRxajEZEdd4jSRfoUu+ppH9ZMezXkJEsDND5YaD74GOZG7tnE03Ni37JAoGAOzVa
bv8buZ3uoRyqvUmmrWl+BqJ4h8m1oVhohfA9/cciixxuPuKKgYyt3RlSTUn1zcL+
f8JOiPWTMbGEJv+pa2mUdqo40R1XlkYZaQ4ye8o6VtDdo6PWE45bGkMgt88L5dyc
2iI3xzXWWJ/kFVRsE07PYBgSrJWfnNn5+P7J920CgYEAo073DCH0yftiUBY76miW
doMNQDSGRU9le5SRKpu6UQrsyYEPKdUbRxHQn3Rv+4/NGuKK3U/kGY6IU42hIsma
E5GtQ+oKRufwdIMicKrkDuv80Ze0buFrswHPAI+vrFD5hntyr/cHDV3R+U5apUHv
uBzhfwYv6ZivXqh2w0nyPt0=
-----END PRIVATE KEY-----
......@@ -89,20 +89,22 @@ module.exports = {
*/
/** Option 1: static object */
//https: {
// key: require("fs").readFileSync('privkey.pem'),
// cert: require("fs").readFileSync('cert.pem')
//},
https: {
key: require("fs").readFileSync('privkey.pem'),
cert: require("fs").readFileSync('cert.pem'),
rejectUnauthorized: false
},
/** Option 2: function that returns the HTTP configuration object */
// https: function() {
// // This function should return the options object, or a Promise
// // that resolves to the options object
// return {
// key: require("fs").readFileSync('privkey.pem'),
// cert: require("fs").readFileSync('cert.pem')
// }
// },
https: function() {
// This function should return the options object, or a Promise
// that resolves to the options object
return {
key: require("fs").readFileSync('privkey.pem'),
cert: require("fs").readFileSync('cert.pem'),
rejectUnauthorized: false
}
},
/** If the `https` setting is a function, the following setting can be used
* to set how often, in hours, the function will be called. That can be used
......
{"testTaskId":"1929900489378369536","host":"http://192.168.0.82:8082","token":"Bearer eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiJhZG1pbl80X2FiYmQ5MWY1N2EyNTRhYTc4NDBmNDAxNjU2MGIwMjJmIiwiQ3JlYXRlZFRpbWUiOjE3NDkwMDY3MTE0NDgsImV4cCI6MTc0OTYxMTUxMX0.S_Y-M7f1r8o0aGclrmKraflXK0VDz05TqL3llCV6dXU"}
{"testTaskId":"1950732227914502144","host":"https://192.168.0.72:8082","testRecordId":"209501826976890880","token":"Bearer eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiJhZG1pbl80XzkxY2MxMDRmNjUzZTQzN2U5MjU4YTdjZDZhOTFiYzkwIiwiQ3JlYXRlZFRpbWUiOjE3NTQwMTYxNTQ1MDYsImV4cCI6MTc1NDYyMDk1NH0.lBcqlPpzc5Czm4-5u4pcr-LIZyHL868qTotnZnYiiu0"}
This diff is collapsed.
......@@ -40,7 +40,7 @@
"options": {
"icon": "./white.png"
},
"scripts": {
"scripts": {
"postinst": "./script/postinst"
}
}
......@@ -59,7 +59,8 @@
"@electron-forge/plugin-auto-unpack-natives": "^7.8.0",
"@electron-forge/plugin-fuses": "^7.8.0",
"@electron/fuses": "^1.8.0",
"electron": "35.1.4"
"electron": "35.1.4",
"electron-rebuild": "^3.2.9"
},
"dependencies": {
"@gulpjs/to-absolute-glob": "^4.0.0",
......@@ -81,6 +82,7 @@
"ps-tree": "^1.2.0",
"regenerator-runtime": "^0.13.11",
"rpmbuild": "^0.0.23",
"serialport": "^10.5.0",
"sudo-prompt": "^9.2.1"
}
}
......@@ -36,4 +36,18 @@ contextBridge.exposeInMainWorld('iotAPI', {
// contextBridge.exposeInMainWorld('electronAPI', {
// //暴露setTitle接口给UI
// setTitle: (title) => ipcRenderer.send('set-title', title)
// })
\ No newline at end of file
// })
// 向 Vue 环境暴露通信接口(挂载到 window 上)
contextBridge.exposeInMainWorld('electronAPI', {
// 获取服务地址
getServerUrl: () => ipcRenderer.invoke('get-server-url'),
// 设置服务地址
setServerUrl: (url) => ipcRenderer.invoke('set-server-url', url),
// 向渲染进程暴露获取端口API
getSerialPorts: () => ipcRenderer.invoke('get-serial-ports')
});
......@@ -3,3 +3,4 @@
USER_NAME=$(logname)
chown -R ${USER_NAME}:${USER_NAME} /usr/lib/iot-test
This diff is collapsed.
......@@ -1133,7 +1133,7 @@
"type": "function",
"z": "f2b3c541197aea23",
"name": "采集结束",
"func": "if(global.get('flow_status') !='stop'){\n if(global.get(\"device_mode\") == \"passive\"){//被动设备\n var end_time = new Date().getTime();\n var start_time = msg.collect_start_time;\n var time = end_time - start_time\n var speed = parseFloat((1000 / time).toFixed(2))\n msg.speed = speed\n node.warn(`采集耗时:${time},发送速率:${speed}Hz`)\n return msg;\n }else{//主动设备\n if (!isNaN(msg.collect_start_time)){//兼容被动设备\n global.set(\"active_start_time\", msg.collect_start_time);\n }\n node.warn(`global.get(\"loop_end\"):${global.get(\"loop_end\")}`);\n if(global.get(\"loop_end\") == false){\n var active_time = global.get(\"active_start_time\", null);\n node.warn(`active_time:${active_time}}`);\n if (active_time != null) {\n var end_time = new Date().getTime();\n var start_time = active_time;\n var time = end_time - start_time\n var speed = parseFloat((1000 / time).toFixed(2))\n msg.speed = speed\n node.warn(`采集耗时:${time},发送速率:${speed}Hz`)\n //node.warn(`set active_start_time1:${end_time}`)\n global.set(\"active_start_time\", end_time);\n var loop_mode = global.get(\"loop_mode\");\n if (loop_mode == \"size\" && global.get(\"loop_size\") > 0) {\n node.error(`loop_size:${global.get(\"loop_size\")},time:${time}`) \n var loop_size = global.get(\"loop_size\");\n loop_size = global.get(\"loop_size\") - 1;\n global.set(\"loop_size\", loop_size);\n if (loop_size == 0) {\n global.set(\"loop_end\", true);\n }\n return msg;\n } else if (loop_mode == \"time\"){\n return msg;\n }\n } else {\n var current_time = new Date().getTime();\n global.set(\"active_start_time\", current_time );\n }\n }\n }\n}",
"func": "function check_loop_mode(){\n if (global.get(\"device_mode\") != \"passive\"){\n var loop_mode = global.get(\"loop_mode\");\n if (loop_mode == \"size\" && global.get(\"loop_size\") > 0) {\n node.error(`loop_size:${global.get(\"loop_size\")},time:${time}`)\n var loop_size = global.get(\"loop_size\");\n loop_size = global.get(\"loop_size\") - 1;\n global.set(\"loop_size\", loop_size);\n if (loop_size == 0) {\n global.set(\"loop_end\", true);\n }\n }\n }\n}\n\nif(global.get('flow_status') !='stop'){\n var type_input = \"{{type_input}}\"//由服务端处理\n if(type_input == \"send_speed\"){\n if(global.get(\"device_mode\") == \"passive\"){//被动设备\n var end_time = new Date().getTime();\n var start_time = msg.collect_start_time;\n var time = end_time - start_time\n var speed = parseFloat((1000 / time).toFixed(2))\n msg.speed = speed\n node.warn(`采集耗时:${time},发送速率:${speed}Hz`)\n return msg;\n }else{//主动设备\n if (!isNaN(msg.collect_start_time)){//兼容被动设备\n global.set(\"active_start_time\", msg.collect_start_time);\n }\n node.warn(`global.get(\"loop_end\"):${global.get(\"loop_end\")}`);\n if(global.get(\"loop_end\") == false){\n var active_time = global.get(\"active_start_time\", null);\n node.warn(`active_time:${active_time}}`);\n if (active_time != null) {\n var end_time = new Date().getTime();\n var start_time = active_time;\n var time = end_time - start_time\n var speed = parseFloat((1000 / time).toFixed(2))\n msg.speed = speed\n node.warn(`采集耗时:${time},发送速率:${speed}Hz`)\n //node.warn(`set active_start_time1:${end_time}`)\n global.set(\"active_start_time\", end_time);\n check_loop_mode();\n return msg;\n } else {\n var current_time = new Date().getTime();\n global.set(\"active_start_time\", current_time );\n }\n }\n }\n }else{\n check_loop_mode();\n return msg;\n }\n}\n",
"outputs": 1,
"timeout": 0,
"noerr": 0,
......
File added
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment