| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 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 });
- }
- });
- });
|