浏览器端 WebHID 驱动,用于控制 AJAZZ AK980 V2 三模 RGB 带屏机械键盘(Sonix 0x0C45)。
基于 Ghidra 逆向官方 DeviceDriver.exe 与同系开源协议实现,无需安装官方 Windows 驱动。
| 功能 | USB(0x8009) |
2.4G(0xFEFE) |
|---|---|---|
| 灯光模式 / 颜色 / 亮度 / 速度 / 方向 | ✓ | ✓ |
| 时间同步 | ✓ | ✓ |
| TFT 屏幕 GIF / 图片上传(240×135 RGB565) | ✓ | ✗ |
| 休眠时间 / 按键响应 / 重置 | ✓ | 未逆向 |
| 按键改键 / 宏 | 实验性 | 未逆向 |
- Chrome 89+ 或 Edge(需要 WebHID)
- 页面需通过
http://localhost/https打开(file://不可用) - 键盘使用 USB 有线 或 2.4G 接收器(蓝牙不支持配置)
- 退出官方 AJAZZ 驱动(可能独占 HID 接口)
- 用 Chrome / Edge 打开
index.html(建议本地静态服务) - 点击 「连接键盘」
- 在设备选择器中选中厂商接口(不要选 Keyboard):
- USB:先选
0xFF13控制接口,再选0xFF68数据接口 - 2.4G:选
0xFF60厂商接口(会自动识别 33B 的 MI_03)
- USB:先选
- 连接成功后会自动发送测试灯效,可在左侧切换功能
# 任意静态服务器均可
npx serve .
# 或
python -m http.server 8080若 WebHID 无法枚举厂商接口,可运行本地桥接:
bridge\start-bridge.bat
服务监听 http://127.0.0.1:17321,网页会自动回退使用。
| 接口 | usagePage | 说明 |
|---|---|---|
| MI_03 | 0xFF13 |
Feature Report 65B(64B payload,前缀 0x04)— 控制 |
| MI_02 | 0xFF68 |
Output Report 4097B — 屏幕数据 |
指令序列:START 0x18 → MODE 0x13 → 包体 → FINISH 0xF0(或 SAVE 0x02)。
屏幕:START → IMAGE_CFG 0x72(sub 0x03)→ 4096B 分片(每片 ACK)→ SAVE。
像素格式 RGB565 小端,GIF 头 256 字节,最多 140 帧。不要发送 FINISH 0xF0。
WebHID:sendFeatureReport(reportId, data) 中 reportId 单独传,data 为 64B payload。
| 接口 | usagePage | 说明 |
|---|---|---|
| MI_03 | 0xFF60 |
Output Report 33B(32B payload)— 配置(官方 hid_interface) |
| MI_04 | 0xFF60 |
Output Report 65B — 屏幕(无线不支持) |
无 Feature Report。单包发送,校验和 = 65B 暂存区逐字节累加 → 写入 byte 32。
- 灯效:
05 10 00+ mode/RGB/参数 +AA 55+ checksum - 时间:
0C 10 00+5A+ 日期时间 +AA 55+ checksum
WebHID:sendReport(reportId, 32B payload);Chrome 会补 report ID 拼成 33B。
逆向函数参考:FUN_0044fa90(发送)、FUN_0042b330(灯效)、FUN_00423a50(时间)。
index.html 入口页面
css/style.css 样式
js/app.js UI 逻辑
js/hid.js WebHID 协议层(USB + 2.4G)
js/keyboard.js 键位布局数据(来自 layouts/rgb-keyboard.xml)
js/bridge.js 本地桥接客户端(可选回退)
bridge/ 本地 HID 桥接服务(Python)
assets/ 键盘图 / 示例 GIF
- 蓝牙模式不支持配置,请用 USB 或 2.4G
- 2.4G 不支持屏幕上传(官方驱动同样限制)
- 改键 / 宏 / 逐键 RGB 的 HID 指令仍在逆向中,界面可操作但写入为实验性
- 实验性指令写错时,断电重连或官方驱动通常可恢复
- Chrome WebHID 没有 Device ID(MI_xx)过滤,只能按
vendorId / productId / usagePage / usage
仅供个人学习与自用设备控制。