sewernoodle/nothing_headphones_assistant_button_remapper
GitHub: sewernoodle/nothing_headphones_assistant_button_remapper
将 Nothing Headphones (1) 的语音助手按钮重映射为 Windows 上任意按键的工具,通过蓝牙流量嗅探实现官方软件无法提供的自定义功能。
Stars: 0 | Forks: 0
# Nothing Headphones (1) — 语音助手按钮重映射工具
在 Windows 上实时检测 **Nothing Headphones (1)** 上的按钮按下操作,并
将 **语音助手按钮** 映射为您想要的任意按键。
官方 Nothing X 应用程序允许您将这些按钮重新分配给少数 *媒体*
操作——但它无法将按钮按下转换为任意的键盘按键。此
工具可以做到这一点,这使得语音助手按钮可用于:
- Discord / TeamSpeak 按键说话
- OBS 场景或静音切换
- 游戏按键绑定和宏
- AutoHotkey 触发器
- 辅助功能快捷键
- ……任何对按键做出反应的操作
它通过 **嗅探 PC 与**
耳机之间的 **蓝牙流量** 来工作。

## ⚠️ AI 声明
**本仓库中 100% 的代码由 AI (Claude) 编写**——包括
蓝牙逆向工程、协议解码和
调试。
与 **任何** 代码一样——无论是 AI 编写还是人工编写——在运行前请进行审查。
它是没有混淆且没有网络访问权限的纯文本 PowerShell 脚本,因此
审查起来非常简单。使用风险自负。
## 工作原理
Nothing Headphones (1) 通过 **经典蓝牙 (BR/EDR)** 与主机通信。
不同的按钮使用不同的标准配置文件:
| 按钮 | 协议 | 空中传输内容 |
|---|---|---|
| 语音助手 | 基于 RFCOMM 的 HFP (免提配置文件) | AT 命令 `AT+BVRA=1` / `AT+BVRA=0` |
| 播放 / 暂停 / 下一曲 / 上一曲 | 基于 L2CAP/AVCTP 的 AVRCP `PASS THROUGH` | 操作 ID `0x44`, `0x4B`, `0x4C`, … |
| 音量 | AVRCP `EVENT_VOLUME_CHANGED` 通知 | 新的绝对音量值 (0–127) |
该工具使用 [USBPcap](https://desowin.org/usbpcap/) + [Wireshark](https://www.wireshark.org/)的
`tshark` 捕获 **通往蓝牙适配器的 USB 流量**,
然后匹配 L2CAP 载荷中的已知字节签名:
```
Voice assistant : ...41 54 2b 42 56 52 41 3d 3X... ("AT+BVRA=X")
AVRCP button : ...11 0e 00 48 7c ... (AVCTP + PASS THROUGH)
Volume changed : ...11 0e 0d 48 00 00 19 58 31... (AVRCP volume notify)
```
当检测到语音助手事件时,它会通过
Win32 `keybd_event` API 注入配置的按键。
## 系统要求
- **Windows 10 / 11**
- **一个 USB 蓝牙适配器。** 这是必需的——大多数笔记本电脑内置的蓝牙
芯片不在 USB 总线上,因此 USBPcap 无法看到它们。便宜的通用
适配器(CSR、Realtek 等)即可正常工作。
- 已与该适配器配对的 **Nothing Headphones (1)**。
- 已安装的 **[Wireshark](https://www.wireshark.org/download.html)**,并且在安装过程中勾选了
**USBPcap** 组件(默认已勾选)。
## 设置
1. 安装 Wireshark(保持 USBPcap 选项勾选)。
2. 插入您的 USB 蓝牙适配器并将耳机与其配对。
3. 下载此仓库(点击绿色的 **Code** 按钮 → **Download ZIP**,然后
解压)——或者使用 `git clone` 克隆。
就是这样。无需构建步骤。
## 使用方法
### 托盘应用(推荐)
双击 **`tray.bat`**。系统托盘中会出现一个耳机图标。
点击该图标会弹出一个菜单:
- **Change key…** — 设置语音助手按钮发送的按键
- **Pause** — 暂时停止发送按键
- **Start with Windows** — 在登录时自动启动(启用时显示 ✓)
- **Exit**
您选择的按键将保存到 `%APPDATA%\NothingHeadphonesDetector\config.json`
并在下次启动时恢复。
### 命令行版本
用于调试或查看实时日志,请使用 **`run.bat`**:
```
run.bat :: default key: F13
run.bat -Key A :: send "A"
run.bat -Key "Ctrl+Shift+F13" :: modifier combos
run.bat -Key "Alt+M"
```
它会在事件发生时打印每一个检测到的按钮事件(语音、媒体、音量)。
### 支持的按键
`F1`–`F24`、`A`–`Z`、`0`–`9`、`Space`、`Enter`、`Tab`、`Esc`、`Backspace`,
并可与修饰键 `Ctrl`、`Shift`、`Alt`、`Win` 组合使用(使用 `+` 连接)。
## 语音助手按钮的行为
语音助手按钮是一个 **切换开关**——每次物理敲击都会翻转一次内部
状态并发送一个单一事件(`AT+BVRA=1`,然后是 `=0`,接着是 `=1`,以此类推)。该
耳机 **不会** 发送单独的“释放”事件,因此仅凭该按钮无法实现真正的按键说话
(按住说话)。
因此,此工具每次敲击会发送 **一次按键**,无论该
事件是 `=1` 还是 `=0`。敲击耳机按钮一次 → 一次按键按下。
## 限制
- **需要 USB 蓝牙适配器**——USBPcap 通常无法看到内置的蓝牙无线电。
- **仅在 Nothing Headphones (1) 上验证过。** 其他 Nothing 型号(Ear、Ear (a)、
等)可能使用相同的 AVRCP/HFP 命令,但尚未确认其字节签名。
- **仅限 Windows。** 捕获方法 (USBPcap) 和按键注入
(`keybd_event`) 是 Windows 特有的。
- 下载后首次启动 `run.bat` / `tray.bat` 时可能会触发
SmartScreen 的“Windows 已保护你的电脑”提示——点击 **更多信息 → 仍要运行** 即可。
## 故障排除
**“tshark.exe not found”** — 安装 Wireshark,或者显式传递路径:
`run.bat -Tshark "D:\path\to\tshark.exe"`。
**未检测到事件** — 确保耳机已连接到 *USB 适配器*(而非内置适配器)。如果您有多个 USB 控制器,请强制指定接口:`run.bat -Interface "\\.\USBPcap2"`。
**捕获管道立即退出** — 可能是另一个捕获程序(Wireshark 本身、残留的
`tshark`)正在占用接口。请将其关闭后重试。
## 仓库内容
| 文件 | 用途 |
|---|---|
| `tray.ps1` | 托盘应用程序(UI、按键映射、自动启动) |
| `tray.bat` | 托盘应用的启动器 |
| `detector.ps1` | 命令行检测器(实时记录每个按钮的日志) |
| `run.bat` | 命令行检测器的启动器 |
## 致谢
所有代码均由 AI (Claude) 编写——请参阅本 README 顶部附近的
**AI 声明** 部分。蓝牙协议分析——字节签名、
AVRCP/HFP 命令解码以及 `tshark`/USBPcap 的替代方案——是通过
捕获并解码真实的 Nothing Headphones (1) 的实时流量而得出的。
## 许可证
[AGPL-3.0](LICENSE)
标签:AI合规, AT指令解析, AVRCP协议, Discord按键, HFP协议, L2CAP, Libemu, Linux, Nothing耳机, OBS控制, OpenCanary, PowerShell脚本, RFCOMM, tshark, USBPcap, USB流量捕获, Windows外设工具, Wireshark, 云资产清单, 句柄查看, 开源硬件工具, 快捷键, 按键映射, 推流辅助工具, 无障碍辅助, 游戏宏, 硬件重映射, 系统托盘应用, 耳机自定义键, 蓝牙协议分析, 蓝牙抓包, 语音助手按键, 逆向工程