花了半个下午看看有没有办法从我的划船机导出实时运动数据

2025-06-09, 星期一, 10:10

MAKE

多年前刷到电视剧《纸牌屋》里有一幕是某人边看新闻边用划船机健身,于是这个想法就深深烙在我脑海里了,以至于直至今日,我虽没完整看过一集纸牌屋,也忘了当初场景里出现的是哪个角色,还是在年初购入了某品牌的磁阻划船机(刚好夹在两次健身器材享受国补之间(不是,哥们))。

不过,除了边划船边看新闻和讲座,要是能更身临其境一点就好了,比如我已经关注 Kayak VR: MirageRoadmap: Rowing machine support 这个议题很久了。

厂商倒是做了个手机 APP,用户运动时会播放预先录制好的视频……还有一种就是 3D 游戏,一打开宣传视频就能回到塞班时代……

那么有没有开放自己动手的选项呢?迪卡侬倒是有 SDK,不过他们家划船机的价格大概是我这款的 3 倍。

鉴于厂商的网站根本打不开(明明他们 5 月又发布了一款跑步机新品),也不知道有没有支持 FTMS 协议。

另外有个侵入式的方案 Open Rowing Monitor,通过磁性传感器捕获飞轮的转动情况,推算桨频、速度、功率等数据,我这还没过保修期,只能作罢。

由于划船机是通过蓝牙与 iOS App 通信的,在 App 里删除配对,再试着用 bleak 扫描蓝牙设备,果然看到了个熟悉的名字。

成功建立连接后监听所有 notify 消息,收到了来自某个主题持续不断的报文,长度固定为 20 个字节。摆弄下划船机,发现报文有变化,停止摆弄过一会后又不变了,但是与初始报文有所不同。

那么,如果厂商只是把数据简单拼接起来传输,没有对报文进行二次加密或混淆的话,是不是可以解读出原始数据?试着将每个字节按小端字节序转换为无符号整型,再用 matplotlib 绘制跟踪曲线。20 个数据指标着实有点看花眼,于是设置当一个数据项 10 次报文都相同时,就不再绘制,直到数值发生变化。

果然世界上确实有这等好事,经过一段时间的运动观察,得出结论:

  • byte[4] 似乎和桨频一致
  • byte[9] 应该是某种计数器,每划一次就会加一
  • byte[11] 似乎和里程有着 10 m 为单位的换算关系

还有一些曲线和做功有明显对应关系,但是机器没有对应的仪表盘,不好判断是什么含义(要不等周一问问客服好了)

(果然还是不行)

接下来就等哪位大佬做个支持输入数据的 3A 划船游戏了(不是),也许给微软模拟飞行做 MOD 是个可行的选项。