为蓝牙键盘制定udev规则

为蓝牙键盘制定udev规则

我在运行 Debian Wheezy 的笔记本电脑上使用罗技 k810 蓝牙键盘。 (我通过以下方式使键盘工作本指南.)

默认情况下,F1-12 键是多媒体键,除非按下 FN 键。我更喜欢默认按键为 F1-12。

幸运的是这家伙制作了一个反转关键功能的程序。运行该程序可以按照我喜欢的方式获取密钥,并且它可以在重新启动后继续存在。

不幸的是,如果我关闭然后再次打开键盘(以节省电量),该程序将无法生存。

出于这个原因,我试图制定一个 udev 规则来在键盘连接时运行键反转程序。

我一直在尝试上述链接中提出的以下解决方案。到目前为止还不起作用。

andreas@crunchbang:/etc/udev/rules.d$ cat 00-k810.rules
KERNEL==”hidraw*”, SUBSYSTEM==”hidraw”, ATTRS{address}==”00:1F:20:76:41:30”, RUN+=”/srv/scripts/k810.sh %p”

andreas@crunchbang:/srv/scripts$ cat k810.sh
#! /bin/bash
line=`dmesg | grep -i k810 | grep hidraw`
[[ $line =~ (.*)(hidraw+[^:])(.*) ]]
device=${BASH_REMATCH[2]}
/srv/bin/k810_conf -d /dev/${device} -f on

/srv/bin/ 文件夹确实包含密钥反转程序 (k810_conf)。我不知道该程序到底是做什么的,但使用这样的脚本运行它是有效的:

sudo /srv/scripts/k810.sh

所以问题一定是 udev 没有正确检测到设备。如果我这样做的话,我就会得到 MAC 地址:

hcitool scan

...当键盘处于配对模式时。这也是我在 Blueman 中看到的。

udevadm monitor不确定它是否相关,但这是打开键盘时的输出:

KERNEL[31976.490290] add     
/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/bluetooth/hci0/hci0:12/0005:046D:B319.001C
(hid) KERNEL[31976.491464] add     
/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/bluetooth/hci0/hci0:12/input39
(input) KERNEL[31976.491689] add     
/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/bluetooth/hci0/hci0:12/input39/event12
(input) KERNEL[31976.491885] add     
/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/bluetooth/hci0/hci0:12/0005:046D:B319.001C/hidraw/hidraw0
(hidraw) UDEV  [31976.496400] add     
/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/bluetooth/hci0/hci0:12/0005:046D:B319.001C
(hid) UDEV  [31976.497196] add     
/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/bluetooth/hci0/hci0:12/input39
(input) UDEV  [31976.499496] add     
/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/bluetooth/hci0/hci0:12/0005:046D:B319.001C/hidraw/hidraw0
(hidraw) UDEV  [31976.500679] add     
/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.6/1-1.6:1.0/bluetooth/hci0/hci0:12/input39/event12
(input)

关于为什么上述 udev 规则不起作用以及如何制定一个有效的规则有什么想法吗?

答案1

至少就我而言,问题是地址需要小写!因此,根据您的情况,请更改ATTRS{address}=="00:1F:20:76:41:30"为以下内容:

ATTRS{address}=="00:1f:20:76:41:30"

如果这不起作用,我会仔细检查权限。

另外,udev 应该设置一个您可以使用的 DEVNAME 变量(以及其他变量),因此您实际上不需要 grep 日志(权限问题的另一个可能的候选者)。为了进一步排除故障,您可以在每次运行脚本时创建一个日志文件(从脚本) - 这样,您将知道脚本是否完全运行 - 即是否触发了 udev 规则,或者是否出现错误是稍后的某个地方。

因此,作者的脚本解决方案(在您已经链接的页面上)在我看来更好。我已将其调整如下:

权限:

# ls -l /etc/udev/rules.d/50-k810.rules /opt/bin/k810*
-rw-r--r-- 1 root root   106 2014-07-16 19:21 /etc/udev/rules.d/50-k810.rules
-rwxr-xr-x 1 root root   304 2014-07-16 19:39 /opt/bin/k810.sh
-rwxr-xr-x 1 root root 13102 2014-06-07 22:05 /opt/bin/k810_conf

50-k810.规则:

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{address}=="my:k8:10:ad:re:ss" \
 RUN+="/opt/bin/k810.sh %p"

k810.sh:

#!/bin/sh
LOGFILE=/tmp/logfilek810sh.log
echo "RUN: at `date` by `whoami` act $ACTION \$1 $1 DEVPATH $DEVPATH DEVNAME $DEVNAME" >> ${LOGFILE}
echo "Setting F-keys on for your K810!"

if [ "$ACTION" == "add" ];
then
    # configure k810 ($DEVPATH) at $DEVNAME.
    /opt/bin/k810_conf -d $DEVNAME -f on
fi

另外,一件小事:您可以使用udevadm info -a -n /dev/hidraw1hcitool 来获取正确的地址(替换为正确的 hidraw)。它应该匹配,但只是为了仔细检查(这就是我认为 udev 看到小写地址的方式)。

相关内容