前期提要
在近期入手了一块黑爵 AK980max 磁轴键盘,但是发现在 Linux 下无法连接,于是研究了一下有了解决方案
解决方案
给 Linux 添加 WebHID 权限
在 Linux 上,/dev/hidraw* 设备默认以 root 权限创建,普通用户没有办法读取,我们添加一个简单的 udev 规则即可解决
首先 lsusb 获取设备的 Vendor ID 和 Product ID
lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 003: ID 0b05:19af ASUSTek Computer, Inc. AURA LED Controller
Bus 001 Device 004: ID 8087:0029 Intel Corp. AX200 Bluetooth
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 002: ID 0c45:8043 Microdia AK980 MAX
Bus 005 Device 003: ID 373b:10c9 Compx Nearlink Mouse Dongle
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hubBash我这里的 ID 就是 0c45:8043,然后执行这条命令添加
echo 'KERNEL=="hidraw*", ATTRS{idVendor}=="0c45", ATTRS{idProduct}=="8043", TAG+="uaccess"' \
| sudo tee /etc/udev/rules.d/50-keyboard-hid.rules
sudo udevadm control --reload-rules
sudo udevadm triggerBash但是回到 Web 选择设备的时候还是不行,这是为什么呢?
修改网页设备名
回到 Web 时报错如下:
加载键盘3141:32835:KEYBOARD AK980 MAX配置失败: Error: 所有路径都未找到配置文件: 3141-32835-KEYBOARD AK980 MAX
at ge (layout-default-Da_Ywczl.js:2:534749)
at Proxy.N (layout-default-Da_Ywczl.js:2:529083)
at async k (layout-default-Da_Ywczl.js:3:11462)JavaScript由于 Linux 和 Win 逻辑不同,Win 获取的设备名字是 AK980 MAX,但是在 Linux 下是 KEYBOARD AK980 MAX
于是我研究了一下 Web 源码,他在这段函数就是纯硬拼接
async function ge(D) {
const [L,V,Y,Q,me] = D.split(":");
let ye = `${L}-${V}-${Y}...`; // 用设备名拼路径
const b = Z(ye, "ajazz"); // 去找配置文件
}JavaScript然后用油猴脚本拦截修改一下就可以解决了
// ==UserScript==
// @name AJAZZ Linux Fix
// @match https://ajazz.driveall.cn/*
// @run-at document-start
// ==/UserScript==
const origGetDevices = navigator.hid.getDevices.bind(navigator.hid);
navigator.hid.getDevices = async function() {
const devices = await origGetDevices();
devices.forEach(d => {
if (d.productName && d.productName.startsWith("KEYBOARD ")) {
Object.defineProperty(d, 'productName', {
value: d.productName.replace("KEYBOARD ", ""),
writable: false
});
}
});
return devices;
};
const origRequestDevice = navigator.hid.requestDevice.bind(navigator.hid);
navigator.hid.requestDevice = async function(options) {
const devices = await origRequestDevice(options);
devices.forEach(d => {
if (d.productName && d.productName.startsWith("KEYBOARD ")) {
Object.defineProperty(d, 'productName', {
value: d.productName.replace("KEYBOARD ", ""),
writable: false
});
}
});
return devices;
};JavaScript然后保存脚本,即可解决!
我已经反馈给客服了,不知道会不会修(x
发表回复