| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- 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: "close" },
- { name: "文物互动墙", val: "close" },
- { name: "数字艺术触摸屏", val: "close" },
- { name: "AI数字人", val: "close" },
- ];
- // {type:'screen',data:{ name: "户外裸眼3D", val: "open" }'}
- const localIP = getLocalIP();
- const port = 8501;
- const io = require("socket.io")(port, {
- path: "/websocket/",
- 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, id: socket.id });
- } 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, id: socket.id });
- } 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,
- id: socket.id,
- });
- } 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, id: socket.id });
- }
- });
- });
- io.on("connection_error", (err) => {
- console.log("连接错误:", err.message);
- });
- io.on("disconnect", (reason) => {
- console.log("客户端断开连接:", reason);
- });
- //tcp协议------------------
- const tcpPort = 8052;
- const tcpObj = {
- // '101' '102'都是字符串
- // 空中成像
- 101: "空中成像-历史",
- 102: "空中成像-红色",
- 103: "空中成像-非遗",
- // 文物互动墙
- 201: "文物互动墙-历史",
- 202: "文物互动墙-红色",
- 203: "文物互动墙-非遗",
- // 透明展示柜A
- 301: "透明展示柜A-历史",
- 302: "透明展示柜A-红色",
- 303: "透明展示柜A-非遗",
- // 透明展示柜B
- 401: "透明展示柜B-历史",
- 402: "透明展示柜B-红色",
- 403: "透明展示柜B-非遗",
- // AI数字人
- 501: "AI数字人-历史",
- 502: "AI数字人-红色",
- 503: "AI数字人-非遗",
- // 切换所有主题
- 601: "all-红色",
- 602: "all-历史",
- 603: "all-非遗",
- };
- // tcp-server.js
- const net = require("net");
- const server = net.createServer((socket) => {
- console.log("tcp客户端已连接");
- socket.on("data", (data) => {
- console.log("收到tcp客户端消息:", data.toString());
- const valTxt = tcpObj[data.toString()];
- if (valTxt) {
- const valArr = valTxt.split("-");
- const name = valArr[0];
- const val = valArr[1];
- 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, id: socket.id });
- // 回复客户端
- socket.write("success");
- } else {
- console.log(`收到tcp客户端消息:${data.toString()},未找到对应主题`);
- socket.write("error: unknown command");
- }
- });
- socket.on("end", () => {
- console.log("tcp客户端断开连接");
- });
- socket.on("error", (err) => {
- console.log("tcp客户端连接错误:", err.message);
- });
- });
- server.listen(tcpPort, () => {
- console.log("TCP 服务器已启动在 http://" + localIP + ":" + tcpPort);
- });
|