NeiMengGuServer.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. const os = require("os");
  2. // 获取本机IP地址
  3. function getLocalIP() {
  4. const interfaces = os.networkInterfaces();
  5. for (const iface of Object.values(interfaces)) {
  6. for (const config of iface) {
  7. if (config.family === "IPv4" && !config.internal) {
  8. return config.address;
  9. }
  10. }
  11. }
  12. return "127.0.0.1";
  13. }
  14. //数据格式
  15. let theme = [
  16. { name: "空中成像", val: "历史", switch: "open" },
  17. { name: "文物互动墙", val: "历史", switch: "open" },
  18. { name: "透明展示柜A", val: "历史", switch: "open" },
  19. { name: "透明展示柜B", val: "历史", switch: "open" },
  20. { name: "AI数字人", val: "历史", switch: "open" },
  21. ];
  22. // 通信数据格式
  23. // 1-切换主题
  24. // {type:'cut',data:{ name: "空中成像", val: "红色" }} -----单个切换
  25. // {type:'cut',data:{ name: "all", val: "红色" }} -----全部切换
  26. // 2-开关
  27. // {type:'switch',data:{ name: "空中成像", val: "open"|"close" }'} --单个开关
  28. // {type:'switch',data:{ name: "all", val: "open"|"close" }'} --全部开关
  29. // tcp协议---中控开关控制
  30. // "CMD=501"
  31. // 101:空中成像 开
  32. // 102:空中成像 关
  33. // 201:文物互动墙 开
  34. // 202:文物互动墙 关
  35. // 301:透明展示柜A 开
  36. // 302:透明展示柜A 关
  37. // 401:透明展示柜B 开
  38. // 402:透明展示柜B 关
  39. // 501:AI数字人 开
  40. // 502:AI数字人 关
  41. // 601:所有设备全部 开
  42. // 602:所有设备全部 关
  43. // 3-透明展示柜
  44. let show = [
  45. { name: "A柜左", val: 1 },
  46. { name: "A柜右", val: 2 },
  47. { name: "B柜左", val: 3 },
  48. { name: "B柜右", val: 4 },
  49. ];
  50. // {type:'show',data:{ name: "A柜右", val: 5 }'}
  51. // 4-投屏管理
  52. let screen = [
  53. { name: "户外裸眼3D", val: "close" },
  54. { name: "文物互动墙", val: "close" },
  55. { name: "数字艺术触摸屏", val: "close" },
  56. { name: "AI数字人", val: "close" },
  57. ];
  58. // {type:'screen',data:{ name: "户外裸眼3D", val: "open" }'}
  59. const localIP = getLocalIP();
  60. const port = 8501;
  61. const io = require("socket.io")(port, {
  62. path: "/websocket/",
  63. pingInterval: 30005,
  64. pingTimeout: 5000,
  65. upgradeTimeout: 3000,
  66. allowUpgrades: true,
  67. cookie: false,
  68. serveClient: true,
  69. });
  70. console.log("Socket.IO 服务器已启动!");
  71. console.log("本机访问地址: http://localhost:" + port);
  72. console.log("局域网访问地址: http://" + localIP + ":" + port);
  73. io.on("connection", (socket) => {
  74. console.log("✅ 用户通过 Socket.IO 连接成功:", socket.id);
  75. io.emit("UpdateDeviceInfo", { type: "cut", data: theme });
  76. io.emit("UpdateDeviceInfo", { type: "show", data: show });
  77. io.emit("UpdateDeviceInfo", { type: "screen", data: screen });
  78. socket.on("ChangeDeviceInfo", (info) => {
  79. const { name, val } = info.data;
  80. if (info.type === "cut") {
  81. theme = theme.map((v) => ({
  82. ...v,
  83. val: name === "all" ? val : v.name === name ? val : v.val,
  84. }));
  85. // 然后向前端广播 数据 {type:'cut',data:theme}
  86. io.emit("UpdateDeviceInfo", { type: "cut", data: theme, id: socket.id });
  87. } else if (info.type === "show") {
  88. show = show.map((v) => ({
  89. ...v,
  90. val: v.name === name ? val : v.val,
  91. }));
  92. // 然后向前端广播 数据 {type:'show',data:show}
  93. io.emit("UpdateDeviceInfo", { type: "show", data: show, id: socket.id });
  94. } else if (info.type === "screen") {
  95. screen = screen.map((v) => ({
  96. ...v,
  97. val: v.name === name ? val : v.val,
  98. }));
  99. // 然后向前端广播 数据 {type:'screen',data:screen}
  100. io.emit("UpdateDeviceInfo", {
  101. type: "screen",
  102. data: screen,
  103. id: socket.id,
  104. });
  105. } else if (info.type === "switch") {
  106. theme = theme.map((v) => ({
  107. ...v,
  108. switch: name === "all" ? val : v.name === name ? val : v.switch,
  109. }));
  110. // 然后向前端广播 数据 {type:'cut',data:theme}
  111. io.emit("UpdateDeviceInfo", { type: "cut", data: theme, id: socket.id });
  112. }
  113. });
  114. });
  115. io.on("connection_error", (err) => {
  116. console.log("连接错误:", err.message);
  117. });
  118. io.on("disconnect", (reason) => {
  119. console.log("客户端断开连接:", reason);
  120. });