双系统连接蓝牙设备

前言

这是一篇翻译整合文章

参考一

参考二

问题描述

双系统电脑中, 蓝牙鼠标只能在最后连接的系统上, 之前匹配的系统上失效(匹配但无法连接, 只能从新匹配)

问题成因

当您与设备配对时, 您的蓝牙服务会生成一组唯一的配对密钥. 首先, 您的计算机存储蓝牙设备的MAC地址和配对密钥. 其次, 您的蓝牙设备存储您计算机的MAC地址和匹配密钥. 这通常可以正常工作,但是您的蓝牙端口的MAC地址在Linux和Windows上都是相同的(在硬件级别上设置). 因此, 当您在Windows或Linux中重新配对设备并生成新密钥时, 该密钥会覆盖蓝牙设备上先前存储的密钥. Windows将覆盖Linux密钥, 从而导致linux下鼠标失效, 反之亦然

解决步骤

  1. 蓝牙鼠标连接linux
  2. 蓝牙鼠标连接windows
  3. 下载 PsExec 从 https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec
  4. 导出key, 管理员模式下在刚在下载的文件的解压目录下执行以下命令

psexec.exe -s -i regedit /e C:\BTKeys.reg HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys

打开C:\BTKeys.reg, 文件内容大概长这样

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\7512a3185b2c\84abd4a25ee1]
“LTK”=hex:6c,54,ee,80,40,47,6c,cb,fc,8e,f3,f1,c6,b2,04,9e
“KeyLength”=dword:00000000
“ERand”=hex(b):1e,12,aa,37,39,cc,af,34
“EDIV”=dword:00003549
“CSRK”=hex:38,d7,aa,c1,42,06,31,25,12,b8,5a,6d,c3,90,98,f2

第二行最后那个就是你的设备蓝牙MAC地址, 而倒数第二个就是你的电脑的蓝牙MAC地址

  1. cd /var/lib/bluetooth/{your computer MAC}/
  2. 重命名linux蓝牙鼠标MAC目录, 重命名为windows下的MAC地址(两个地址应该只有一位不一样)
  3. 进入蓝牙鼠标MAC目录, 修改info文件

需要将windows的这个文件内容对应到linux的文件中

  • LTK对应[LongTermKey]下的Key (需要将windows的数据去逗号并全部改为大写)

  • KeyLength对应EncSize (windows下是十六进制值, 转到linux需要转为十进制, 例如如果windows值为10, 则需要将linux的值改为16)

  • ERand进入Rand, 首先需要反向记下ERand值,因此它变为34afcc3937aa121e, 然后将其转换为十进制以获得3796477557015712286

  • EDIV对应EDiv (同样需要将十六进制转十进制)

  • CSRK转为LocalSignatureKey下的Key (大写并且无逗号)

最后linux下info文件里修改部分那一块的数据长下面这样

[LocalSignatureKey]
Key=38D7AAC14206312512B85A6DC39098F2

[LongTermKey]
Key=6C54EE8040476CCBFC8EF3F1C6B2049E
Authenticated=0
EncSize=0
EDiv=13641
Rand=3796477557015712286

  1. 重启电脑