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蓝牙, 乐高机械组, 手柄交互, 数据可视化, 机器人控制, 浏览器前端, 物联网控制, 自定义脚本, 蓝牙通信协议