You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Node.js获取2.4GHz键盘和鼠标的电池电量?

解决思路与修正方案

1. 错误原因拆解

LIBUSB_ERROR_INVALID_PARAM本质是USB控制传输的参数不符合设备要求,你的代码里有几个核心问题:

  • 接口号硬编码错误:直接用claimInterface(1),但Razer无线接收器的可用接口号不一定是1,得先查设备实际接口列表。
  • 控制传输参数不匹配:Razer设备有专属的USB指令规范,你用的request:0x09、value:0x300和Basilisk Ultimate的电量查询指令不匹配。
  • 无线设备逻辑差异:你连接的是Basilisk Ultimate的接收器,和有线设备的指令逻辑不同,且Windows下访问USB需要管理员权限。
  • 未处理异步错误:异步操作没加完整的try/catch,导致出现未处理的Promise拒绝。

2. 代码修正步骤

步骤1:先确认设备的正确接口

打开设备后先打印接口信息,找到支持HID功能的接口:

if (device !== undefined) {
    await device.open();
    // 打印所有接口,确认正确的接口号
    console.log('设备接口列表:', device.configurations[0].interfaces);
    // ...后续操作
}

根据输出调整claimInterface的参数,比如大部分Razer接收器的HID接口号是0。

步骤2:使用Razer规范的电量查询指令

Razer设备的电量需要用厂商专属的控制指令查询,且要通过controlTransferIn读取返回数据:

// 替换原来的controlTransferOut代码
try {
    await device.open();
    if (device.configuration === null) await device.selectConfiguration(1);
    await device.claimInterface(0); // 用实际接口号替换

    // 发送电量查询指令并读取返回
    const result = await device.controlTransferIn({
        requestType: 'vendor',
        recipient: 'device',
        request: 0x02, // Razer电量查询指令码
        value: 0x00,
        index: 0x00
    }, 64); // 读取64字节数据

    // 解析电量:通常返回数据的某几位对应电量百分比
    const batteryLevel = result.data.readUInt8(2); // 示例,需根据实际设备调整
    console.log('鼠标电量:', batteryLevel + '%');
} catch (err) {
    console.error('查询失败:', err);
} finally {
    // 释放资源
    await device.releaseInterface(0);
    await device.close();
}

步骤3:处理权限与设备兼容性

  • 运行Electron应用时右键选择以管理员身份启动,Windows下访问USB设备必须要有管理员权限。
  • NuPhy Halo96键盘的电量查询逻辑和Razer不同,这类机械键盘通常通过HID报告获取电量,建议用node-hid库读取HID报告,或者参考NuPhy社区的现有方案。

步骤4:完善错误捕获

给所有异步操作加上try/catch,避免未处理的Promise拒绝:

const showDevices = async () => {
    try {
        // ...原有的设备枚举代码
        let device;
        try {
            device = await webusb.requestDevice({
                filters: [{ vendorId: 5426, productId: 136 }]
            });
        } catch (err) {
            console.log('未选中设备:', err);
            return;
        }

        if (device) {
            try {
                // 设备操作逻辑
            } catch (deviceErr) {
                console.error('设备操作失败:', deviceErr);
            }
        }
    } catch (err) {
        console.error('整体流程错误:', err);
    }
};

3. 更简单的替代方案

如果不想深入USB指令细节,可以用现成的工具库:

  • Razer设备:用razer-cli的Node.js封装,直接调用API获取电量,无需手动写USB指令。
  • NuPhy键盘:检查NuPhy是否提供官方工具或SDK,或者用node-hid库读取HID报告解析电量。

内容的提问来源于stack exchange,提问作者Fadi Amoudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:27:41