在 Meta Quest 2 / Quest 3 上通过 WebXR 读取手柄位姿、按钮和摇杆数据,并通过 WebSocket -> UDP 转发到电脑上的程序。
推荐优先使用桌面 UI 启动;命令行方式保留为备用方案。
quest_controller_stream/
├── quest_stream_ui.py # 推荐入口:桌面 UI
├── start_stream_server.py # 命令行入口:启动页面服务 + WS -> UDP 中继
├── start_http_server.sh # 对命令行入口的 shell 包装
├── index.html # Quest Browser 打开的 WebXR 页面
└── udp_receiver_test.py # 本机 UDP 调试接收器
- Meta Quest 2 / Quest 3
- Python 3.10+
adbopenssl
说明:
adb用于 USB 模式自动配置adb reverseopenssl用于无线模式自动生成本地 HTTPS/WSS 证书
pip install websockets PyQt5如果你只打算用命令行,不用 UI,PyQt5 不是必须。
adb devices如果 USB 模式准备正常,你应该能看到 Quest 设备。
启动 UI:
python3 quest_stream_ui.pyUI 支持:
- 选择
USB/WiFi - 修改
UDP、HTTP、WS参数 - 启动 / 停止服务
- 验证本机 UDP 接收
- 实时查看左右手:
positionquaternionthumbsticktriggersqueeze- 按钮状态
- 自动保存参数到:
.quest_stream_ui.json
ModeUSB:有线模式,自动尝试adb reverseWiFi:无线模式,自动走HTTPS/WSS
UDP IP- 数据最终要转发到的目标 IP
- 本机调试通常用
127.0.0.1
UDP Port- 数据最终要转发到的目标端口
- 默认
5005
HTTP Host- 网页服务监听地址
- 默认
0.0.0.0
HTTP Port- Quest 浏览器打开页面时使用的端口
- 默认
8080
WS Host- WebSocket 服务监听地址
- 默认
0.0.0.0
WS Port- 页面把手柄数据发回电脑时使用的端口
- 默认
8765
Force HTTPS/WSS- 强制启用安全上下文
WiFi模式下默认会自动开启
Cert File- HTTPS 证书文件路径
- 默认
.certs/quest-controller.crt
Key File- HTTPS 私钥文件路径
- 默认
.certs/quest-controller.key
Verify Port- UI 本地验证 UDP 接收时监听的端口
- 通常和
UDP Port保持一致
- 选择
Mode = USB UDP IP = 127.0.0.1UDP Port = 5005- 点击
Start Server - 在 Quest Browser 打开 UI 里显示的
USB URL - 点击网页里的
Start XR Stream - 如需验证,点击
Start Verify
- 选择
Mode = WiFi - 确保 Quest 和电脑在同一个局域网
UDP IP = 127.0.0.1或你自己的接收端 IP- 点击
Start Server - 在 Quest Browser 打开 UI 里显示的
WiFi URL - 第一次如果有证书警告,先接受,再重新打开
- 点击网页里的
Start XR Stream - 如需验证,点击
Start Verify
如果你不想开 UI,可以直接用命令行。
python3 start_stream_server.py或:
./start_http_server.sh它会同时:
- 启动
index.html页面服务 - 启动
WebSocket -> UDP中继 - USB 模式下自动尝试执行
adb reverse - 打印 USB 和 WiFi 地址
默认 UDP 目标:
127.0.0.1:5005
如需本机验证:
python3 udp_receiver_test.py--udp-ip- UDP 转发目标 IP
- 默认
127.0.0.1
--udp-port- UDP 转发目标端口
- 默认
5005
--http-port- 网页服务端口
- 默认
8080
--ws-port- WebSocket 服务端口
- 默认
8765
--adb auto- 默认模式
- 自动尝试
adb reverse
--adb never- 无线模式
- 不尝试
adb - 会默认自动启用
HTTPS/WSS
--adb always- 强制要求
adb reverse成功,否则退出
- 强制要求
--https- 显式启用
HTTPS/WSS
- 显式启用
--cert-file- HTTPS 证书路径
- 默认
.certs/quest-controller.crt
--key-file- HTTPS 私钥路径
- 默认
.certs/quest-controller.key
python3 start_stream_server.pypython3 start_stream_server.py --adb neverpython3 start_stream_server.py --udp-ip 192.168.1.50 --udp-port 5005python3 start_stream_server.py --http-port 8081 --ws-port 8766python3 start_stream_server.py --adb alwaysQuest 访问:
http://localhost:8080/index.html
电脑端通过 adb reverse 把 Quest 里的 localhost 反向映射到本机服务。
推荐条件:
- Quest 开启开发者模式
- USB 连接 Quest 和电脑
- 头显内允许
USB debugging adb devices能看到设备
Quest 访问:
https://电脑局域网IP:8080/index.html?ws=wss://电脑局域网IP:8765
无线模式默认使用 HTTPS/WSS,因为 WebXR 往往需要安全上下文。
无线模式会用到两个文件:
.certs/quest-controller.crt.certs/quest-controller.key
含义:
.crt:证书文件.key:私钥文件
作用:
- 让页面从
http://变成https:// - 让 WebSocket 从
ws://变成wss://
如果文件不存在,脚本会自动生成自签名证书。通常不需要手动改;只有你已经有自己的证书时,才需要改路径。
注意:
- 自签名证书第一次访问时,Quest Browser 可能会提示证书警告
- 需要你先手动接受一次,再重新打开页面
启动后会打印这些地址:
USB accessUSB access with ws paramWiFi accessWiFi access with ws param
建议:
- USB 模式:优先打开
USB access - WiFi 模式:优先打开
WiFi access with ws param
命令行验证:
python3 udp_receiver_test.py它会打印:
- 左右手位置
- 左右手四元数
- 欧拉角
- 摇杆
- trigger / squeeze
- 按钮状态
如果使用 UI,也可以直接点击 Start Verify 在界面里看最新数据。
常见原因:
- 不是在 Quest Browser 里打开
- 没有进入安全上下文
- 无线模式地址不对
处理:
- 先试 USB 模式
- 或无线用:
python3 start_stream_server.py --adb never端口被占用了。
处理:
- 关掉上一次启动的服务
- 或换端口:
python3 start_stream_server.py --http-port 8081 --ws-port 8766安装:
pip install websockets安装:
pip install PyQt5