防止蓝牙键盘休眠

防止蓝牙键盘休眠

几分钟不活动(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管理器(右键单击+连接)手动连接键盘,但我可以连接耳机。

答案1

我有相同的键盘,相同的操作系统和相同的问题。对此有很多抱怨,但几乎没有解决方案。

我做了很多研究,我认为最好的方法是将蓝牙适配器设置为键盘专用HID模式。您基本上可以将与键盘的配对“上传”到适配器上。然后,适配器将自行管理与键盘的连接,将其自身显示为系统的常规 USB 键盘。您的 TP-Link 适配器似乎具有应该可以工作的 CSR 8150 芯片组。缺点:该适配器将是任何一个在 HID 模式下或者在常规 HCI 模式下,它充当通用蓝牙适配器。

你可以看到这是一个回购协议有人对另一个键盘做了类似的事情。他们的设置要求您设置虚拟机;我认为这可以更容易完成:

兼容性测试

运行bccmd psget 0x3cd(也许使用 sudo)并查看是否出现错误。如果没有,您的蓝牙适配器应该兼容。我的适配器出现故障(尽管据说有 CSR8150 芯片组)。没有破坏任何东西,但也没有修复它。

提取键盘和适配器 MAC

激活键盘连接后,运行hcitool con以获取键盘的 MAC 地址。接下来,使用 获取蓝牙适配器的 MAC 地址hcitool dev

编辑脚本

将以下脚本(取自链接的存储库并进行修改)保存为文本文件,并将两个 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 加密密码等问题。

相关内容