Maj*_*ggs 7 keyboard udev bluetooth
我在运行 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
Run Code Online (Sandbox Code Playgroud)
/srv/bin/ 文件夹确实包含密钥反转程序 (k810_conf)。我不知道该程序究竟做了什么,但是使用这样的脚本运行它是有效的:
sudo /srv/scripts/k810.sh
Run Code Online (Sandbox Code Playgroud)
所以问题必须是 udev 没有正确检测到设备。如果我这样做,我会得到 MAC 地址:
hcitool scan
Run Code Online (Sandbox Code Playgroud)
... 当键盘处于配对模式时。这也是我在 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)
Run Code Online (Sandbox Code Playgroud)
关于为什么上述 udev 规则不起作用的任何想法 - 以及我如何制作一个有效的规则?
至少就我而言,问题是地址需要小写!因此,根据您的情况,请更改ATTRS{address}=="00:1F:20:76:41:30"
为以下内容:
ATTRS{address}=="00:1f:20:76:41:30"
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,我会仔细检查权限。
另外,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
Run Code Online (Sandbox Code Playgroud)
50-k810.规则:
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{address}=="my:k8:10:ad:re:ss" \
RUN+="/opt/bin/k810.sh %p"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
另外,一件小事:您可以使用udevadm info -a -n /dev/hidraw1
hcitool 来获取正确的地址(替换为正确的 hidraw)。它应该匹配,但只是为了仔细检查(这就是我认为 udev 看到小写地址的方式)。