蓝牙设备在 Win/Linux 双系统下的配对

IT, 其他

我在 X1C 中安装的是双系统,我会根据使用需求切换系统,但是蓝牙鼠标却无法同时和两个系统配对。

原因

每次按下蓝牙鼠标配对按钮,在配对时会生成新的配对密钥。同一台电脑的蓝牙 MAC 地址并不会随着系统发生改变,因此鼠标会认为需要用新生成的密钥替代老的,最终导致先前的连接失败。

解决方案

上面已经分析了出现问题的理由,那么解决方法也就显而易见了:直接将最后一次配对生成的密钥复制给其他系统即可。这里我们最后一次直接使用 Windows 进行配对。配对后,你需要通过蓝牙设置->设备与打印机->你的鼠标,在蓝牙选项卡里找到 MAC 地址。

接下来我们需要从系统注册表获取其他信息。这里我们需要使用微软官方提供的调试工具才能查看这部分信息:

https://docs.microsoft.com/en-us/sysinternals/downloads/pstools

下载完成后使用管理员权限打开命令行,并运行:

psexec -s -i regedit.exe

你可以在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\本机蓝牙适配器MAC\鼠标蓝牙MAC 下找到相关信息。如果你没有看到 CurrentControlSet 可以尝试查看 ControlSet001

对于传统蓝牙设备来说,这里通常只有一个值直接对应 Linux 中的 LinkKey,但是 BLE 设备则会有一串相关的密钥,后文需要用到的是:

  • IRK 对应 Linux 下的 IdentityResolvingKey (十六进制值,字母需要大写)

  • CSRK 对应 Linux 下的 LocalSignatureKey (十六进制值,字母需要大写)

  • LTK 对应 Linux 下的 LongTermKey (十六进制值,字母需要大写)

  • ERand 对应 Linux 下的 Rand (十进制)

  • EDIV 对应 Linux 下的 EDiv (十进制)

如果说 Linux 下未进行过相应的配对,则还需要 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Devices\鼠标蓝牙MAC 下的参数:

  • LERemoteConnParamsIntervalMax 对应 Linux 下 MinInterval

  • LERemoteConnParamsIntervalMin 对应 Linux 下 MaxInterval

  • LERemoteConnParamsLatency 对应 Linux 下 Latency

  • LERemoteConnParamsLSTO 对应 Linux 下 Timeout

记录下这些值以后就可以切换到 Linux 系统中进行下一步操作

Linux 下的蓝牙连接信息存储于 /var/lib/bluetooth/本机蓝牙适配器MAC/鼠标蓝牙MAC/info 如果你还没有连接过,则可以直接新建相关文件夹。例如:mkdir -p /var/lib/bluetooth/50:E0:55:75:6C:EC/F0:A2:16:E5:40:F0 接着,编辑 info 文件。

我鼠标使用的配置文件大概是这样的:

[General]
Name=M585/M590
Appearance=0x03c2
AddressType=static
SupportedTechnologies=LE;
Trusted=true
Blocked=false
Services=00001800-0000-1000-8000-00805f9b34fb;00001801-0000-1000-8000-00805f9b34fb;0000180a-0000-1000-8000-00805f9b34fb;0000180f-0000-1000-8000-00805f9b34fb;00001812-0000-1000-8000-00805f9b34fb;00010000-0000-1000-8000-011f2000046d;

[ConnectionParameters]
MinInterval=6
MaxInterval=9
Latency=44
Timeout=216

[IdentityResolvingKey]
Key=B31054DA983C4E1467A1CE123174ABFC

[LocalSignatureKey]
Key=AF88E3DC47C025D9642FFC2DB9601E22
Counter=0
Authenticated=false

[LongTermKey]
Key=1F78025A3BB0152C1330496A29729EBA
Authenticated=0
EncSize=16
EDiv=37618
Rand=1717945424792556205

[DeviceID]
Source=2
Vendor=1133
Product=45083
Version=7

[ServiceChanged]
CCC_LE=2

根据上面提到的对应关系将参数分别替换即可。最后重启蓝牙服务即可完成连接

sudo systemctl restart bluetooth

参考:

https://unix.stackexchange.com/questions/402488/dual-boot-bluetooth-le-low-energy-device-pairing

https://unix.stackexchange.com/questions/255509/bluetooth-pairing-on-dual-boot-of-windows-linux-mint-ubuntu-stop-having-to-p

, ,
上一篇文章
alpine 3.13 在 Armhf docker 的网络问题
下一篇文章
如何生成 HEIC 图片

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Fill out this field
Fill out this field
请输入有效的电子邮箱地址。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

菜单