socket.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. 'use strict';
  2. const { Controller } = require('ee-core');
  3. const Log = require('ee-core/log');
  4. const CoreWindow = require('ee-core/electron/window');
  5. const WebSocket = require('ws'); // 引入原生 ws 库
  6. let socket = null;
  7. const { pyapp } = require('../config/app.config.json')
  8. const typeToMessage = {
  9. run_mcu_single:['seeting','default'],
  10. get_deviation_data:"developer",
  11. set_deviation:"developer",
  12. get_mcu_other_info:"developer",
  13. set_mcu_other_info:"developer",
  14. send_command:"developer"
  15. }
  16. class SocketController extends Controller {
  17. constructor(ctx) {
  18. super(ctx);
  19. }
  20. /**
  21. * Connect to WebSocket server
  22. */
  23. async connect() {
  24. await new Promise(async (resolve,reject) => {
  25. const win = CoreWindow.getMainWindow()
  26. if(socket){
  27. console.log('has socket ')
  28. resolve(true);
  29. win.webContents.send('controller.socket.connect_open', true);
  30. return;
  31. }
  32. socket = new WebSocket('ws://'+pyapp+':7074/ws');
  33. // 监听连接成功事件
  34. socket.on('open', () => {
  35. console.log('socket open')
  36. resolve(true);
  37. win.webContents.send('controller.socket.connect_open', true);
  38. });
  39. // 监听消息事件
  40. socket.on('message', (data) => {
  41. try {
  42. let this_data = JSON.parse(data.toString());
  43. console.log(this_data.msg_type);
  44. console.log(this_data);
  45. if(this_data.msg_type){
  46. let channel = 'controller.socket.message_'+this_data.msg_type;
  47. if(typeToMessage[this_data.msg_type]){
  48. if(typeof typeToMessage[this_data.msg_type] === 'object'){
  49. typeToMessage[this_data.msg_type].map(item=>{
  50. if(item === 'default'){
  51. win.webContents.send(channel, this_data);
  52. }else{
  53. if(this.app.electron[item]) this.app.electron[item].webContents.send(channel, this_data);
  54. }
  55. })
  56. }else{
  57. if(this.app.electron[typeToMessage[this_data.msg_type]]) this.app.electron[typeToMessage[this_data.msg_type]].webContents.send(channel, this_data);
  58. }
  59. }else{
  60. win.webContents.send(channel, this_data);
  61. }
  62. }
  63. }catch (e){
  64. console.log(e)
  65. }
  66. });
  67. // 监听连接关闭事件
  68. socket.on('close', () => {
  69. console.log('socket close');
  70. win.webContents.send('controller.socket.disconnect', null);
  71. socket = null
  72. });
  73. // 监听错误事件
  74. socket.on('error', (err) => {
  75. console.log('socket error');
  76. win.webContents.send('controller.socket.disconnect', null);
  77. reject(true);
  78. });
  79. console.log('socket end')
  80. })
  81. }
  82. /**
  83. * 发送 ping 消息
  84. */
  85. sendPing() {
  86. const message = JSON.stringify({ data: 'node', type: 'ping' });
  87. this.sendMessage(message);
  88. }
  89. /**
  90. * 发送消息到服务器
  91. * @param {string} message - JSON 字符串
  92. */
  93. sendMessage(message) {
  94. // 检查连接状态
  95. console.log(message);
  96. console.log(typeof socket);
  97. if (socket?.readyState === WebSocket.OPEN) {
  98. socket.send(message); // 使用 send() 发送
  99. } else {
  100. }
  101. }
  102. /**
  103. * 断开连接
  104. */
  105. disconnect() {
  106. if (socket) {
  107. socket.close(); // 使用 close() 方法
  108. socket = null;
  109. }
  110. }
  111. }
  112. SocketController.toString = () => '[class SocketController]';
  113. module.exports = SocketController;