diff --git a/package-lock.json b/package-lock.json index be15b32..7e91642 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,8 @@ "@electron-toolkit/preload": "^3.0.1", "@electron-toolkit/utils": "^3.0.0", "element-plus": "^2.9.2", - "modbus-serial": "^8.0.17" + "modbus-serial": "^8.0.17", + "vue-router": "^4.5.0" }, "devDependencies": { "@electron-toolkit/eslint-config": "^1.0.2", @@ -2296,6 +2297,12 @@ "@vue/shared": "3.5.13" } }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, "node_modules/@vue/eslint-config-prettier": { "version": "9.0.0", "resolved": "https://registry.npmmirror.com/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", @@ -7093,6 +7100,21 @@ "node": ">=10" } }, + "node_modules/vue-router": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.0.tgz", + "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 93694ac..12eba97 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "@electron-toolkit/preload": "^3.0.1", "@electron-toolkit/utils": "^3.0.0", "element-plus": "^2.9.2", - "modbus-serial": "^8.0.17" + "modbus-serial": "^8.0.17", + "vue-router": "^4.5.0" }, "devDependencies": { "@electron-toolkit/eslint-config": "^1.0.2", diff --git a/src/main/index.js b/src/main/index.js index 9db1837..081008a 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -3,39 +3,103 @@ import { join } from 'path' import { electronApp, optimizer, is } from '@electron-toolkit/utils' import icon from '../../resources/icon.png?asset' +// 模拟配置的modbus配置单 +const modbusConfig = { + name: [ + '风速', + '风向', + '温度', + '湿度', + '气压', + '光照', + '雨量', + 'PM2.5', + 'PM10', + '噪音', + ], // 名称 +} var ModbusRTU = require('modbus-serial') var client = new ModbusRTU() -var time +// 寄存器循环 +var time = null +// 主窗口 +var mainWindow +// 登录窗口 +var loginWindow +// 连接后读取modbus从机的连接 +var readClient -// IPC test +// 读取寄存器 ipcMain.on('read', (event, message) => { read(event, message) console.log('pong') }) -// 通过功能码03读取寄存器 -function read(event, message) { +// 登录后开启modbus连接 +ipcMain.on('login', (event, message) => { + // login(event, message) + mainWindow.webContents.send('loginReply', 1) + loginWindow.close() +}) + +// 登录 +// function login(event, message) { +// // 登录业务代码 +// console.log('login', message, event) +// } + +// 接收渲染进程发送的link请求 +ipcMain.on('link', (event, message) => { + link(event, message) +}) + +// 连接modbus +function link(event, message) { + // 连接modbus client.connectTCP(message.ip, { port: 502 }) - // client.connectTCP('192.168.151.59', { port: 502 }) - console.log(message.ip) - // 循环读取寄存器 - time = setInterval(() => { + // 连接成功后读取寄存器方法 + readClient = (event, message) => { client.readHoldingRegisters(message.startAddress, message.quantity, function (err, data) { if (err) { event.reply('readReply', err) - clearInterval(time) return } - // 返回数据给渲染进程 - event.reply('readReply', data.data) + event.reply('readReply', dataHandle(data.data)) }) - }, 1000) + } + read(event, message) +} + +// 通过功能码03读取寄存器 +function read(event, message) { + if (!(time == null)) { + console.log('重复读取数据', time) + return + } + // 循环读取寄存器 + time = setInterval(() => { + readClient(event, message) + }, 500) +} + +// 数据处理 +function dataHandle(data) { + let result = [] + for (let i = 0; i < modbusConfig.name.length; i++) { + result[i] = { + name: modbusConfig.name[i], + data: data[i] + } + } + + return result } // 停止modbus读取 ipcMain.on('stop', (event) => { - console.log('stop') clearInterval(time) + time = null + console.log('stop') // 返回数据给渲染进程 event.reply('readReply', []) }) @@ -43,7 +107,7 @@ ipcMain.on('stop', (event) => { // 创建主窗口 function createWindow() { // Create the browser window. - const mainWindow = new BrowserWindow({ + mainWindow = new BrowserWindow({ width: 900, height: 670, show: false, @@ -54,7 +118,6 @@ function createWindow() { sandbox: false } }) - mainWindow.on('ready-to-show', () => { mainWindow.show() }) @@ -75,9 +138,10 @@ function createWindow() { // 创建子窗口 function createChildWindow() { - let childWindow = new BrowserWindow({ - width: 900, - height: 670, + loginWindow = new BrowserWindow({ + parent: mainWindow, + width: 500, + height: 400, show: false, autoHideMenuBar: true, ...(process.platform === 'linux' ? { icon } : {}), @@ -87,11 +151,12 @@ function createChildWindow() { } }) - childWindow.on('ready-to-show', () => { - childWindow.show() + loginWindow.on('ready-to-show', () => { + loginWindow.show() }) - childWindow.webContents.setWindowOpenHandler((details) => { + loginWindow.webContents.setWindowOpenHandler((details) => { + // console.log('details.url', details.url) shell.openExternal(details.url) return { action: 'deny' } }) @@ -99,9 +164,10 @@ function createChildWindow() { // HMR for renderer base on electron-vite cli. // Load the remote URL for development or the local html file for production. if (is.dev && process.env['ELECTRON_RENDERER_URL']) { - childWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) + // console.log(process.env['ELECTRON_RENDERER_URL'] + '/#/login') + loginWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + '/#/login') } else { - childWindow.loadFile(join(__dirname, '../renderer/login.html')) + // loginWindow.loadURL(join(__dirname, '../renderer/login.html')) } } @@ -120,7 +186,7 @@ app.whenReady().then(() => { }) createWindow() - + createChildWindow() app.on('activate', function () { // On macOS it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. diff --git a/src/renderer/src/App.vue b/src/renderer/src/App.vue index 414933d..6ca9745 100644 --- a/src/renderer/src/App.vue +++ b/src/renderer/src/App.vue @@ -1,72 +1,11 @@ diff --git a/src/renderer/src/component/topBar.vue b/src/renderer/src/component/topBar.vue new file mode 100644 index 0000000..bd20698 --- /dev/null +++ b/src/renderer/src/component/topBar.vue @@ -0,0 +1,20 @@ + + + \ No newline at end of file diff --git a/src/renderer/src/login.vue b/src/renderer/src/login.vue deleted file mode 100644 index 483e0db..0000000 --- a/src/renderer/src/login.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/renderer/src/main.js b/src/renderer/src/main.js index 4fdb117..056a37c 100644 --- a/src/renderer/src/main.js +++ b/src/renderer/src/main.js @@ -5,7 +5,9 @@ import App from './App.vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' +import router from './route' const app = createApp(App) +app.use(router) app.use(ElementPlus) app.mount('#app') diff --git a/src/renderer/src/route/index.js b/src/renderer/src/route/index.js new file mode 100644 index 0000000..5391753 --- /dev/null +++ b/src/renderer/src/route/index.js @@ -0,0 +1,14 @@ +import { createRouter, createWebHashHistory } from 'vue-router' + +const routes = [ + { path: '/', component: () => import('../view/index.vue') }, + { path: '/login', component: () => import('../view/login.vue') } +] + +const router = createRouter({ + mode: 'hash', + history: createWebHashHistory(), + routes +}) + +export default router diff --git a/src/renderer/src/view/index.vue b/src/renderer/src/view/index.vue new file mode 100644 index 0000000..e71cdea --- /dev/null +++ b/src/renderer/src/view/index.vue @@ -0,0 +1,76 @@ + + + + + + diff --git a/src/renderer/src/view/login.vue b/src/renderer/src/view/login.vue new file mode 100644 index 0000000..667538e --- /dev/null +++ b/src/renderer/src/view/login.vue @@ -0,0 +1,58 @@ + + + + +