蓝牙设备连接双(多)系统(windows和archlinux)


20240614更新,

本教程同样适用于同一台蓝牙设备,同一个主机上的多系统蓝牙连接。

本身具有多蓝牙设备切换功能的键盘(如本教程使用的K380),连接不同设备可以生效,比如我可以同时连接 Windows10,手机。但是现在电脑上装了Windows10,Debian12两个系统,使用K380键盘不同模式蓝牙连接后会导致前一个失效(就是蓝牙1连接Windows10,蓝牙2连接Debian12,后连接的那个会导致第一个失效),我猜测可能是一台机器上的蓝牙有唯一标识,所以键盘就算有多蓝牙支持,连接一个系统后,再切换系统、切换键盘蓝牙模式,也会导致前一个蓝牙失效,这也是写本教程的主要原因。

如果一个设备只装一个系统,且键盘支持多蓝牙切换模式,应该是不会出现这个问题的。当然如果键盘只支持一个模式蓝牙,使用本教程也是可以的。

下面是正文。。。


起因

因为我在一台机器上装了两种不同的系统,windows和archlinux系统,在切换系统的时候,蓝牙键盘和蓝牙鼠标会失效,也就是在其中一个系统配对使用后,切换到另一个系统鼠标和键盘会用不了,为了解决这个问题,我查看了archlinux的wiki,和搜索了其他的经验,发现并不是很好理解。所以自己编写了这篇文章以供自己和后来人参考。

archlinux 官方wiki关于蓝牙的介绍:https://wiki.archlinuxcn.org/wiki/%E8%93%9D%E7%89%99

设备

设备 说明 蓝牙5.0
系统 Windows10 ,Arch Linux /
键盘 罗技k380
鼠标 acer M115

为什么要关注 蓝牙的频率呢? 因为后面的配置文件一样,bt5.0要稍微复杂一下,这个也不用自己查询, 通过archlinux配对蓝牙生成的文件就可以看出来。

步骤

整体步骤总结为:

  1. 先连接蓝牙,在系统内生成配置文件,有多少个系统就先连接多少个。
  2. 修改蓝牙配置文件,确保所有系统中的配置与最后一次蓝牙连接的系统配置一致

温馨提示,修改linux配置更方便。

如果我有两个系统 archlinux、windows10,那么我应该先连接archlinux,再连接windows,记录下windows的蓝牙配置,修改archlinux的蓝牙配置。这样就可以实现同一个蓝牙连接两个系统。

同理,我有三个设备,先连接3个系统生成配置文件,再修改前两次连接的配置。

连接archlinux

我安装了图形化界面,对于配对蓝牙比较方便,这个过程不再演示。

如果你是无图形化界面,请参考 蓝牙连接

配对成功后,打开终端,在 /var/lib/bluetooth 下可以看到 蓝牙设备的mac地址,继续进入蓝牙的mac地址,可以看到已经配对的蓝牙设备的mac地址,每个人的mac地址不一样,请根据自己情况操作。比如我的如下:

在这里插入图片描述

34开头的对应的是我的键盘k380,C8开头的对应的是鼠标m115。让我们来看看他们各自的配置文件是怎样的:

键盘k380

在这里插入图片描述

上图的info内容对应的就是一个蓝牙2.4G的设备,后续的更改只需要修改 [LinkKey]标签下的Key即可。

acer m115鼠标

在这里插入图片描述

通过图中的配置文件就可以看出,配置多了许多,这是蓝牙5.0的配置文件,我们需要修改的内容大概有

1
2
3
4
5
6
7
8
[IdentityResolvingKey]
Key=75543290F900B56B68F2EA4EF34A2DA9

[LongTermKey]
Key=0932311C7550DDE3A0D73A479A521187
EncSize=16
EDiv=35838
Rand=220192556329416

这里面的内容对应windows的内容,查看windows蓝牙注册表对应后,你就一目了然了。

了解了archlinux的配置文件之后,让我们切换系统到windows,查看windows下的对应的配置。

连接windows

在windows的环境下配对蓝牙设备,这个过程不再演示。

修改配置文件

  1. 根据前文的知识,我们需要知道archlinux需要配置的值对应windows下是什么,这个值需要通过注册表查看。
  2. 为了查看这些值,还需要准备一个软件,正常查看注册表是看不到的,还需要下载微软提供的 PsTool ,下载地址为:https://download.sysinternals.com/files/PSTools.zip
  3. 解压软件之后,在解压的目录打开命令行执行下列命令,需要提醒的是,此操作需要管理员权限,建议通过管理员打开powershell,再进入到解压的路径下,比如
1
cd 'D:\Program Files\PSTools'
1
2
# 在PsTool所在目录执行这个
.\PsExec64.exe -s -i regedit.exe
  1. 接着会打开注册表,在注册表的地址找到
1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys 
  1. 在keys下面有子项,子项的名称和数据对应的是键盘的mac地址和linkkey

image-20240614194455161

这是蓝牙2.4G,把mac地址对应的值记录下来,替换archlinux键盘的linkkey的key,只需要重启蓝牙,这样就实现了键盘在双系统的无缝切换。重启蓝牙的命令为 :

1
sudo systemctl restart bluetooth
  1. 对于鼠标,它的项根据我这边的情况,在键盘的项的下面,也就是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys 的子项的子项,点开可以看到一列些熟悉的值,比如 EDIV,IRK,ERand,LTK等值,我们可以把项导出为 .reg文件查看,但是我并不建议导出来,因为archlinux的值是十进制的,windows到处的值是十六进制,后续还要转换进制,稍显麻烦,你细心 的话在注册表里就可以看到转换过的值,也就是括号里面的内容,如图: image-20240614192140389

记录对应名称对应的数据,有括号记录括号的内容,没有括号的记录整条数据。

切换到 archlinux 系统

替换archlinux下对应设备的值和windows一样。

修改LTK,IRK的时候,把小写字母转换成大写。全部替换完成之后,重启蓝牙。

1
2
# 重启蓝牙
sudo systemctl restart bluetooth

查看蓝牙设备是否正常工作。

额外的。archlinux wiki说需要转换,如果不能工作再尝试。

根据我的经验来看,记录windows注册表蓝牙对应值的时候,仔细小心,如果不行,请参考官方蓝牙教程

至此,完结撒花 。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚

使用 Hugo 构建
主题 StackJimmy 设计