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

树莓派Zero 2 W无法通过程序连接已配对的蓝牙遥控器

树莓派连接Amazon Fire TV蓝牙遥控器的程序问题解决指南

关键问题拆解

你的遥控器已经通过HID协议正常工作(可作为键盘输入),说明蓝牙连接本身无问题。当前程序的错误源于误用底层HCI函数处理已配对的HID设备:

  • hci_inquiry仅扫描未配对设备,已绑定的设备不会被检出,返回num_rsp=0是预期行为
  • 直接调用HCI连接函数会与已存在的HID链路冲突,导致IO错误;普通用户无HCI操作权限,触发权限报错

可行解决方案

方案1:直接读取系统输入设备节点(推荐)

既然遥控器已被识别为输入设备,无需通过蓝牙API交互,直接读取系统输入节点即可获取按键事件:

  1. 定位遥控器对应的设备路径:
    ls /dev/input/by-id/
    
    找到类似usb-Amazon_Fire_TV_Remote-event-kbd的条目,这就是遥控器的输入节点
  2. 赋予普通用户访问权限:
    sudo usermod -aG input $USER
    
    执行后重新登录或重启生效
  3. C语言示例(读取按键事件):
    #include <stdio.h>
    #include <fcntl.h>
    #include <linux/input.h>
    
    int main() {
        int fd = open("/dev/input/by-id/usb-Amazon_Fire_TV_Remote-event-kbd", O_RDONLY);
        if (fd == -1) { perror("open"); return 1; }
    
        struct input_event ev;
        while (read(fd, &ev, sizeof(ev)) == sizeof(ev)) {
            if (ev.type == EV_KEY) {
                printf("Key code: %d, State: %d\n", ev.code, ev.value);
            }
        }
        close(fd);
        return 0;
    }
    

方案2:使用BlueZ D-Bus API(如需蓝牙层面控制)

如果必须通过蓝牙API操作设备,不要用底层HCI函数,改用BlueZ的D-Bus接口:

  • 调用org.bluez.Device1接口查询设备连接状态
  • 针对HID设备,使用org.bluez.HIDDevice1接口进行交互
  • 无需sudo,只要用户属于bluetooth组即可:sudo usermod -aG bluetooth $USER

为什么之前的方法无效?

  • 普通用户无CAP_NET_ADMIN权限,无法执行底层HCI操作,所以报“Operation not permitted”
  • 遥控器已通过HID profile建立连接,底层HCI链路被占用,直接调用HCI连接函数会触发资源冲突,导致“Input/output error”

内容的提问来源于stack exchange,提问作者Barry Fruitman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:12:41