|
|
@@ -0,0 +1,187 @@
|
|
|
+
|
|
|
+const Log = require('ee-core/log');
|
|
|
+const CoreWindow = require('ee-core/electron/window');
|
|
|
+const WebSocket = require('ws'); // 引入原生 ws 库
|
|
|
+const { readConfigFile } = require('./config');
|
|
|
+const pyapp = readConfigFile().pyapp
|
|
|
+const { app} = require('electron');
|
|
|
+const path = require('path');
|
|
|
+const fs = require('fs');
|
|
|
+
|
|
|
+const typeToMessage = {
|
|
|
+ run_mcu_single:['seeting','default'],
|
|
|
+ get_deviation_data:"developer",
|
|
|
+ set_deviation:"developer",
|
|
|
+ get_mcu_other_info:"developer",
|
|
|
+ set_mcu_other_info:"developer",
|
|
|
+ send_command:"developer"
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const previewPath = path.join(app.getPath("userData"),'preview','liveview.png');
|
|
|
+
|
|
|
+// 确保目录存在的函数
|
|
|
+function ensureDirectoryExistence(filePath) {
|
|
|
+ const dir = path.dirname(filePath);
|
|
|
+ if (fs.existsSync(dir)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ ensureDirectoryExistence(path.dirname(dir));
|
|
|
+ fs.mkdirSync(dir);
|
|
|
+}
|
|
|
+
|
|
|
+function livePreview(data){
|
|
|
+ if(data.msg === '预览数据发送' && data.code === 1){
|
|
|
+
|
|
|
+ ensureDirectoryExistence(previewPath);
|
|
|
+ const tempFilePath = `${previewPath}.tmp`;
|
|
|
+
|
|
|
+ fs.writeFile(tempFilePath, data.data.smart_shooter_preview, 'base64', (err) => {
|
|
|
+ if (err) {
|
|
|
+ console.error('写入临时文件失败:', err);
|
|
|
+ } else {
|
|
|
+ fs.rename(tempFilePath, previewPath, (renameErr) => {
|
|
|
+ if (renameErr) {
|
|
|
+ console.error('重命名文件失败:', renameErr);
|
|
|
+ } else {
|
|
|
+ console.log(`文件已成功写入到 preview.png`);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+const pySocket = function () {
|
|
|
+
|
|
|
+ this.init = async function () {
|
|
|
+ await new Promise(async (resolve,reject) => {
|
|
|
+
|
|
|
+ const win = CoreWindow.getMainWindow()
|
|
|
+ if(app.socket){
|
|
|
+ resolve(true);
|
|
|
+ win.webContents.send('controller.socket.connect_open', true);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ app.socket = new WebSocket('ws://'+pyapp+':7074/ws');
|
|
|
+
|
|
|
+ // 监听连接成功事件
|
|
|
+ app.socket.on('open', () => {
|
|
|
+ console.log('socket open')
|
|
|
+ resolve(true);
|
|
|
+ win.webContents.send('controller.socket.connect_open', true);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 监听消息事件
|
|
|
+ app.socket.on('message', (data) => {
|
|
|
+ try {
|
|
|
+ console.log('socket.on.message11111111111111111111111');
|
|
|
+
|
|
|
+ let this_data = JSON.parse(data.toString());
|
|
|
+
|
|
|
+ if(this_data.msg_type){
|
|
|
+
|
|
|
+ switch (this_data.msg_type){
|
|
|
+ case 'smart_shooter_enable_preview':
|
|
|
+ livePreview(this_data);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ let channel = 'controller.socket.message_'+this_data.msg_type;
|
|
|
+ if(typeToMessage[this_data.msg_type]){
|
|
|
+ if(typeof typeToMessage[this_data.msg_type] === 'object'){
|
|
|
+
|
|
|
+ typeToMessage[this_data.msg_type].map(item=>{
|
|
|
+ if(item === 'default'){
|
|
|
+ win.webContents.send(channel, this_data);
|
|
|
+ }else{
|
|
|
+ if(this.app.electron[item]) this.app.electron[item].webContents.send(channel, this_data);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }else{
|
|
|
+ if(this.app.electron[typeToMessage[this_data.msg_type]]) this.app.electron[typeToMessage[this_data.msg_type]].webContents.send(channel, this_data);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ win.webContents.send(channel, this_data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }catch (e){
|
|
|
+ console.log(e)
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 监听连接关闭事件
|
|
|
+ app.socket.on('close', () => {
|
|
|
+ console.log('socket close');
|
|
|
+ win.webContents.send('controller.socket.disconnect', null);
|
|
|
+ app.socket = null
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ // 监听错误事件
|
|
|
+ app.socket.on('error', (err) => {
|
|
|
+ console.log('socket error');
|
|
|
+ win.webContents.send('controller.socket.disconnect', null);
|
|
|
+ reject(true);
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ }
|
|
|
+ this.sendPing = function () {
|
|
|
+ const message = JSON.stringify({ data: 'node', type: 'ping' });
|
|
|
+ this.sendMessage(message);
|
|
|
+ }
|
|
|
+ this.sendMessage = async function (message) {
|
|
|
+ console.log('socket.=========================sendMessage');
|
|
|
+ console.log('socket.sendMessage');
|
|
|
+ console.log(message);
|
|
|
+ console.log(app.socket?.readyState);
|
|
|
+ if(!app.socket){
|
|
|
+ await this.init()
|
|
|
+ }
|
|
|
+ // 检查连接状态
|
|
|
+ if (app.socket?.readyState === WebSocket.OPEN) {
|
|
|
+ console.log('send');
|
|
|
+ app.socket.send(message); // 使用 send() 发送
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.disconnect = function () {
|
|
|
+ if (app.socket) {
|
|
|
+ app.socket.close(); // 使用 close() 方法
|
|
|
+ app.socket = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.onSocketMessage = async function (message_type,callback) { // 监听消息事件
|
|
|
+ return new Promise(async (resolve,reject) => {
|
|
|
+ app.socket.on('message', onSocketMessage);
|
|
|
+ async function onSocketMessage(data){
|
|
|
+ try {
|
|
|
+ let this_data = JSON.parse(data.toString());
|
|
|
+
|
|
|
+ console.log('socket.on.message2222222222222222222222222');
|
|
|
+ console.log(this_data.msg_type);
|
|
|
+ console.log(message_type);
|
|
|
+ console.log(this_data);
|
|
|
+ if(this_data.msg_type === message_type){
|
|
|
+ app.socket.off('message', onSocketMessage);
|
|
|
+ callback(this_data)
|
|
|
+ resolve()
|
|
|
+ }
|
|
|
+ }catch (e){
|
|
|
+ Log.error(e)
|
|
|
+ reject(e)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return this;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+module.exports = pySocket;
|