為藍牙鍵盤制定 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 規則不起作用的任何想法 - 以及如何製作一個有效的規則?
至少在我的情況下,問題是地址必須是小寫的!因此,在您的情況下,更改
ATTRS{address}=="00:1F:20:76:41:30"
為以下內容:ATTRS{address}=="00:1f:20:76:41:30"
如果不這樣做,我會仔細檢查權限。
此外,udev 應該設置一個您可以使用的 DEVNAME 變數(以及其他變數),因此您實際上並不需要 grep 日誌(另一個可能的權限問題候選者)。為了進一步排除故障,您可以在每次執行腳本時(從腳本)創建一個日誌文件 - 這樣,您將知道腳本是否已執行 - 即是否觸發了 udev 規則,或者錯誤稍後在某個地方。
因此,作者腳本解決方案(在您已經連結的頁面上)是更好的 IMO。我已經對其進行了調整:
權限:
# 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.rules:
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/hidraw1
來獲取正確的地址而不是 hcitool(替換為正確的 hidraw)。它應該匹配,但只是為了仔細檢查(這就是我認為 udev 看到小寫地址的方式)。