Wasabules/OpenPeats
GitHub: Wasabules/OpenPeats
OpenPeats 是一个开源项目,通过逆向重构的蓝牙协议让用户在桌面和 Android 上无需官方 App 即可控制 SoundPEATS 耳机的各项功能。
Stars: 0 | Forks: 0
# OpenPeats
自由控制 **SoundPEATS** 耳机 —— ANC、均衡器、多点连接、
电池状态 —— 无需使用厂商的移动应用程序。
在 Ubuntu 24.04 环境下,基于 **SOUNDPEATS H3**(固件 `S5_20250605_V0.4.9`)
开发并验证。
## 目录
| 文件夹 | 功能 |
|---|---|
| [`PROTOCOL.md`](PROTOCOL.md) | 协议规范,包含各项的验证状态 |
| [`peatsaudio/`](peatsaudio/) | 桌面应用程序(Wails + Go + Svelte) |
| [`android/`](android/) | Android 应用程序(Kotlin + Jetpack Compose) |
| [`probe/`](probe/) | 用于探索协议的命令行探测工具 |
该协议基于同一份规范分别使用 Go 和 Kotlin 实现了两次。这是刻意为之:
约 350 行逻辑代码的移植成本很低,从而使每个平台都能保留其原生的
传输方式,无需额外的抽象层。`PROTOCOL.md` 仍然是唯一的参考标准。
```
cd android
ANDROID_HOME=$HOME/Android/Sdk ./gradlew :app:assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
```
可复用的核心部分是 [`peatsaudio/internal/peats`](peatsaudio/internal/peats):
纯协议实现(数据帧、操作码、均衡器编码)以及
RFCOMM/SPP 传输,且不依赖任何接口。
## 功能
- 降噪:关闭 / ANC / 通透模式,外加 4 种子模式
(自适应、室内、室外、交通)以及 2 级通透度
- 5/8/10 段参量均衡器,支持曲线调整和
逐频段的 Q 值调节
- LDAC 与多点连接 —— 作为互斥选项呈现,因为
固件在多点连接激活时会切断 LDAC
- 左耳 / 右耳 / 充电盒电量,并在低于阈值时提供桌面通知
- 游戏模式、LE Audio、禁用触控、语音提示
- 读取触控按键映射
- 用于探索的原始数据帧控制台
应用程序会在启动时查询每项功能,并将未响应的部分置灰:
因此它能够自适应仅暴露部分功能子集的设备型号。
## 快速开始
```
cd peatsaudio
wails build -tags webkit2_41 # Ubuntu 24.04 : webkit2gtk-4.1
./build/bin/peatsaudio
```
耳机必须已完成配对并处于充电盒外。
## 平台
协议运行在 RFCOMM(Bluetooth Classic,SPP profile)上。各系统间仅
传输层有所不同;核心逻辑是共用的。
| 系统 | 传输方式 | 状态 |
|---|---|---|
| Linux | `AF_BLUETOOTH` / `BTPROTO_RFCOMM` | ✅ 已在硬件上验证 |
| Android | `BluetoothSocket` (Kotlin) | ✅ 已在硬件上验证 |
| Windows | Winsock `AF_BTH` | ⚠️ 已编写,**从未测试** |
| macOS | IOBluetooth | ❌ 待实现 —— 见下文 |
| iOS | — | 🚫 无法实现 |
**macOS** 是可行的,但需要通过 cgo 桥接到 IOBluetooth,这是一个
使用基于 delegate 的异步 API 的 Objective-C framework:它不像
Linux 和 Windows 那样提供 socket API,因此代码无法完全
照搬另外两种传输方式的实现。
**Android** 运行在支持 `AF_BLUETOOTH` 的 Linux 内核上,但 SELinux 和
权限模型阻止了 NDK 直接使用原始 Bluetooth socket。受支持的
实现路径是 Kotlin 端的 `android.bluetooth.BluetoothSocket`。
**iOS** 无论使用何种 framework 均无法实现:SPP profile 在该平台上
仅限经过 MFi 认证的配件使用,而这些耳机并不符合该条件。
## 逆向工程状态
该协议是通过对官方 Android 应用程序进行分析后重构的,随后
在真实硬件上**逐帧进行了验证**。`PROTOCOL.md` 系统地区分了
在线路上已确认的行为与仍属推测的部分。
目前仍有两点未经验证,并在界面中已作如下标注:
- 触控映射的**写入**(不过读取功能正常);
- Android App 的触控演示模式:命令能收到确认回执,但
按键操作永远不会上报 —— 触控是由固件在本地处理的。
## 法律声明
本项目属于**互操作性**范畴:它允许合法购买的硬件与
厂商未正式支持的操作系统协同工作。出于此目的的
逆向工程受欧洲指令 2009/24/CE(第 6 条)明确允许,在美国则受
17 U.S.C. §1201(f) 保护。
因此,本仓库**不包含也绝不会包含**:
- 官方应用程序的 APK 或其任何组成部分;
- 反编译的代码、smali 或提取的资源文件;
- 厂商的商标、图标或图形元素。
此处发布的所有代码均是基于对观察到的行为描述
独立编写的。这些内容已通过 [`.gitignore`](.gitignore) 排除。
## 开源许可证
MIT —— 见 [`LICENSE`](LICENSE)。
标签:Android应用, EVTX分析, Go, Kotlin, Ruby工具, SBOM分析, Svelte, 日志审计, 桌面应用, 蓝牙控制, 音频设备