NeiMengGuServer.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. // 3-透明展示柜
  30. let show = [
  31. { name: "A柜左", val: "1" },
  32. { name: "A柜右", val: "2" },
  33. { name: "B柜左", val: "3" },
  34. { name: "B柜右", val: "4" },
  35. ];
  36. // {type:'show',data:{ name: "A柜右", val: 5 }'}
  37. // 4-投屏管理
  38. let screen = [
  39. { name: "户外裸眼3D", val: "open" },
  40. { name: "文物互动墙", val: "close" },
  41. { name: "数字艺术触摸屏", val: "open" },
  42. { name: "AI数字人", val: "open" },
  43. ];
  44. // {type:'screen',data:{ name: "户外裸眼3D", val: "open" }'}
  45. const localIP = getLocalIP();
  46. const port = 8501;
  47. const io = require("socket.io")(port, {
  48. pingInterval: 30005,
  49. pingTimeout: 5000,
  50. upgradeTimeout: 3000,
  51. allowUpgrades: true,
  52. cookie: false,
  53. serveClient: true,
  54. });
  55. console.log("Socket.IO 服务器已启动!");
  56. console.log("本机访问地址: http://localhost:" + port);
  57. console.log("局域网访问地址: http://" + localIP + ":" + port);
  58. io.on("connection", (socket) => {
  59. console.log("✅ 用户通过 Socket.IO 连接成功:", socket.id);
  60. io.emit("UpdateDeviceInfo", { type: "cut", data: theme });
  61. io.emit("UpdateDeviceInfo", { type: "show", data: show });
  62. io.emit("UpdateDeviceInfo", { type: "screen", data: screen });
  63. socket.on("ChangeDeviceInfo", (info) => {
  64. const { name, val } = info.data;
  65. if (info.type === "cut") {
  66. theme = theme.map((v) => ({
  67. ...v,
  68. val: name === "all" ? val : v.name === name ? val : v.val,
  69. }));
  70. // 然后向前端广播 数据 {type:'cut',data:theme}
  71. io.emit("UpdateDeviceInfo", { type: "cut", data: theme, code: 0 });
  72. } else if (info.type === "show") {
  73. show = show.map((v) => ({
  74. ...v,
  75. val: v.name === name ? val : v.val,
  76. }));
  77. // 然后向前端广播 数据 {type:'show',data:show}
  78. io.emit("UpdateDeviceInfo", { type: "show", data: show, code: 0 });
  79. } else if (info.type === "screen") {
  80. screen = screen.map((v) => ({
  81. ...v,
  82. val: v.name === name ? val : v.val,
  83. }));
  84. // 然后向前端广播 数据 {type:'screen',data:screen}
  85. io.emit("UpdateDeviceInfo", { type: "screen", data: screen, code: 0 });
  86. } else if (info.type === "switch") {
  87. theme = theme.map((v) => ({
  88. ...v,
  89. switch: name === "all" ? val : v.name === name ? val : v.switch,
  90. }));
  91. // 然后向前端广播 数据 {type:'cut',data:theme}
  92. io.emit("UpdateDeviceInfo", { type: "cut", data: theme, code: 0 });
  93. }
  94. });
  95. });