const os = require("os"); // 获取本机IP地址 function getLocalIP() { const interfaces = os.networkInterfaces(); for (const iface of Object.values(interfaces)) { for (const config of iface) { if (config.family === "IPv4" && !config.internal) { return config.address; } } } return "127.0.0.1"; } //数据格式 let theme = [ { name: "空中成像", val: "历史", switch: "open" }, { name: "文物互动墙", val: "历史", switch: "open" }, { name: "透明展示柜A", val: "历史", switch: "open" }, { name: "透明展示柜B", val: "历史", switch: "open" }, { name: "AI数字人", val: "历史", switch: "open" }, ]; // 通信数据格式 // 1-切换主题 // {type:'cut',data:{ name: "空中成像", val: "红色" }} -----单个切换 // {type:'cut',data:{ name: "all", val: "红色" }} -----全部切换 // 2-开关 // {type:'switch',data:{ name: "空中成像", val: "open"|"close" }'} --单个开关 // {type:'switch',data:{ name: "all", val: "open"|"close" }'} --全部开关 // 3-透明展示柜 let show = [ { name: "A柜左", val: "1" }, { name: "A柜右", val: "2" }, { name: "B柜左", val: "3" }, { name: "B柜右", val: "4" }, ]; // {type:'show',data:{ name: "A柜右", val: 5 }'} // 4-投屏管理 let screen = [ { name: "户外裸眼3D", val: "open" }, { name: "文物互动墙", val: "close" }, { name: "数字艺术触摸屏", val: "open" }, { name: "AI数字人", val: "open" }, ]; // {type:'screen',data:{ name: "户外裸眼3D", val: "open" }'} const localIP = getLocalIP(); const port = 8501; const io = require("socket.io")(port, { pingInterval: 30005, pingTimeout: 5000, upgradeTimeout: 3000, allowUpgrades: true, cookie: false, serveClient: true, }); console.log("Socket.IO 服务器已启动!"); console.log("本机访问地址: http://localhost:" + port); console.log("局域网访问地址: http://" + localIP + ":" + port); io.on("connection", (socket) => { console.log("✅ 用户通过 Socket.IO 连接成功:", socket.id); io.emit("UpdateDeviceInfo", { type: "cut", data: theme }); io.emit("UpdateDeviceInfo", { type: "show", data: show }); io.emit("UpdateDeviceInfo", { type: "screen", data: screen }); socket.on("ChangeDeviceInfo", (info) => { const { name, val } = info.data; if (info.type === "cut") { theme = theme.map((v) => ({ ...v, val: name === "all" ? val : v.name === name ? val : v.val, })); // 然后向前端广播 数据 {type:'cut',data:theme} io.emit("UpdateDeviceInfo", { type: "cut", data: theme, code: 0 }); } else if (info.type === "show") { show = show.map((v) => ({ ...v, val: v.name === name ? val : v.val, })); // 然后向前端广播 数据 {type:'show',data:show} io.emit("UpdateDeviceInfo", { type: "show", data: show, code: 0 }); } else if (info.type === "screen") { screen = screen.map((v) => ({ ...v, val: v.name === name ? val : v.val, })); // 然后向前端广播 数据 {type:'screen',data:screen} io.emit("UpdateDeviceInfo", { type: "screen", data: screen, code: 0 }); } else if (info.type === "switch") { theme = theme.map((v) => ({ ...v, switch: name === "all" ? val : v.name === name ? val : v.switch, })); // 然后向前端广播 数据 {type:'cut',data:theme} io.emit("UpdateDeviceInfo", { type: "cut", data: theme, code: 0 }); } }); });