# Gymnasticon：将专有健身单车数据转为标准骑行传感器信号

> 一个 Node.js 桥接程序：从官方应用或服务已停用或不开放的健身单车读取功率和踏频，再以标准的低功耗蓝牙 Cycling Power、Cycling Speed and Cadence 传感器及 ANT+ 自行车功率配置文件重新广播，使 Zwift、TrainerRoad、码表和运动手表能够使用这辆单车。作者的开发笔记记录了在厂商关停家用服务后，如何在 Flywheel Home Bike 的蓝牙 UART 服务上解析出其统计数据包；Peloton 支持通过 USB 串口适配器读取单车的数据线，Schwinn IC4 和 Keiser M 客户端则分别解析标准的 Fitness Machine Service 和 Keiser 公开文档中的广播数据。单车与应用的兼容性均为项目报告。

- 类型：案例
- 目标：协议
- 类别：独立重建案例
- 关联：独立重建项目
- 来源复核于：2026-10-20
- 收录于：2026-11-02
- 原始资源：<https://github.com/ptx2/gymnasticon>
- 一手来源：<https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/README.md>
- 目录页面：<https://awesomerea.org/zh/resources/gymnasticon-exercise-bike-bridge-case/>
- 记录 JSON：<https://awesomerea.org/resources/gymnasticon-exercise-bike-bridge-case/record.json>
- 英文版：[English](https://awesomerea.org/resources/gymnasticon-exercise-bike-bridge-case/index.md)

## 使用条件与局限

- 审阅时 GitHub 上最新的发布版本为 v1.4.0，于 2021-02-21 发布，附带 Raspberry Pi SD 卡镜像；npm 上最新版本为 2021-03-24 发布的 1.4.1，所审阅的 main 分支提交（2021-04-21）为所有支持的单车加入了自动识别，至今仍是 main 上最新的提交。README 列出已测试的单车包括 Flywheel、Peloton（需额外线缆）、Schwinn IC4/IC8（即 Bowflex C6）以及 Keiser M3i、M3i-TBT 和 M3iX，LifeFitness IC5 则标为大概率可用；另有一个模拟单车用于测试。
- 需要用户自有的受支持单车，运行时不使用厂商应用、固件或账号。推荐 Raspberry Pi Zero W，已测试的宿主包括 Pi Zero W、3B+ 和 4 上的 Raspbian Buster、macOS 10.14+ 以及 x86-64 上的 Debian Buster。BLE 单车需要支持多角色的蓝牙 4.1+ 适配器，或使用两个适配器；ANT+ 输出需要 ANT+ USB 接收器，Peloton 单车则需要 README 链接中说明的额外串口线缆。
- SD 卡镜像是项目用 deploy/ 中的 pi-gen 脚本自行构建的 Raspbian Buster 系统，使用默认的 pi/raspberry 账号并关闭 SSH；首次启动时会把根文件系统切换为 overlay 并将 boot 分区设为只读，并从 boot 分区读取 gymnasticon.json。手动安装需通过 npm 使用 Node.js 12.16.1+，Linux 上还需 libudev-dev，并通过 cap_net_raw 权限或 systemd 单元访问蓝牙；依赖 abandonware 维护的 noble 和 bleno 库、gd-ant-plus 及 serialport。
- CI 会构建软件包，并在 Node.js 12 和 14 上运行 tape 单元测试；测试以示例数据包覆盖 Flywheel、IC4、Keiser 和 Peloton 解析器、模拟单车和工具函数，不涉及真实单车或训练应用。power-scale 和 power-offset 选项可用来校正功率读数不准的单车。
- 采用 MIT 许可。单车和应用名称归各自权利人所有。

## 一手来源

1. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/README.md>
2. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/CHANGELOG.md>
3. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/package.json>
4. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/flywheel.js>
5. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/peloton.js>
6. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/ic4.js>
7. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/src/bikes/keiser.js>
8. <https://github.com/ptx2/gymnasticon/tree/e142f539c518d6d4ced3abdd587a825b918a9367/src/test>
9. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/.github/workflows/node.js.yml>
10. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/deploy/pi-sdcard/build.sh>
11. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/deploy/pi-sdcard/config>
12. <https://github.com/ptx2/gymnasticon/blob/e142f539c518d6d4ced3abdd587a825b918a9367/LICENSE.txt>
13. <https://github.com/ptx2/gymnasticon/releases/tag/v1.4.0>
14. <https://ptx2.net/posts/unbricking-a-bike-with-a-raspberry-pi>

## 同分区更多条目：协议

- [garmin-ble：Garmin 手表 GFDI 协议的 Python 客户端](https://awesomerea.org/zh/resources/garmin-ble-gfdi-protocol-case/index.md) · 案例
- [bosectl：重建 Bose BMAP 耳机协议](https://awesomerea.org/zh/resources/bosectl-bose-bmap-protocol-case/index.md) · 案例
- [lib-osmo-ble：DJI Osmo Pocket 3 低功耗蓝牙协议库](https://awesomerea.org/zh/resources/osmo-pocket-3-ble-protocol-case/index.md) · 案例
- [DJI MIMO BLE 逆向素材：重建 DJI Osmo 控制协议](https://awesomerea.org/zh/resources/dji-mimo-ble-reveng-case/index.md) · 案例
- [Cat Printer BLE：重建 MXW01 热敏打印机协议](https://awesomerea.org/zh/resources/catprinterble-mxw01-printer-case/index.md) · 案例
- [a0rfid：A0 协议 UHF RFID 读写头的开源驱动](https://awesomerea.org/zh/resources/a0rfid-uhf-reader-protocol-case/index.md) · 案例

## 关于此条目

说明已依据一手来源复核。
原创说明采用 MIT 许可；外部项目、论文与素材保留各自的权利和许可。
