danielweidman/pixmob-ir-reverse-engineering
GitHub: danielweidman/pixmob-ir-reverse-engineering
通过逆向工程 PixMob 手环的红外和射频协议,实现在家控制活动现场分发的手环灯光效果。
Stars: 973 | Forks: 72
# PixMob IR(和 RF!)逆向工程项目
破解 PixMob 红外协议(现在也包括 RF!),以便在家中控制 PixMob 手环。
**本说明文档的大部分内容涉及红外控制的手环,但"rf"文件夹中添加了一些关于 RF 手环的新内容,包括一些功能信号录音。**
***[@jamesw343](https://github.com/jamesw343) 有一个更新的仓库,包含更全面的 IR 协议信息——基本上本 README 中记录的大部分谜团都已[解决](https://github.com/jamesw343/PixMob_IR)!***
***如果你对专注于通过 EEPROM 破解 PixMob 的项目感兴趣,请查看 [@cra0](https://github.com/cra0) 的这个[项目](https://github.com/cra0/Pixmob-IR-Reversing)***
### 如果您不感兴趣完整说明文档,只想点亮您的手环,请直接跳至"[说明](#instructions)"!
https://user-images.githubusercontent.com/44669548/182740123-8e16b0af-327b-44b2-a6bb-12d9a502a1fd.mp4
## 背景
PixMob 手环是 LED 手环,在大型活动中分发给每位观众,这些手环会同步点亮,创造出大规模、分布式的灯光秀。手环会对来自各种固定和移动发射器的红外命令做出反应。这些手环已被多支体育团队(包括超级碗期间)和巡演乐队(如 Coldplay、Shawn Mendes、Taylor Swift、Bad Bunny、The Weeknd 和 Lady Gaga)使用,以利用红外线的视距特性来制作灯光效果,使灯光效果因活动场馆中的物理位置而异。活动结束后,手环有时会被收集以重复利用,但通常观众会带走已处于非激活状态的手环。
此前已有一些工作尝试在活动结束后"重新激活"PixMob 手环,但成功程度有限。某些旧款 PixMob 手环可以通过焊接或拆焊 PCB 上的一个焊盘进入永久运动感应模式,但这不允许手环通过无线方式与其他手环同步控制。[另一个项目](https://jg.sn.sg/ndp-pixmob-1/)能够将自定义固件上传到 PixMob 手环电路板,但这需要拆解手环并使用专用设备,而且没有发布任何红外控制照明的自定义固件。有一个人在[视频](https://www.youtube.com/watch?v=N1cR-x\_0YAw)中展示了能够通过按电视遥控器上的按钮将手环变成几种不同的颜色(巧合地生成了"有效"代码),但电视遥控器的品牌和型号未指定,而且(据我所知)没有出现复现成功的报告。
本项目旨在真正逆向工程生产级 PixMob 手环的 IR 协议,以便像在活动中一样在家中通过红外控制 PixMob 设备。
**硬件说明:**
我们测试了 2014 年至 2021 年间生产的六个不同版本的 PixMob 手环,这些手环来自波特兰开拓者队比赛、超级碗 LIV 以及 Taylor Swift、Coldplay 和 The Weeknd 的演唱会等活动。每个手环都有一个红外接收器、RGB LED 以及伪随机数生成能力和持久存储。某些型号还包含用于运动激活效果的运动传感器。如果您想要更具体的硬件信息或拆解照片,欢迎提交 Issue。公开的 FCC 文件显示,PixMob 活动使用的红外发射器之一使用 940nm 红外光。有证据表明,手环在一段时间不使用后会进入睡眠模式。
**方法:**
在 Coldplay"Music of the Spheres"演唱会和 The Weeknd"After Hours Til Dawn"演唱会期间,使用 Flipper Zero 设备记录了发送给观众佩戴的 PixMob 手环的一些红外命令。后来,Flipper 设备被用于重新传输每个记录的信号到各代 PixMob 手环,并观察它们的反应。在记录的 100 多个信号中,只有 3 个在活动现场外立即对 PixMob 手环产生反应。据此推断,大部分代码用于向手环传输"编程"信息,以告知它们如何对后续的提示信号做出反应。
在最初发现的三个信号中:
- 一个产生缓慢淡出的单次黄色闪烁
- 一个产生快速淡出的单次白色闪烁
- 一个产生非常缓慢的黄色-橙色渐变亮灭效果,但仅在某些时候出现(其余传输保持手环关闭)。
检查并分析了 Flipper 记录的原始红外信号文件。发现红外信号的载波频率为 38 kHz。绘制了每个高低变化之间的时间,产生了如下图的曲线:

通过反复试验,确定信号记录实际上包含多个白色闪烁信号的"副本",并且可以显著裁剪记录长度,同时仍能产生相同的效果。触发白色闪烁效果所需的记录最小片段跨越上图约 6300 个点之间的样本。
从这些曲线中,我们注意到转换间隔集中在 700 微秒的倍数附近。基于这些知识,我们将信号转换为二进制表示,每位代表 700 微秒的时间间隔。*更新:根据专利 US-10863607-B2([PDF 链接](https://image-ppubs.uspto.gov/dirsearch-public/print/downloadPdf/10863607)),我们确定该值实际上可能是 694.44 微秒。*

所有记录的信号(即使在重新传输时没有立即产生效果)都包含相同的"1000000000"起始序列。通过实验,我们确定"1000000000"起始序列在单次发送一个信号且不重复时不是必需的——它仅用于分隔单个红外代码/信号传输(也可能用于"唤醒"非活跃手环,尽管传输任何有效的红外数据包两次也可以实现这一点)。因此,本仓库中的红外信号已移除前导的 1000000000。
有了这些二进制表示,我们编写了一个程序以有针对性的方式"暴力破解"红外信号,在其中我们根据已知信号的推断选择特定的位范围进行暴力破解。这使用带有红外发射器的 ESP32 开发板完成。
通过反复运行暴力破解过程,观察手环上的结果,重新评估要针对的位,我们能够发现许多功能性的红外代码来产生:
- 多种不同颜色和持续时间的闪烁
- 一些渐变亮起或熄灭,一些则突然开关
- 运动激活模式
- 显示颜色或在移动时循环显示彩虹色(持久到电池取出和重新插入)
- 随机颜色效果
- 概率性命令,只会在传输时部分时间点亮手环。这将在活动中用于创建"闪烁"效果,或突出显示随机观众集的效果。
- 多种颜色之间的渐变
- 在两种不同颜色之间闪烁
- 似乎可以调整信号重新传输的频率,从而可以产生不同速度的频闪效果
- 更复杂的效果:
- 手环仅对多次连续传输中的第一次做出反应的信号
- 每次发送时按固定顺序循环显示多种颜色之一的信号
- 手环仅在距离上次发送该信号经过一定时间后才响应的信号
- 使未来的灯光效果在手环上淡入设定颜色然后关闭,直到发送停止信号的信号
- 更改某些效果中使用的颜色的信号,直到发送停止信号
- 一个信号使闪烁效果保持颜色 60 秒
值得注意的是,测试中使用的手环之一对许多命令做出反应,在多种颜色之间闪烁。另一只手环在接收任何信号一段时间后会进入一种模式,每隔几秒闪烁两次红色。据推测,这些模式是基于活动期间发送的额外编程信号进入的,到目前为止,我们尚未发现这些信号是什么或如何使用它们中的大部分。
在审查暴力破解结果时,我们发现一些灯光效果数据包可分为两部分,第一部分指定效果应该是什么颜色,第二部分可选地指定颜色是否应该渐变亮灭,以及是否每次发送代码时每个手环都应显示效果,或者是否应使用随机逻辑来确定是否显示效果。如果省略第二部分,手环将仅短暂显示颜色,无渐变。

**局限性:**
- 由于时间限制,暴力破解过程仅针对少数不同的数据包结构。大多数暴力破解运行针对长度为 39、63 或 73 位的数据包,部分位被硬编码为在其他信号中已看到有效的值。因此,发现的代码列表远非详尽无遗。
- 我们只能可靠地发现能立即对手环产生效果代码。我们知道这些手环在野外使用的方式要复杂得多,涉及在长时间灯光效果之前传输编程/灯光编排信息,然后以某种方式触发这些效果运行。
**后续步骤:**
- 进一步了解红外数据包结构。
- 使文档更加完整。
- 编写一个独立的 Arduino 库,以便在没有计算机的情况下控制手环。
- 编写一个可安装的 Python 库,用于在运行 Python 代码并具有 GPIO 引脚的设备上直接控制手环(例如 Raspberry Pi)。
- 进一步优化暴力破解过程。
- 将摄像头对准手环,自动记录导致效果的信号?
**参考和链接:**
- PixMob Wash 发射器 FCC 文件:[https://fccid.io/2ADS4WASH]()。
4. 在"python_tools/config.py"中设置`ARDUINO_SERIAL_PORT`。如果使用低功耗 Arduino 设备(如 Arduino Nano),还要将`WAIT_BEFORE_SEND`设置为 True。
5. 运行演示脚本。您的 PixMob 设备应该点亮!
使用 demo_single_effect.py、demo_multiple_effects.py 或 demo_multiple_effects_advanced.py。每个文件中都提供了说明。
您也可以使用 demo_effect_repl.py 通过命令行界面进行控制,而不是编辑脚本文件来指定效果(感谢 [@nb-programmer](https://github.com/nb-programmer) 为此做出的贡献)。
相关文件夹中的 README 文件中有更具体的说明。如果需要帮助,欢迎提交 Issue。
### 选项 2:使用 Arduino 和网页界面
如果您不想使用 Python 代码,可以通过 [IvanR3D](https://github.com/IvanR3D) 慷慨创建并托管的网页界面进行控制。您仍然需要按照选项 1 的步骤 1-3 设置 Arduino。
1. 按照"选项 1"的步骤 1-3 设置和编程您的 Arduino。
2. 在 Chrome 中打开演示网页:https://ivanr3d.com/tools/led-wristband/。
3. 按"Connect to board"并在浏览器提示中选择 Arduino 设备。
4. 按"Send"
网页的源代码位于"/www"文件夹中。

### 选项 3:使用 Flipper Zero
如果您有 Flipper Zero 设备并且只想传输一些预定义的信号而无需计算机或 Arduino,请改用此仓库:[https://github.com/danielweidman/flipper-pixmob-ir-codes](https://github.com/danielweidman/flipper-pixmob-ir-codes)。
**更换电池:**
当然,您需要在 PixMob 手环或其他设备中安装有电的电池才能使其工作。如果您是在活动前几天以上收到的手环,很可能需要更换电池。不同类型的手环更换电池的过程不同。有些型号更容易。
- 有些手环有一个圆形电池盖,带有一个凹槽,可以插入硬币并逆时针旋转打开。这些使用 2 节 CR2032 电池。
- 有些手环有一个白色塑料矩形模块,嵌入黑色橡胶手环中。该模块可以通过向外拉两侧的两个卡扣打开。之后,可以通过将笔插入模块底部将电池从顶部推出来取出电池。这些使用两节 CR1632 电池。
- 其他手环可能不幸需要撬开并可能用胶带粘回。
## 贡献
如果您有任何改进建议,或者能够发现任何关于红外数据包结构的新且可操作的见解,欢迎提交 Issue 或 Pull Request。我也很乐意回答关于如何启动和运行项目的任何问题。
标签:DIY电子, IoT安全, LED控制, LED灯光秀, PixMob, RF协议, 云资产清单, 信号处理, 协议分析, 可穿戴设备, 域名收集, 射频通信, 嵌入式系统, 手环控制, 无线协议, 权限提升, 活动设备, 物联网安全, 硬件安全, 硬件破解, 红外通信, 红外遥控, 逆向工具, 逆向工程