Switch 屏幕串流 + 远程控制。Switch 端画面实时传输到浏览器,键盘/触屏远程操控。
git clone https://github.com/do-kiss/NXRemote.git --recurse-submodules
cd NXRemote
# 需要 devkitPro (libnx) + Go 1.21+
make产物在 out/ 目录下。
SD:/
├── atmosphere/contents/4100000000260799/exefs.nsp
├── config/NXRemote/config.ini
└── switch/.overlays/ovl-NXRemote.ovl
编辑 config.ini,填入服务器地址和端口。首次运行自动生成 8 位授权码。
# 上传并启动
scp out/web-server/* user@your-server:/opt/nxremote/
ssh user@your-server "/opt/nxremote/nxremote-server-linux &"默认端口 9120。支持 HTTPS(需 Nginx/Caddy 反代,Switch 不支持 WSS)。
如果使用手机进行远程控制,可以横屏操作,左右虚拟手柄将提供触屏控制。
理想环境下 FPS 可达 20。实际受画面复杂度、网络延迟、Switch 负载影响,大多数场景低于理想值。
- Switch → Tesla 菜单 → NXRemote → 按 A 启动
- 浏览器打开
http://your-server:9120 - 输入 overlay 显示的 8 位授权码 → 连接
| 键盘 | Switch | 键盘 | Switch |
|---|---|---|---|
| W/A/S/D | 左摇杆 | 方向键 | 右摇杆 |
| T/G/F/H | 十字键 | I/J/K/L | X/Y/B/A |
| Q / E | − / + | 1/2/3/4 | ZL/L/R/ZR |
| C / V | 左/右摇杆按下 | Z / M | 截图 / HOME |
| 项目 | 按键 | 说明 |
|---|---|---|
| 远程控制 | A | 启动/停止服务 |
| 远程控制 | Y | 切换开机自启动 |
| 状态 | — | 0.25s 实时刷新(IPC) |
| 当前授权码 | 长按 A | 显示真实码,松手隐藏 |
| 服务器 | 长按 A | 同上 |
| 重置授权码 | A | 更换配对码,自动重启服务 |
| 运行日志 | A | 开关日志 |
| 显示 | 含义 |
|---|---|
| 未启用 | 模块未运行 |
| 运行中 | 初始化中 / 等待连接 |
| 连接失败 | 无法连接服务器 |
| 等待连接 | 已连服务器,等待浏览器 |
| 远程控制中 | 浏览器已连接 |
[server]
# 服务器 IP 或域名(必填)
host = your-server.com
# 端口
port = 9120
[auth]
# 授权码,首次运行自动生成
# token = XXXXXXXX
[capture]
# 静止画面最低发送间隔 (ms)
static_interval_ms = 500
[debug]
# 日志开关 0/1,重启生效
log_enabled = 0Switch ──WebSocket──→ 中继服务器 ←──WebSocket── 浏览器
│ (视频 + 状态) │ (:9120) │ (控制输入)
│ │ │
└──── 控制输入 ←──────┘ └──── 操控 → Switch
- sys-NXRemote:Switch 系统模块。抓屏 → JPEG 编码 → WebSocket 发送;接收输入 → HDLS 注入
- ovl-NXRemote:Tesla 浮层。IPC 通信获取状态,启停服务,配置管理
- server:Go 中继服务器。Session/token 隔离,支持多 Switch 并发
- web:浏览器前端。视频显示 + 键盘/触屏输入
NXRemote/
├── sys-NXRemote/ # Switch sysmodule (C++/libnx)
├── ovl-NXRemote/ # Tesla overlay
├── server/ # Go 中继服务器 + 前端
├── Makefile # 顶层构建
└── out/ # 编译产物
- devkitPro/libnx
- libultrahand (git submodule)
- gorilla/websocket