boardteua/move-hub-88019

GitHub: boardteua/move-hub-88019

通过 Web Bluetooth 和逆向工程的 LWP 3.0 协议,让浏览器直接用手柄遥控 LEGO Technic Move Hub 模型,无需安装任何应用。

Stars: 0 | Forks: 0

# LEGO Technic Move Hub 控制器 — Web Bluetooth 通过浏览器标签页驱动基于 **Technic Move Hub** 构建的 LEGO® Technic™ 模型, 如果有 Xbox 控制器也可以使用。无需应用,无需安装,无需账号。 **→ [lego-ruby.vercel.app](https://lego-ruby.vercel.app)** · [操控指南](https://lego-ruby.vercel.app/guide) 该页面通过 Web Bluetooth 直接与 hub 通信。使用原生 ES modules — 无需 构建步骤,无需框架,无需运行时依赖,仅有一个样式表。 ## 可驱动的设备 **Technic Move Hub**,它通过 Bluetooth 广播为 `Technic Move`。 它没有外部端口:两个驱动电机、一个转向电机、六个灯输出、 一个 RGB 状态 LED、一个加速度计、一个陀螺仪、一个倾斜传感器和一个手势 传感器全部内置在积木中,并通过 USB-C 充电。 | 套装 | | |---|---| | **42214** Lamborghini Revuelto Super Sports Car | 基于此款进行开发和测试 — 修订版 hub,目前正在出货 | | **42176** Porsche GT4 e-Performance Race Car | hub 首次亮相的套装,原始版本 | 使用这些零件重新拼装的模型同样适用,搭载相同 hub 的较新套装也应适用。 ## 功能说明 - **手柄驱动。** 任何浏览器通过 Gamepad API 识别的手柄 — Xbox 和 PlayStation,Bluetooth 或 USB。每个操作均可重新映射,且 映射设置会持久化保存。 - **四种驱动行为。** hub 自身的组合帧(一次写入包含 速度、转向和灯光,并且 hub 会保持转向角度),两个电机 联动,两个电机拆分为独立控制,或者反向旋转适用于 履带式结构。 - **触摸控制** 按电机独立,释放时可选择刹车或自由滑行,按电机单独设定。 - **双重转向模式。** 直接摇杆控制动力,或者通过闭环控制结合 实时位置反馈保持特定角度,具备自动回正和 失控切断功能。 - **灯光。** 六个灯可独立控制,亮度,刹车灯行为,以及 RGB 状态 LED。 - **遥测。** 电池、倾斜、加速度,以及一个在 剧烈碰撞时切断电机的防撞保护。 - **实时协议日志** — 记录输入和输出的每一个字节。 ## 系统要求 Web Bluetooth:在 **Android、macOS、Windows 或 ChromeOS** 上使用 Chrome 或 Edge。 Safari 和 Firefox 不支持该功能;在 iOS 上,所有浏览器都使用 Safari 的引擎,因此 iPhone 需要像 Bluefy 这样的 Web Bluetooth 浏览器。 需要安全上下文 — HTTPS 或 `http://localhost`。`file://` 无法使用 Web Bluetooth。 ## 自行运行 ``` python3 -m http.server 8000 # then open http://localhost:8000 ``` 可以部署在任何提供静态文件托管的地方。`.vercelignore` 会将测试、 脚本和 MCP 服务器排除在 Vercel 部署之外。 ## 测试 ``` node --test test/*.test.js ``` 针对纯逻辑层进行了 200 项测试:编码器、解码器、控制数学运算、 写入队列、驱动和转向控制器、手柄循环,以及一个 执行每个面板操作的 DOM-stub 冒烟测试。BLE、真实手柄和硬件 行为无法在 headless 模式下运行,已在车模上进行了验证。 ## MCP 服务器 `mcp/` 将 hub 作为工具暴露给 MCP 客户端,复用相同的协议和 控制器模块,并使用 Node BLE 传输代替 Web Bluetooth。运动 工具在构造上受到了时间限制 — 不存在无时间限制的驱动。 **它从未与 hub 通信过。** macOS 会拒绝任何 `Info.plist` 缺少 `NSBluetoothAlwaysUsageDescription` 的进程访问 Bluetooth,而崩溃的 进程是 `node`。详见 `mcp/README.md`。 ## 协议推导过程 通过抓包推导。hub 通过单个 GATT characteristic 使用 LEGO Wireless Protocol 3.0 进行通信;端口是在运行时从 hub 自身的 Hub Attached I/O 消息中发现的,而不是从硬编码表中获取的。 组合驱动帧为十三个字节: ``` 0d 00 81 36 11 51 00 03 00 00 ``` 曾尝试通过四次写入来寻找它,均告失败。最终解决的方法是让 hub 描述其自身的端口模式(`0x21` / `0x22`)— 然后注意到 灯光字段还包含两个初始化命令,hub 要求在 接受任何驱动帧之前必须执行这些命令。此代码的早期版本出于 安全考虑屏蔽了这些精确的字节,这正是之前毫无效果的原因。 参考:[DanieleBenedettelli/TechnicMoveHub](https://github.com/DanieleBenedettelli/TechnicMoveHub) · [LEGO 的协议文档](https://lego.github.io/lego-ble-wireless-protocol-docs/) ## 免责声明 非官方且独立。**按“原样”提供,不提供任何形式的保证** — 您完全自担风险使用。移动的模型可能会损坏自身、 周围环境或阻挡在路线上的人。 LEGO® 和 Technic™ 是 LEGO Group 的商标,该集团并未赞助、 授权或认可此项目。套装名称和编号仅用于标识兼容的 硬件,别无他意。
标签:MITM代理, Web蓝牙, 乐高机械组, 手柄交互, 数据可视化, 机器人控制, 浏览器前端, 物联网控制, 自定义脚本, 蓝牙通信协议