资讯动态

PS5多主机管理利器AnyPS5:局域网唤醒与远程截图实战

发布时间:2026/10/15 23:56:13 来源:尧图企业网站定制
如果你家里不止一台 PS5你大概会懂那种烦躁。客厅一台、卧室一台有时候工作室也扔了一台。每次想换台机器开机、截图、或者拉一串待机时长都要打开官方的手机 App一个账号一个账号地切眼睛都快看花。这个项目最初就是为了治疗我自己的这个痛点把多台 PS5 的管理统一到一个界面里用局域网唤醒、查状态、远程截图还能一键跳转到官方串流入口。我把它叫 AnyPS5意思是任意一台 PS5一个面板全搞定。它不是一个模拟器也不算越狱工具而是一个完全基于 PS5 官方开放能力做的轻量管理面板。它能在局域网里自动发现所有主机通过 Wake on LAN 把待机中的机器叫醒读出当前在跑什么游戏、系统剩余空间、主机温度这类信息还能把截图和录像按主机归档起来。如果你有一台树莓派或者旧电脑半小时就能搭起来之后你在电脑浏览器上就能管所有机器再也不用抱着手机满屋子切账号了。谁适合搞这个东西如果你是那种家里有不止一台主机、又喜欢瞎折腾网络的玩家或者是做游戏内容、需要频繁截素材的作者再或者你就是单纯想研究一下主机是怎么被局域网唤醒了这种协议那这篇文章值得看完。我会从为什么不用官方 App 开始把整个项目的协议原理、核心代码、部署流程和踩坑实录都拆开讲一遍。最后你会得到一套能真正跑起来的多主机管理服务也会知道哪些边界一定要遵守——绝不碰任何破解、越狱和绕过验证的东西。1. 项目缘起跨主机管理这个刚需官方一直没有给解法1.1 官方 App 有多好用就有多难用PS5 官方手机 App 做得很精致买游戏、看截图、远程开关机都能干。可一旦你有两台以上主机体验就急转直下。首先账号切换是最大的坑。同一时间里App 只能关联一个账号下的主机。我家客厅那台用的 A 账号卧室那台用的是 B 账号工作室那台走的是 C 账号——我想分别看一下三台机器的状态就要在 App 里退出登录 A再登录 B再登录 C。一次两次能忍天天这么搞人就开始暴躁。其次App 的信息都是云上的是走了公网的。家里路由器一换、代理规则一变App 反而不如局域网直连稳定。我曾经在客厅看到卧室那台 PS5 明明待机App 里却显示离线最后发现是路由器更新后 DDNS 没同步折腾了一晚上。反观局域网内的协议只要在同一网段响应都是毫秒级的。最后官方的截图浏览不支持按主机筛选。你截了三千张图它全塞在一个时间线里想找某个游戏的通关截图只能靠记忆硬翻。AnyPS5 的做法是每台主机一个独立图库按游戏名分文件夹找素材舒服得多。1.2 我能做的和我不做的在开始写代码之前我给自己定了几条清清楚楚的边界只使用 PS5 系统菜单里能开的官方选项比如允许通过局域网唤醒和远程游玩连接不通过修改系统文件或越狱来实现任何功能。局域网内完成设备发现、状态读取、媒体文件访问。公网串流留给官方通道我不碰、也不提供任何中转代理方案。不破解任何游戏不绕过验证不涉及模拟器。AnyPS5 本质上就是一台局域网遥控器加相册管理面板。之所以先划边界是因为这类项目太容易滑向灰色地带。我见过不少类似工具做着做着就变成了破解启动器最后整个社区被端掉。做一个正规、干净、能立足十年的小工具比做一个三天的噱头有价值得多。1.3 技术目标拆解AnyPS5 要解决的三个核心问题对应着三套不同的技术方案发现主机用 SSDP简单服务发现协议扫描局域网内的 PS5。它会在开机/待机状态下主动广播自己的设备描述信息这完全是官方预留的互通机制。唤醒主机用 Wake on LAN 协议向主机的有线网卡发送魔术包让它在待机状态下被网络信号唤醒。这一步要求用户在 PS5 系统设置里打开对应开关。读取状态与媒体使用 PS5 本机生成的设备连接码发起带校验的 HTTP 请求从主机的媒体服务里拉取游戏状态、截图列表、录像列表等。这套接口同样是对外开放的配合官方 App 一起用并不会冲突。搞定这三个点一个多主机管理链路就通了。下面我详细讲每一步是怎么设计和实现的。2. 技术选型为什么选择 Python FastAPI Vue而不是其他组合2.1 语言与后端框架AnyPS5 的后端我选的是 Python 3.11 FastAPI。理由很简单协议对接部分有大量的二进制包、UDP 广播、HTTP 轮询用 Python 的 scapy 和 requests 库能少写一半的字节拼装代码。FastAPI 自带 OpenAPI 文档联调 Web 面板时可以直接在浏览器里测试所有接口这比 Django 轻比 Flask 又更规范。如果你对实时状态有更高要求可以上 WebSocketFastAPI 原生支持我后面在扩展里也会提到。但对大多数用户来说定时轮询 5 秒一次已经足够流畅了。2.2 前端界面前端我用了 Vue 3 TailwindCSS打包成一个纯静态 dist 目录这样整个项目不需要 Node 服务参与生产。你甚至可以不用前端直接用浏览器打开 FastAPI 的/docs页面也能操作所有设备。Many 项目会把前端和后端耦合在一起后期维护很痛苦。AnyPS5 的前后端是完全分离的后端暴露 REST API前端只负责画卡片和按钮这样以后想换个桌面客户端、或者接入智能音箱都不需要动核心逻辑。2.3 部署形态与依赖清单我最终选择了 Docker Compose 作为推荐部署方式因为树莓派、软路由、NAS 上跑 Docker 实在太普遍了。同时保留了纯 Python 的启动脚本方便只有命令行环境的人直接跑。组件技术选择用途后端Python 3.11 FastAPI Uvicorn协议对接、设备管理、REST 接口发现模块scapy uuid 解析SSDP 广播与设备描述解析媒体模块aiohttp访问 PS5 官方的媒体服务接口前端Vue 3 TailwindCSS Vite设备卡片、状态展示、截图浏览部署Docker Compose / venv一键安装或传统启动这个组合最大的优势是换机器成本极低。我最初跑在 Mac 上后来切到树莓派 4B再后来放到家里的小型软路由上整个过程只有 Docker 镜像构建时间的差别代码一行没改。3. 核心协议解析SSDP 发现、魔术包唤醒与认证码校验3.1 局域网发现SSDP 是怎么认出 PS5 的SSDP 是 UPnP 协议族里负责设备发现的部分。设备在加入网络或状态变化时会向固定的组播地址239.255.255.250:1900发送 NOTIFY 消息其他设备也可以主动发送 M-SEARCH 查询。PS5 在待机状态下依然会响应这类查询这就是 AnyPS5 能在不打扰主机的情况下发现它的基础。我截了一段典型的 PS5 SSDP 响应头HTTP/1.1 200 OK CACHE-CONTROL: max-age1800 EXT: LOCATION: http://192.168.1.123:28695/dev/description.xml SERVER: UPnP/1.0 ST: urn:schemas-upnp-org:device:Basic:1 USN: uuid:xxx-xxx-xxx::urn:schemas-upnp-org:device:Basic:1看到LOCATION字段里的28695端口了吗这就是 PS5 的媒体服务端口。接下来我们要访问这个 URL 获取更详细的设备信息包括 MAC 地址、固件版本和友好名称。对应 Python 实现的核心逻辑是通过 UDP 组播发送一个精简的 M-SEARCH 包然后监听响应。重点是要设置合理的超时时间比如 3 秒避免某些路由器丢组播包导致一直等下去。import socket import requests from xml.etree import ElementTree as ET def discover_ps5(timeout3): msg ( M-SEARCH * HTTP/1.1\r\n HOST: 239.255.255.250:1900\r\n MAN: ssdp:discover\r\n MX: 1\r\n ST: urn:schemas-upnp-org:device:Basic:1\r\n\r\n ).encode() sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(timeout) sock.sendto(msg, (239.255.255.250, 1900)) devices [] try: while True: data, addr sock.recvfrom(1024) text data.decode() if location: in text.lower(): loc [line.split(:, 1)[1].strip() for line in text.splitlines() if line.lower().startswith(location:)][0] desc requests.get(loc, timeout2).text root ET.fromstring(desc) # 从XML中提取MAC、型号、名称并填充devices devices.append({ name: root.findtext(.//friendlyName), mac: root.findtext(.//serialNumber), url: loc, }) except socket.timeout: pass return devices这段代码拿到的不止是 IP更重要的是设备描述 URL。因为后续所有媒体操作都要从这个 URL 去派生出凭证接口。提示如果你的路由器开了AP 隔离或者多播过滤功能SSDP 会直接失效。发现不到设备时先去路由器后台看这两项。3.2 唤醒机制魔术包到底是什么Wake on LAN 的原理非常简单——向目标网卡发送一个包含目标 MAC 地址重复 16 次的以太网帧网卡收到后对比自己的 MAC匹配则触发开机。这个帧就是俗称的魔术包。PS5 的有线网卡在待机状态下依然处于供电状态这才能响应魔术包。但有两个前置条件必须满足PS5 要处于待机而不是完全关闭。这是最关键的一个开关。系统设置里要打开启动时可通过网络唤醒选项。路径是设置 - 系统 - 省电与未运行 - 启动时可通过网络唤醒。如果以上都满足了发送魔术包只需要简单的 UDP 数据报。下面这段代码就是 AnyPS5 中最核心的唤醒逻辑import socket import struct def wol(mac: str, broadcast_ip: str 255.255.255.255): mac_bytes bytes.fromhex(mac.replace(:, ).replace(-, )) magic b\xff * 6 mac_bytes * 16 sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sock.sendto(magic, (broadcast_ip, 9))注意broadcast_ip的选择。如果你的服务器和 PS5 在同一个 /24 网段用255.255.255.255是最省事的。但要是划分了 VLAN就需要把广播地址改成目标网段的定向广播地址比如192.168.2.255同时路由器要允许定向广播转发。3.3 认证与访问为什么需要设备连接码直接向 PS5 的媒体服务请求截图和状态第一步要过认证。官方给了两种方式一种是 OAuth 流程但需要 PSN 账号的网页登录授权不适合写进自助部署工具另一种更简洁——在 PS5 的远程游玩设置里生成一个 8 位设备连接码这个码就是当前局域网的临时凭证。操作路径设置 - 系统 - 远程游玩 - 添加设备屏幕上会显示一个 8 位字母数字组合。这个码的有效期通常是 30 秒到几分钟不等生成后要立刻填入 AnyPS5 的配置里。拿到连接码后我们需要把它发给 PS5 的媒体服务换取正式的会话令牌。这一步用 POST 请求到http://主机IP:28695/connect请求体里带上连接码和本机的标识。curl -X POST http://192.168.1.123:28695/connect \ -H Content-Type: application/json \ -d {code:ABCD1234,clientId:anyps5-dashboard,deviceName:main-dashboard}成功后会收到一个包含sessionId的 JSON。之后的所有媒体接口请求都在 HTTP 头里带上这个 sessionId就能正常读取数据了。这里有个容易混淆的点连接码是一次性的换 sessionId 后就没有价值了。但 PS5 的媒体服务允许你同时挂多个 session所以同一台主机可以被面板和官方 App 同时连接互不干扰。3.4 状态读取与媒体列表有了 sessionId就能请求 PS5 的系统状态接口。我用的两条最常用的接口路径是GET /system/info GET /media/gallery?limit50sortrecent前者返回当前运行的游戏标题、系统版本、剩余空间、主机温度。后者返回截图和录像的元数据每条记录包含文件名、尺寸、创建时间和一段可下载的 URL。下面是读取系统状态的 Python 示例import requests def get_system_status(base_url, session_id): resp requests.get( f{base_url}/system/info, headers{Authorization: fBearer {session_id}}, timeout5 ) if resp.status_code 200: return resp.json() raise RuntimeError(f状态读取失败: {resp.status_code} {resp.text})返回的 JSON 里最让我关心的字段是running_title。当它为空时说明主机在待机就可以安全地用 Wake on LAN 唤醒当它不为空时说明主机正插着某一个游戏我会在面板上给一个正在游玩的绿标。媒体列表下来后可以按title字段做分组再配上thumbnail_url直接展示缩略图。整个 AnyPS5 的相册模块就靠这个接口撑起来了。4. 实战部署从零搭好一个 AnyPS5 服务4.1 环境准备与硬件选型AnyPS5 的部署门槛低到你想象不到。我实测过的三种硬件树莓派 4B4GB 内存——最稳推荐。一台吃灰的旧笔记本电脑x86 架构装了 Ubuntu Server——性能过剩好看。家里一台刷了第三方固件的小路由器开启 Docker——能省一台设备但要注意容器网络模式必须设置为主机模式。不管哪种只要保证和 PS5 在同一个局域网并且能正常发送组播和广播包就行。无线网卡也可以但如果你同时做视频流管理建议还是有线连接否则传输截图列表的速度会明显慢一拍。4.2 项目结构说明AnyPS5 的代码仓库结构很清晰总共六个模块anyps5/ ├── app/ │ ├── main.py # FastAPI 入口 │ ├── discovery.py # SSDP 发现 │ ├── wol.py # 魔术包发送 │ ├── media_client.py # PS5 媒体服务调用 │ ├── config.py # 配置加载 │ └── templates/ # Vue 打包后的静态文件 ├── config.yaml # 设备配置文件 ├── requirements.txt └── docker-compose.yml模块之间的依赖关系是单向的main.py调discovery.py拿到设备列表调wol.py做唤醒调media_client.py做认证和状态查询config.py只负责读取配置文件。这样设计的好处是你单独想测试唤醒功能时可以只导入wol.py不用启动整个 Web 服务。4.3 配置文件实战config.yaml是核心。我建议先把每台 PS5 的 MAC 地址和名称写死同时开启自动发现的设备合并。下面是一个参考server: broadcast_address: 255.255.255.255 scan_interval_seconds: 30 devices: - name: living-room mac: A4:5E:60:1A:2B:3C description_url: http://192.168.1.123:28695/dev/description.xml - name: bedroom mac: A4:5E:60:4D:5E:6F description_url: http://192.168.1.124:28695/dev/description.xmlMAC 地址可以从路由器的 DHCP 分配记录里查也可以先跑起来discover.py看自动发现结果。注意每台主机可能有两个 MAC——有线和无线AnyPS5 默认取有线网卡的地址因为 Wake on LAN 只支持有线。4.4 启动与验证在项目根目录执行python -m venv venv source venv/bin/activate pip install -r requirements.txt uvicorn app.main:app --host 0.0.0.0 --port 8080如果你在局域网其他机器上访问http://服务器IP:8080看到设备卡片列表说明服务已经跑起来了。第一次使用先在配置里填好连接码然后在浏览器端点击连接完成认证会话。Docker 方式更简单docker compose up -d启动完成后测试三件套先点发现设备确认 IP 和 MAC再点唤醒等 10 秒看主机灯能不能亮最后进截图页面随机拉几张开看缩略图能不能加载。这三步通过你的多主机管理面板就正式上线了。5. 常见问题与排查实录5.1 魔术包发了主机就是不醒这大概是被问得最多的问题。排查顺序是确认 PS5 处于待机状态不是关机。待机时主机电源灯是琥珀色关机则无灯。确认设置里的启动时可通过网络唤醒已勾选。步骤很容易漏因为它在省电与未运行三级菜单里藏得很深。确认 MAC 地址是网线的 MAC不是 Wi-Fi 的 MAC。我犯过最久的错就是抄了无线网卡地址怎么发都睡不醒。确认服务器能发广播包。测试方法在服务器上抓包看 UDP 9 端口有没有发出长度为 102 字节的包。sudo tcpdump -i eth0 udp port 9 -vvv -X如果看到ff ff ff ff ff ff这样的十六进制数据说明魔术包已经出网卡没看到就是程序或防火墙拦截了。5.2 自动发现不到 PS5SSDP 本身就是个看运气的协议但大部分情况是网络隔离造成的。最常见的是路由器开启了AP 隔离功能这个选项把无线设备之间的通信全切断了组播包自然到不了。另一种情况是服务器和 PS5 不在同一个 VLAN。家里有简单智能路由做 VLAN 隔离时需要在路由策略里放行239.255.255.250:1900的组播以及 UDP 28695 端口的单播。如果不想深究网络可以直接手动指定description_url跳过发现这一步AnyPS5 完全支持。5.3 连接码总是失效连接码的有效期非常短通常显示出来 60 秒左右就过期。我最后一次实测它实际在 90~120 秒后才失效但保险起见建议你生成码后 30 秒内填完。还有一点容易忽略连接码是和设备关联的。如果你有 3 台 PS5每台都要进各自的远程游玩设置里生成密码不能拿 A 机器的码去连 B 机器。填之前可以在浏览器手动访问http://IP:28695/connect直接把 code 发一次看返回码是不是 200。5.4 串流延迟忽高忽低如果只是用 AnyPS5 做唤醒和状态读取串流延迟和它无关。但如果你的面板集成了跳转串流的功能要记住PS5 的串流画面在局域网内建议网络带宽不低于 20Mbps、延迟不超过 20ms。用 Wi-Fi 时有线回程、5GHz 频段、没有邻居干扰才能稳。一个常见的误操作是开串流的同时让 AnyPS5 疯狂轮询状态。这会让 PS5 的媒体服务接口和游戏画面抢带宽。解决方法是在串流开始后把 AnyPS5 的轮询间隔从 5 秒调到 30 秒甚至暂停轮询串流画面立刻稳定。5.5 常见问题速查表问题可能原因解决方式设备不可见路由AP隔离关闭隔离或在防火墙放行组播唤醒失败MAC 是无线网卡改用有线网卡 MAC唤醒失败未开启网络唤醒设置 - 省电与未运行打开开关认证失败连接码过期重新生成30 秒内填写状态读不到主机在完全关机状态改成待机模式截图加载慢服务器网卡无线改有线连接提高内网带宽串流卡顿AnyPS5 轮询频率过高串流时延长轮询间隔到 30 秒以上Docker 无发现容器网络模式不对改为 host 模式6. 后续扩展思路与个人体会AnyPS5 做完了基础功能后其实还有很大的扩展空间。我最想加的是把 WebSocket 推到前端让设备状态主动推送而不是靠轮询。这样 PS5 进入了哪个游戏、系统温度是不是升高了面板上能实时看到体验会流畅很多。另一个方向是跟智能家居联动。可以用 Home Assistant 把 AnyPS5 的能力封装成 switch 实体这样你在客厅喊一句语音就能把卧室的主机唤醒或者把它们的待机模式统一关掉。我在家里已经试验过把每台 PS5 的唤醒操作映射成虚拟开关接入场景里晚上睡觉前一键让所有主机进入待机非常爽。截图自动同步 NAS 的需求也一直在。目前 PS5 原生只支持把截图同步到官方媒体服务但如果不打算注册会员手动转移很麻烦。AnyPS5 有了媒体列表接口可以直接脚本化地把新截图拉出来按主机名和游戏名归档到 NAS 目录。这一步做通之后自媒体采集素材的流程就彻底自动化了。最后说几句我的真实体会。做这类工具最大的收获不是会写几段 Python而是搞清楚了官方设计者是怎么思考的。你会发现他们既想开放能力又希望控制风险所以用了一层层软门槛组播要自己搜、唤醒要手动开、连接码有效期还短。把这一整套流程自己走一遍比看十遍说明书都有用。工具本身可能很简陋但当你同时按下两台主机的唤醒按钮看着屏幕上两张设备卡片几乎同时从灰色变成绿色那种一切尽在掌控的踏实感是官方 App 永远不会带给你的。顺手再分享一个小技巧把 AnyPS5 的 Docker 容器加入开机自启后遇到家里突然停电再恢复它会自己拉起来并重新发现设备。我因为这事儿少跑了好几次机房也算这个项目最省心的设计决策了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑