matiasromero/hyperx-quadcast-colors-utility

GitHub: matiasromero/hyperx-quadcast-colors-utility

一款原生 macOS 菜单栏应用,填补 HyperX QuadCast 2 S 麦克风在 Mac 上缺乏官方 RGB 控制软件的空白。

Stars: 0 | Forks: 0

# HyperX QuadCast 2 S — macOS RGB 控制工具 一款小型、原生的 macOS 菜单栏应用,用于控制 HyperX QuadCast 2 S 麦克风的 RGB LED 灯效。 HyperX NGENUITY(官方软件)仅限 Windows 使用,因此 Mac 用户一直无法在不双系统启动 或运行 Windows 虚拟机的情况下更改麦克风颜色——这款应用填补了这一空白。 **当前范围:** 支持每个区域(上部/下部)设置纯色,亮度为 0–100%。 不支持动画模式(闪烁、循环、波浪、脉冲)——QuadCast 2 S 上这些模式的协议 尚未被解码。 ## 安装 1. 从 **[Releases 页面](https://github.com/matiasromero/hyperx-quadcast-colors-utility/releases/latest)** 下载最新的 `HyperXRGB-x.y.z.dmg`。 2. 打开 DMG 文件,将 **HyperX RGB** 拖入您的 **应用程序 (Applications)** 文件夹。 3. 启动它 —— 图标将出现在 macOS 菜单栏中。 要求 **macOS 14 (Sonoma) 或更高版本**。该应用使用 Apple Developer ID 签名 并经过 Apple 公证,因此 Gatekeeper 会直接放行,不会出现任何 “身份不明的开发者”警告。 ## 使用说明 点击菜单栏图标打开控制面板: - 为 **上部** 区域、**下部** 区域或两者选择一种颜色。 - 将 **亮度** 从 0 调整到 100%。 当您需要自定义颜色时,该应用必须保持运行——一旦主机停止发送 颜色数据包(大约每 150 毫秒一次),QuadCast 2 S 固件将恢复其内置动画。 退出应用程序会使 LED 灯恢复为默认动画。 要在登录时自动启动 HyperX RGB,请将其拖入 **系统设置 → 通用 → 登录项**。 ## 兼容性 | 设备 | 支持 | |-------------------------------------|-----------| | HyperX QuadCast 2 S (USB ID `03f0:02b5`) | 是 | | HyperX QuadCast S (原版) | 否 | | HyperX DuoCast | 否 | 如果您插入了其他 HyperX 设备并且它能正常工作,请提交一个 issue——我们 或许可以通过微小的改动来扩展支持列表。 ## 开发 ### 仓库结构 | 目标 | 位置 | 功能说明 | |---------------------|-----------------------|-----------------------------------------------------------| | `HyperXProtocol` | `Sources/` (库) | 纯 USB 数据包构建器。无 macOS 依赖。 | | `HyperXCore` | `Sources/` (库) | IOKit HID 封装器 + 刷新循环。仅限 macOS。 | | `ValidateProtocol` | `Sources/` (CLI) | 构建器的离线冒烟测试。无需硬件。 | | `HIDProbe` | `Sources/` (CLI) | 测试 CLI:设置颜色几秒钟。 | | `HyperXRGB` | `App/` (Xcode 应用) | SwiftUI 菜单栏应用(最终的 `.app` 包)。 | ### 从源代码构建 需要 macOS 14+、Xcode 15+ 以及 [xcodegen](https://github.com/yonaskolb/XcodeGen) (`brew install xcodegen`)。 ``` xcodegen generate xcodebuild -project HyperXRGB.xcodeproj -scheme HyperXRGB -configuration Release \ -derivedDataPath build clean build open build/Build/Products/Release/HyperXRGB.app ``` 要永久安装本地构建的 `.app`: ``` cp -R build/Build/Products/Release/HyperXRGB.app /Applications/ ``` `.xcodeproj` 位于 `.gitignore` 中——它是在每次构建时由 `project.yml` 重新生成的。 ### 测试 ``` swift run ValidateProtocol # 40 offline protocol checks swift test # 13 unit tests (Swift Testing) ``` ### 连接真实麦克风进行测试 插入麦克风后: ``` swift run HIDProbe ff0000 # red, ~5s swift run HIDProbe 00ff00 # green swift run HIDProbe 0080ff # cyan ``` 当命令结束时,LED 灯会恢复为默认动画——一旦停止发送数据包, 固件就会重新接管控制权。 ## 协议说明 逆向工程自 [Ors1mer/QuadcastRGB](https://github.com/Ors1mer/QuadcastRGB)。 - **HID 设备**:VID `0x03f0` / PID `0x02b5`(USB 产品名称:"HyperX QuadCast 2 S Controller")。 - **音频**:VID `0x03f0` / PID `0x0d84` — 独立的 USB 设备,互不干扰。 - **纯色** 以 7 个 64 字节的数据包发送: - 1 个报头:`[0x44, 0x01, 0x06, 0, …]` → ACK `rsp[0]=0xff rsp[14]=0x44`。 - 6 个数据包 `[0x44, 0x02, packet_index, …]` + RGB 字节 → ACK `rsp[0]=0x45`。 - **上部区域** 从 `packet[0][4]` 开始,**下部区域** 从 `packet[2][46]` 开始。 - 数据包必须 **持续重新发送**(约每 150 毫秒),否则固件 将恢复为默认颜色。 - 在 IOKit 下,数据包通过 `IOHIDDeviceSetReport` 发送,类型为 `kIOHIDReportTypeOutput`。 ### 不明显的坑(对比参考的 C 库) 1. **按 report size 过滤。** "Controller" 暴露了多个具有 相同 VID/PID 的 HID 集合。您必须只打开满足 `MaxOutputReportSize >= 64` 且 `MaxInputReportSize >= 64` 的那个。其他的 (输出大小为 1)不接受 64 字节的数据包。 2. **在每次 SetReport 之间排空输入响应。** 固件会累积 响应,如果未被读取,将停止接受 OUT 传输。如果在 每次发送前没有调用 `drainPendingResponses()`,第二个循环就已经 会返回 `kIOReturnTimeout`。 3. **使用 `kIOHIDOptionsTypeSeizeDevice` 打开** 以避免访问冲突。 ## 发布 发布版本在推送 `vX.Y.Z` 标签时,由位于 [.github/workflows/release.yml](.github/workflows/release.yml) 的 GitHub Actions 工作流进行构建、签名(Developer ID)、公证并发布。 该工作流将构建委托给 [Scripts/build-release.sh](Scripts/build-release.sh),该脚本同样可以在 本地运行。 ### 一次性设置 每位维护者的机器和 GitHub 仓库仅需执行一次。跳过任何 已完成的部分。 #### A. 创建 Developer ID Application 证书 1. **在您的 Mac 上生成证书签名请求 (CSR)。** 打开 **钥匙串访问 (Keychain Access)** → 菜单 **钥匙串访问 → 证书助理 (Certificate Assistant) → 从证书颁发机构请求证书 (Request a Certificate from a Certificate Authority)**。填写您的电子邮件 和姓名,将 **CA Email Address (CA 电子邮件地址)** 留空,选择 **保存到磁盘 (Saved to disk)**,然后 将 `.certSigningRequest` 暂时保存到某个位置。 2. **将 CSR 上传至 Apple。** 访问 [developer.apple.com/account/resources/certificates/list](https://developer.apple.com/account/resources/certificates/list) → 点击 **+** → 选择 **Developer ID Application** → **G2 Sub-CA (Xcode 11.4.1 或更高版本)** → **Continue** → 上传 `.certSigningRequest` → **Continue** → **Download**。双击 下载的 `.cer` 文件以将其安装到 `login` 钥匙串中。 3. **验证证书是否已安装并获取其身份字符串:** security find-identity -v -p codesigning 您应该会看到类似这样的一行: 1) ABCDEF1234567890… "Developer ID Application: Your Name (ABCDE12345)" - 完整的带引号的字符串即为 `SIGNING_IDENTITY` 密钥的值。 - 括号内的 10 个字符的代码是您的 `APPLE_TEAM_ID`。 如果 `find-identity` 返回 0 个有效身份,最常见的原因是 缺少 Apple 中间证书。安装它并重试: ``` curl -O https://www.apple.com/certificateauthority/DeveloperIDG2CA.cer security import DeveloperIDG2CA.cer -k ~/Library/Keychains/login.keychain-db ``` #### B. 将证书导出为 `.p12` 1. 在 **钥匙串访问 (Keychain Access)** 中,选择 **login** 钥匙串和 **我的证书 (My Certificates)** 类别。点击 *Developer ID Application: …* 旁边的展开三角形,以确认其下方嵌套有 私钥——如果没有,导出将不起作用,您需要在 生成 CSR 的同一台 Mac 上重新执行步骤 A。 2. 右键点击证书 → **导出 "Developer ID Application: …" (Export "Developer ID Application: …")** → **文件格式: 个人信息交换** → 另存为 `DeveloperID.p12` 并设置一个强密码(这将作为 `P12_PASSWORD`)。 3. 为 GitHub 密钥编码 `.p12` 文件: base64 -i DeveloperID.p12 | pbcopy 您的剪贴板现在保存了 `BUILD_CERTIFICATE_BASE64` 的值。 #### C. 创建 App Store Connect API 密钥(用于公证) 1. 访问 [appstoreconnect.apple.com](https://appstoreconnect.apple.com) → **用户和访问 (Users and Access)** → **Integrations** 标签页 → **Team Keys** 子标签 (而不是 "Individual Keys")。 2. 点击 **+** → 命名,例如 `Notarization CI` → 权限选择 **Developer** → **Generate**。 3. **立即下载 `.p8` 文件** —— Apple 只允许您执行一次此操作。 将其保存在安全的地方。 4. 在同一页面上,记录: - **Key ID** — 表格行中的 10 字符代码。 - **Issuer ID** — 密钥部分顶部的 UUID 风格字符串。 #### D. 将八个密钥加载到 GitHub 在仓库中:**Settings → Secrets and variables → Actions → New repository secret**。添加以下每一项: | 密钥 | 来源 | |---|---| | `BUILD_CERTIFICATE_BASE64` | 步骤 B.3 中剪贴板的内容 | | `P12_PASSWORD` | 您在步骤 B.2 中设置的密码 | | `KEYCHAIN_PASSWORD` | 任意随机字符串 — 例如 `openssl rand -base64 24` | | `SIGNING_IDENTITY` | 步骤 A.3 中完整的带引号字符串,例如 `Developer ID Application: Your Name (ABCDE12345)` | | `APPLE_TEAM_ID` | 步骤 A.3 中括号内的 10 字符代码 | | `APP_STORE_CONNECT_KEY_ID` | 步骤 C.4 中的 Key ID | | `APP_STORE_CONNECT_ISSUER_ID` | 步骤 C.4 中的 Issuer ID | | `APP_STORE_CONNECT_KEY_P8` | 步骤 C.3 中 `.p8` 文件的完整文本,包括 `-----BEGIN PRIVATE KEY-----` 和 `-----END PRIVATE KEY-----` 行(多行) | ### 首次发布前测试 在打上 `v0.1.0` 标签之前,请在本地进行验证并使用一次性标签测试,以免 CI 失败 记录在您真实的发布历史中。 **1. 本地签名 + 公证演练。** 使用 CI 将使用的完全相同的凭据,在您自己的 Mac 上运行完整流水线: ``` brew install create-dmg export SIGNING_IDENTITY="Developer ID Application: Your Name (TEAMID)" export APPLE_TEAM_ID="TEAMID" export APP_STORE_CONNECT_KEY_ID="KEYID" export APP_STORE_CONNECT_ISSUER_ID="ISSUERID" export APP_STORE_CONNECT_KEY_P8="$(cat ~/Downloads/AuthKey_KEYID.p8)" Scripts/build-release.sh 0.1.0-test ``` 当以 `Built and notarized: dist/HyperXRGB-0.1.0-test.dmg` 结束时, 挂载该 DMG,将应用拖入“应用程序”文件夹,然后打开它。Gatekeeper 应该 会毫无警告地放行。 **2. GitHub Actions 工作流的端到端测试。** 推送一个一次性的 候选发布标签: ``` git tag v0.1.0-rc1 git push origin v0.1.0-rc1 ``` 在 GitHub 上查看 **Actions → Release**。如果它成功执行到 *Create GitHub Release*, 从发布的 Release 中下载 DMG 并安装(最好在 另一台 Mac 上,或者在本地通过 `xattr -d com.apple.quarantine` 剥离 “从互联网下载”标志之后进行)。如果出现任何问题,请进行清理: ``` gh release delete v0.1.0-rc1 -y git push --delete origin v0.1.0-rc1 git tag -d v0.1.0-rc1 ``` 一旦演练通过,您就可以为正式发布打标签了。 ### 发布版本 ``` git tag v0.1.0 git push origin v0.1.0 ``` 该工作流会进行归档、签名、构建 DMG、通过 `notarytool` 公证、 装订票据,并发布附带了 `.dmg` 的 GitHub Release。 自动生成的发布说明基于自上一个标签以来的提交。 要在安装后验证发布是否已正确公证: ``` spctl -a -vv /Applications/HyperXRGB.app # → "source=Notarized Developer ID" xcrun stapler validate /Applications/HyperXRGB.app # → "The validate action worked!" ``` ### 本地演练(无需 Developer ID) 在打标签之前,相同的脚本可以在本地生成一个未签名的 DMG,用于端到端测试打包过程: ``` brew install create-dmg SIGNING_IDENTITY="-" Scripts/build-release.sh 0.1.0-dev # → dist/HyperXRGB-0.1.0-dev.dmg ``` 未签名的 DMG 在另一台 Mac 上打开时会触发 Gatekeeper 警告——这 是预期之内的;请仅在本地测试时使用它们。 ## 超出范围 - 动画模式(需要在 Windows 虚拟机上抓取 NGENUITY 的 USB 数据)。 - 其他 HyperX 麦克风(原版 QuadCast S、DuoCast)。 - 自动更新、遥测。 ## 致谢 协议逆向工程基于 [Ors1mer/QuadRGB](https://github.com/Ors1mer/QuadcastRGB) — 感谢 原作者对数据包结构的记录。 ## 许可证 MIT — 见 [LICENSE](LICENSE)。
标签:Apple Developer ID签名, HyperX, macOS Sonoma, macOS原生应用, QuadCast 2 S, RGB灯效控制, USB设备通信, 二进制发布, 亮度调节, 公证应用, 外设管理, 开源工具, 桌面工具, 硬件协议逆向, 硬件控制, 系统扩展, 菜单栏应用, 跨平台替代品, 音频设备, 麦克风