防止藍牙鍵盤休眠
幾分鐘不活動(1000 萬?)後,我的鍵盤進入睡眠狀態。我必須按一個鍵,然後,等待 5 秒鐘,然後才能再次使用它…
首先,一些技術細節:
- Linux Mint 20 ulyana - 肉桂 (Ubuntu 20.04)
- TP-Link UB400
- 藍牙 USB 加密狗 Microsoft Surface 人體工學鍵盤
我使用 bluetoothctl 配對了鍵盤。這是我發現輸入密碼的唯一方法,因為 blueman-mananger 沒有要求輸入密碼。
我嘗試了什麼:
- 1 - 檢查 BIOS(主機板:Asus H87-PLUS C2)的 USB 電源管理選項。我什麼也沒發現
- 2 - grub 設置。沒有改變。
命令:
sudo sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-z ]*/& usbcore.autosuspend=-1/' /etc/default/grub sudo update-grub2 reboot cat /sys/module/usbcore/parameters/autosuspend -1
配置+重啟:
AutoEnable=true FastConnectable=true
還有其他想法嗎?藍牙選項?USB 選項?鍵盤選項?也許某種無干擾的腳本 + cron 讓它保持活力?
(我知道“Mint 不是 Linux”,但我希望你們比 askubuntu Stack Exchange 社區更開放:-))
編輯:我連接了藍牙耳機。看起來只有鍵盤在睡著了。耳機保持喚醒狀態。睡眠時,我無法從 blueman manager(右鍵點擊 + 連接)手動連接鍵盤,但我可以連接耳機。
我有相同的鍵盤,相同的作業系統和相同的問題。對此有很多抱怨,但幾乎沒有解決辦法。
我做了很多研究,我認為最好的辦法是將藍牙加密狗設置為HID 模式,將其專用於鍵盤。您基本上會“上傳”與適配器上的鍵盤配對。然後,適配器將自行管理與鍵盤的連接,將自己顯示為系統的正常 USB 鍵盤。您的 TP-Link 適配器似乎有一個應該可以工作的 CSR 8150 晶片組。缺點:該適配器將處於 HID 模式*或正常 HCI 模式**,*它用作通用藍牙適配器。
你可以在這裡看到一個為另一個鍵盤做了類似事情的人的回購。他們的設置需要你設置虛擬機;我認為它可以更容易地完成:
兼容性測試
執行
bccmd psget 0x3cd
(可能使用 sudo)並查看是否出現錯誤。如果不是,您的藍牙適配器應該是兼容的。我的適配器出現故障(儘管據說有 CSR8150 晶片組)。沒有破壞任何東西,但也沒有修復它。提取鍵盤和適配器 MAC
使用活動鍵盤連接,執行
hcitool con
以獲取鍵盤的 MAC 地址。接下來,使用 .獲取藍牙適配器的 MAC 地址hcitool dev
。編輯腳本
將以下腳本(取自連結的 repo 並修改)另存為文本文件,並將兩個 MAC 地址放在第一行:
#!/bin/sh MAC=your_adapter_MAC DEV=hci0 CTRL=your_keyboard_MAC function die() { echo "FATAL: $@" 1>&2 exit 1 } function readKeys() { export Key= EDiv= Rand= export t= $(cat "/var/lib/bluetooth/$CTRL/$MAC/info" | sed -n -e '/^\[LongTermKey/,/^\[/p' | grep -E '^(Key|EDiv|Rand)=[A-F0-9]+$') if [ -z "$Key" ] || [ -z "$EDiv" ] || [ -z "$Rand" ]; then return 1 fi return 0 } function toHex() { echo "obase=16; $1" | bc; } function revbytes(){ local b=""; for ((i=2;i<=${#1};i+=2)); do b=$b${1: -i:2}; done; echo $b; } function rev16(){ local b=""; for ((i=0;i<${#1};i+=4)); do b=$b${1: i+2:2}${1: i:2}; done; echo $b; } function pad() { local b=000000000000000000000000000000000000000000000000000000$1; echo ${b: -$2*2:$2*2}; } function makeToken() { echo $(echo $MAC|tr -d : )1482$(rev16 $(pad $(toHex $EDiv) 2))$(revbytes $(pad $(toHex $Rand) 8))$(rev16 $(pad $Key 16)); } function formatToken() { local b=""; for ((i=0;i<${#1};i+=4)); do b="$b${1: i:4} "; done; echo $b | tr A-Z a-z; } readKeys || die "Could not extract pairing keys" token=$(formatToken $(makeToken)) [ ${#token} -eq 84 ] || die "Token $token has incorrect length" echo "Writing $token to /dev/$DEV" bccmd psload -s 0 /dev/stdin <<-EOF // PSKEY_USR42 &02b4 = $token // PSKEY_INITIAL_BOOTMODE &03cd = 0002 &04b0 = 03c0 03cc 22c0 &04b1 = 01f9 0042 &04b2 = 02bf 03c0 03cc 02bd 000d 000e 215f &04b8 = 0000 &04b9 = 0000 &04ba = 0001 &04f8 = 0000 &04f9 = 0001 &0538 = 100b &0539 = 0001 &053a = 0001 &053b = 0000 0000 0000 &053c = 0002 &053d = 0000 &053e = 0002 0001 000a 0008 0010 0008 0020 0008 0040 0004 0080 0002 0140 0001 0200 0002 EOF if [ $? -ne 0 ]; then die 'write failed :-(' fi bccmd psread | grep '&02b4' echo "Make sure the above output is $token"
執行腳本
以 root 身份執行腳本,並且您的適配器應設置為 HID 模式,不僅可以解決重新連接問題,還可以在 BIOS 啟動時為 HDD 加密密碼工作。