# WheelSimu-U **Repository Path**: uitcis/wheel-simu-u ## Basic Information - **Project Name**: WheelSimu-U - **Description**: wheel-simu修改版 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-10 - **Last Updated**: 2026-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # WheelSimu — 手机模拟方向盘,让 PC 游戏认你为手柄/方向盘 WheelSimu 是一套「**手机当方向盘,PC 玩游戏**」的赛车外设方案: - **Android 手机** 通过重力/陀螺仪感应方向盘角度,屏幕上模拟油门/刹车/档位踏板; - **PC 服务端** 接收手机发来的数据,转换为 **WinUHid 虚拟手柄**(Xbox One 方向盘或手柄)输出给游戏; - 无需购买实体方向盘,手机横屏固定在支架上即可畅玩赛车游戏。 ``` 手机(WheelSimu App) PC(WheelSimuServer) 游戏 ┌────────────────┐ TCP/WiFi ┌──────────────────────────────┐ HID ┌────────┐ │ 陀螺仪感应角度 │ ──────────→ │ 角度/油门/刹车/档位/手刹 │ ─────→ │ 识别为 │ │ 触摸屏模拟踏板 │ │ 输出方式: WinUHid(Xbox) 方向盘/手柄 │ │ 手柄/ │ │ 升档/降档按钮 │ │ (顶部下拉随时切换) │ │ 方向盘 │ └────────────────┘ └──────────────────────────────┘ └────────┘ ``` --- ## 目录 - [功能特性](#功能特性) - [系统要求](#系统要求) - [安装步骤](#安装步骤) - [使用指南](#使用指南) - [操作对照表](#操作对照表) - [通信协议](#通信协议) - [项目结构](#项目结构) - [编译说明](#编译说明) - [常见问题 FAQ](#常见问题-faq) --- ## 功能特性 - **方向盘模拟**:陀螺仪/重力感应检测 540°~900° 转向角度,实时映射输出 - **三踏板系统**:油门、刹车、离合器独立模拟,触摸滑动控制 - **档位控制**:升档 / 降档按钮(映射为手柄拨片 RB/LB 或方向盘按钮 1/2) - **手刹开关**:一键手刹(映射为 B 键) - **两种输出模式**(PC 端顶部下拉随时切换): - **WinUHid (方向盘)**:虚拟方向盘(XInput Xbox One 标准方向盘布局),X 轴转向 + 三踏板独立通道,**默认推荐** - **WinUHid (Xbox One)**:虚拟 Xbox One 手柄,XInput 接口,现代游戏全兼容(Forza / WRC / F1 / GTA / 欧卡等) - **零部署**:WinUHid 驱动已内嵌 EXE,首次运行自动安装,无需手动装驱动 - **网络连接**:TCP 直连 + UDP 局域网自动发现,自动重连 - **系统托盘**:可最小化隐藏到托盘,后台持续运行 --- ## 系统要求 ### Android 端(手机) - Android 4.3(API 18)及以上 - 支持加速度计 / 陀螺仪传感器 - 与 PC 处于**同一局域网**(WiFi 或热点) ### PC 端(Windows) - Windows 10 / 11(64 位) - `WheelSimuServer.exe` 为**自包含发布**,无需额外安装 .NET 运行时 - **需要管理员权限**运行(程序会自动弹出 UAC 提权,因为 WinUHid 虚拟设备仅允许管理员访问) ### 驱动依赖 | 输出模式 | 需要安装的驱动 | 说明 | |---|---|---| | **WinUHid (方向盘 / Xbox One)** | `WinUHidDriver.dll`(UMDF 2.23 + VHF) | **已内嵌进 EXE,自动安装**。首次运行自动开启测试签名并装好驱动(可能需重启一次);设备管理器出现 `WinUHid Virtual HID Enumerator` 即成功 | > WinUHid 驱动**完全无需手动安装**:驱动文件(INF/DLL/CAT/CER)已打包进 `WheelSimuServer.exe`,程序首次启动会自动完成「开启测试签名 → 导入证书 → 安装驱动」全流程。 > 两种输出模式共用同一套 WinUHid 驱动,运行时通过顶部下拉随意切换,互不干扰。 --- ## 安装步骤 ### 第 1 步:安装 PC 端服务器(WinUHid 驱动全自动) `Release/WheelSimuServer.exe`(自包含单文件,驱动已内嵌): 1. **双击运行**,UAC 弹窗点"是"; 2. 若驱动未装,程序自动完成以下步骤并提示: - 自动开启 Windows 测试签名模式(`bcdedit /set testsigning on`); - 提示**重启电脑**(仅首次需要); - 重启后再次双击,程序自动导入驱动证书、安装驱动; 3. 之后每次双击即可直接使用,无任何额外操作。 > 注意:**首次安装驱动需重启一次电脑**(开启测试签名模式的硬性要求,无法绕过)。这是用户唯一需要手动做的一步。 ### 第 2 步:安装 Android 端 App 将 `Release/WheelSimu.apk` 传到手机并安装(需允许"安装未知来源应用")。 --- ## 使用指南 ### 一、启动 PC 服务器 1. 双击 `WheelSimuServer.exe`(**必须以管理员身份运行**,UAC 弹窗选"是"); 2. 服务器自动检测并安装 WinUHid 驱动,监听 **TCP 5050**(数据端口),UDP **5051** 广播(自动发现); 3. 底部状态栏查看: - `IP: 192.168.x.x:5050` — 手机需要连接的地址 - `客户端: 0` — 当前已连接的手机数 - `消息: 0` — 收到的数据包计数 > **隐藏到托盘**:关闭窗口会最小化到系统托盘,右键托盘图标可"显示窗口 / 隐藏到托盘 / 退出程序"。 > **开机自启**:可创建快捷方式放入 `shell:startup` 文件夹,或加启动参数 `--tray` 启动后直接进托盘。 ### 二、连接手机 **方式 A:自动发现(推荐)** 1. 保证手机与 PC 在同一局域网; 2. 打开 App,程序启动后自动监听广播 3 秒,发现服务器后自动填入 IP; 3. 点击"连接"。 **方式 B:手动输入** 1. 在 App 的 IP 输入框输入 PC 的 IP 与端口,格式 `192.168.x.x:5050`; 2. 点击"连接"。 > **网络模式**:App 顶部"网络模式"按钮可循环切换 `TCP → UDP → 蓝牙`,**默认 TCP 即可**。 **方式 C:蓝牙(无路由器/无 WiFi 环境)** 蓝牙走经典 SPP (RFCOMM) 虚拟串口,PC 端作服务端广播服务,手机主动连接,数据格式与 TCP 完全一致。 1. **先配对**:Windows 设置 → 蓝牙和设备 → 添加设备 → 蓝牙,与手机完成配对(PC 需有蓝牙适配器); 2. **启动 PC 服务器**(管理员运行),日志出现 `蓝牙 SPP 服务已启动: WheelSimu` 即表示已在广播; 3. 手机端 App 把"网络模式"切到 **蓝牙**,点"连接" → 在弹出的已配对设备列表里选你的 PC; 4. 首次使用需授予"蓝牙连接"权限(Android 12+); 5. 日志出现 `[蓝牙连接] BT xxx` 即连上,之后断线会自动重连上次选择的设备。 > 蓝牙模式不依赖局域网,手机无需开 WiFi;但速率和稳定性不如 TCP,建议作为无网络环境的备选方案。 > **自动重连**:连接按钮即重连开关(显示"重连: 开")。断线后自动尝试重连,无需手动干预。 ### 三、选择输出方式 服务器**顶部标题栏右侧**有下拉框: | 下拉选项 | 含义 | 适用 | |---|---|---| | `WinUHid (方向盘)` | **虚拟方向盘**(XInput,方向盘布局) | **默认推荐**,三踏板独立通道、档位按钮齐全 | | `WinUHid (Xbox One)` | **XInput Xbox One 手柄** | 个别只认标准手柄的游戏 | 切换后日志区会提示"WinUHid 方向盘虚拟设备已创建"或"WinUHid Xbox One 虚拟手柄已创建"。 ### 四、开始游戏 1. 手机横屏固定在方向盘支架上,打开 App 并连接成功; 2. 在游戏中打开手柄设置,应能看到一个 **Xbox One 方向盘** 或 **Xbox One 手柄**(WinUHid 模式); 3. 转动手机 / 方向盘 → 游戏内方向盘跟随转动,即可开始游戏。 --- ## 操作对照表 | 游戏操作 | 手机操作 | WinUHid (方向盘) 输出 | WinUHid (Xbox One) 输出 | |---|---|---|---| | 转向 | 左右倾斜/旋转手机(陀螺仪) | 方向盘 X 轴(1:1 角度) | 左摇杆 X 轴 | | 油门 | 按住油门踏板滑动 | 油门通道(独立) | 右扳机 (RT) | | 刹车 | 按住刹车踏板滑动 | 刹车通道(独立) | 左扳机 (LT) | | 离合器 | 按离合踏板(手动挡) | 离合通道(独立) | 右摇杆 Y 轴 | | 升档 | 点"升档"按钮 | 按钮 1 | RB(右拨片) | | 降档 | 点"降档"按钮 | 按钮 2 | LB(左拨片) | | 手刹 | 手刹开关 | 按钮 3 | B 键 | | 自动挡 D | 挡位开关 D | 按钮 4(并拉满油门) | Y 键(并拉满油门) | | 自动挡 R | 挡位开关 R | 按钮 5(并拉满油门) | X 键(并拉满油门) | | 手动挡 R | 手动挡 R | 按钮 6 | Back 键 | | 手动挡 1~6 | 手动挡 1~6 档 | 按钮 7~12 | A/X/Y/LB/RB/Menu | | 回正 | 点"回正角度"按钮 | 轴回中 | 摇杆回中 | > 油门与刹车互斥:同时踩下时优先保留后踩的一侧(防误操作)。 --- ## 通信协议 服务器监听 **TCP 5050**,数据为单行 JSON 文本(`\n` 结尾): ```json {"type":"control","angle":45.5,"throttle":75,"brake":0,"clutch":0,"handbrake":0,"gearUp":0,"gearDown":0} ``` | 字段 | 含义 | 范围 | |---|---|---| | `angle` | 方向盘角度(度) | 约 -450 ~ +450 | | `throttle` | 油门 | 0~100 | | `brake` | 刹车 | 0~100 | | `clutch` | 离合 | 0~100 | | `handbrake` | 手刹 | 0 / 1 | | `gearUp` / `gearDown` | 升降档脉冲 | 0 / 1 | **局域网自动发现**:服务器每 1 秒向 UDP **5051** 广播 `WHEELSIMU_SERVER::`,App 收到后自动填入地址。 --- ## 项目结构 ``` WheelSimu/ ├── WheelSimu/ # Android 应用(Xamarin/.NET Android) │ └── WheelSimu/ │ ├── MainActivity.cs # 传感器采集 + 网络 + UI │ ├── SteeringWheelView.cs # 方向盘绘制视图 │ └── PedalGaugeView.cs # 踏板触摸视图 │ ├── WheelSimuServer/ # PC 服务端(C# / WinForms) │ ├── MainForm.cs # 主窗体:TCP 服务、双输出调度、UI │ ├── WinUHidDeviceManager.cs # WinUHid(Xbox One) P/Invoke 封装 │ ├── WinUHidWheelDeviceManager.cs # WinUHid(方向盘) P/Invoke 封装 │ ├── WinUHidDriverInstaller.cs # 驱动零部署自动安装(内嵌资源解压+签名+SetupAPI) │ ├── Driver/ # 内嵌驱动源文件(INF/DLL/CAT/CER) │ ├── app.manifest # 管理员提权(requireAdministrator) │ └── WheelSimuServer.csproj # 自包含单文件发布 │ └── Release/ ├── WheelSimu.apk # Android 安装包 └── WheelSimuServer.exe # Windows 服务端(单文件) ``` --- ## 编译说明 ### PC 服务端 ```bash cd WheelSimuServer dotnet publish -c Release # 产物在 bin/Release/net10.0-windows/win-x64/publish ``` ### Android 端 用 Visual Studio 打开 `WheelSimu.sln`,选择 Release 配置编译生成 APK。 --- ## 常见问题 FAQ **Q1:启动时 UAC 弹窗?** A:正常。WinUHid 虚拟设备仅允许管理员访问,程序通过 `app.manifest` 强制提权。请点"是"。 **Q2:下拉切换 WinUHid 时提示"驱动不可用 / 切换失败"?** A:WinUHid 驱动未安装或未启用测试签名。正常情况下首次运行会自动安装;若失败,检查: ① 是否以管理员身份运行;② 是否已完成重启(开启测试签名需重启生效);③ 按 [安装步骤](#第-1-步安装-pc-端服务器winuhid-驱动全自动) 手动重装。 **Q3:游戏里没看到手柄 / 手柄无反应?** A:① 先确认服务器日志"WinUHid ... 已创建";② 在游戏设置里重新扫描手柄;③ 检查底部数据行 `BTN=0x…` 是否有按钮输出。 **Q4:手机连不上服务器?** A:① 确认手机与 PC 同一局域网;② 检查 Windows 防火墙是否放行 TCP 5050 与 UDP 5051(首次运行请允许弹窗);③ 可手动输入 IP 连接(格式 `192.168.x.x:5050`)。 **Q5:转向方向反了?** A:把手机反过来装,或在 App 内反转传感器方向(设置里调整)。 **Q6:油门/刹车有延迟?** A:游戏对扳机做了平滑过渡,属正常手感;若延迟明显,检查 WiFi 信号。 **Q7:两种输出模式能同时用吗?** A:同一时刻只输出一个(按顶部下拉选择),避免游戏识别到两个手柄混乱。 **Q8:手机转 90° 游戏只转 45°?** A:新版已修复角度映射(等效比例 `angle/450`),方向盘模式与手机角度 1:1 对应;请更新 `Release/WheelSimuServer.exe`。 --- ## 许可证 本项目基于 MIT 许可证开源。 ## 致谢 - [WinUHid (lurebat)](https://github.com/lurebat/WinUHid) — 虚拟 HID 框架 + Xbox One 预设驱动 - [Xamarin.Android](https://dotnet.microsoft.com/en-us/apps/xamarin/android) — Android 应用开发框架