Ubuntu

防止藍牙鍵盤休眠

  • March 8, 2021

幾分鐘不活動(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
  • 3 - 在參數中尋找電源管理。什麼也沒找到。 在此處輸入圖像描述 在此處輸入圖像描述
  • 4 - 編輯 /etc/bluetooth/main.cfg。依然沒有。

配置+重啟:

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 加密密碼工作。

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