在 oS 下开心的使用蓝牙遥控器

最近在看网课学习的时候,经常需要来回在视频中跳过一些不必要的废话,或者又需要来会倒着去看一部分内容。早些年买的一个翻页笔虽然有简单的按键切换功能,但是因为按键较少而且不支持长按连续触发,使用体验并不是那么好。然后突然想起还有一个小米电视盒子的蓝牙遥控器,为了把这东西连上并且用的舒服一点稍微折腾了一下,在这里与大家分享折腾过程中的坑与发现。


  • 连接遥控板

    本文中所用的遥控板是小米早期的蓝牙遥控板,板面仅有
    [电源,方向键,确认,主页,返回,菜单,音量 +/-]
    按键不是太多,但是也够用。但是想用就先得把他连上去,连上去,这可就废了一番力气。

    1. 进入遥控板配对模式(主页键 + 菜单键一起按)

    2. 在 PC 上配对

    很显然,如果你看到这就直接去蓝牙菜单里配对,那你肯定会失败,向导会很快告诉你连接失败,并且在 dmesg 里跳出一串关于 SMP 的消息,比如:

    Bluetooth: hci0: unexpected SMP command 0x0b from xx:xx:xx:xx:xx:xx
    

    并且你搜索这段报错还不会直接给你一个很确定的解决方案。也许此时会有人直接去配对手机,手机也会告诉你连接失败,原因是错误的 PIN。那么这意味着跟这个遥控器需要一个 PIN 码吗?其实不然,根据多方查询,发现正确的连接方式是使用 bluetoothctl,步骤如下:

    ~> bluetoothctl
    #启动蓝牙
    [bluetoothctl]# power on 
    #启用并使用默认 agent
    [bluetoothctl]# agent on 
    [bluetoothctl]# default-agent 
    #启用可发现模式
    [bluetoothctl]# discoverable on 
    #开始搜索
    [bluetoothctl]# scan on 
    #手动信任该设备,当设备不需要配对码 (PIN) 时,该选项是必需的
    [bluetoothctl]# trust <MAC address> 
    #配对设备
    [bluetoothctl]# pair <MAC address> 
    #这里重复其实是我怕有问题
    [bluetoothctl]# trust <MAC address> 
    #连接设备
    [bluetoothctl]# connect <MAC address> 
    

    到这里,会有个提示确认的选项,确认后,这个蓝牙遥控器就可以正常使用了,这时查看连接列表,发现连接的是一个 “Xiaomi RC” 的设备,而不是在向导里搜索到的 “小米蓝牙遥控板”,具体为什么,猜测可能跟 BLE 有问题,有兴趣的可以研究一下具体问题所在。

  • 自定义按键

    在后续使用当中啊,发现遥控器上的确认并不能暂停视频,而且这个主页键感觉就很鸡肋。为了让这个遥控器物尽所用,那么自定义按键就势在必行。其实吧,这个遥控器,他看起来是个遥控器,实际上呢他是个 白色遥控器 键盘。自定义键盘的方式就很多了。这里并没有选用 xmodmap而是选用修改 hwdb 的方式,是因为我没找到 xmodmap 怎么指定仅某个设备生效,而 HWDB 可以针对性的修改一个设备的按键映射,不会影响其他设备。修改的步骤如下

    1. 首先安装 evtest

    2. sudo evtest

    3. 在列表中找到需要修改的键盘

    4. 记录设备相关信息,如下,请注意 bus,vendor,product 关键词

      Input device ID: bus 0x5 vendor 0x2717 product 0x3200 version 0x110  
      Input device name: "XiaoMi RC" 
      
    5. 测试需要修改的按键,获得类似如下信息; 第一行的 value 指 SCAN_CODE,第二行 value 指触发状态(1 按下 0 起来)

      Event: time 1606598332.311370, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70028  
      Event: time 1606598332.311370, type 1 (EV_KEY), code 57 (KEY_SPACE), value 1  
      Event: time 1606598332.311370, -------------- SYN_REPORT ------------  
      Event: time 1606598332.551757, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70028  
      Event: time 1606598332.551757, type 1 (EV_KEY), code 57 (KEY_SPACE), value 0 
      
    6. 创建规则文件,路径为 /etc/udev/hwdb.d/ 创建 90-xiaomirc.hwdb 文件

    7. 编辑规则文件,如下

      evdev:input:b0005v2717p3200*    
       KEYBOARD_KEY_70028=space    
       KEYBOARD_KEY_7004a=pause    
      

      第一行用于精确匹配设备,b 后是 BusID,v 后是 VendorID,p 后是 ProductID
      第二,三行将 SCAN_CODE 为 70028(确认键) 和 7004a(主页键) 的按键映射为 space 和 pause,pause 键在 Linux 并没有实际上的用处,这里我用他作为显示桌面的快捷键。
      映射的按键代码可在此查询 keymap-list

    8. 保存,输入以下命令生效

      sudo udevadm hwdb --update 
      sudo udevadm trigger
      
    9. enjoy it! :nerd_face:

  • 简结

    至此,所有操作步骤就完成了,现在的实际体验真的很不错,连接,唤醒都很及时,也不会断连。如果有需求呢还是可以尝试一下,发挥您的想象力,开发更多的用途。本文的相关方法可能也同样适用于部分类似的设备,可以参考。

    因为时间原因,也没法腾出更多的时间去研究其中的各种问题,如果有了解相关细节的大能,请您不吝赐教,留下您的解答;如果文章中有问题,也请各位指出,谢谢!

4赞

啊,学习了

这就去捡起来我吃灰 T1 盒子的遥控器


给可能同样丢失了说明书的朋友:裴讯遥控器配对模式按 home 和音量减

折腾了一下,可能需要注意的几点:

  • hwdb 文件有一定格式要求,需要在键值对(key-value pair)行以一个空格开头,即改为

    evdev:input:b0005v2717p3200*
     KEYBOARD_KEY_70028=space
     KEYBOARD_KEY_7004a=pause
    

    参见 or man hwdb

  • 匹配设备的行的十六进制字母值小写(evtest 所显示的)不行试试大写……

    参见:https://askubuntu.com/a/1145638


emmm 仔细看了看第二个参见我写的他都有写……

…where

  • [bustype], [vendor], [product] and [version] are the ones obtained in the previous step with letters converted to uppercase
  • [scancode] are the ones from the first step with letters converted to lowercase
  • the evdev:… line has no preceding space
  • the KEYBOARD_KEY… lines have exactly one preceding space
1赞

啊…谢谢指正和分享
可能是在 Markdown 调格式的时候把文件格式搞乱了,时间长不用 Markdown 调格式还花了点时间
已经改正问题