Keyboard

為藍牙鍵盤制定 udev 規則

  • March 10, 2020

我在執行 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 看到小寫地址的方式)。

引用自:https://unix.stackexchange.com/questions/144417