手动和自动化实现蓝牙鼠标在windows10和Linux mint20.3Una下无缝切换
最近新买了一个鼠标(锐普Gm90 有线+2.4Ghz无线+蓝牙5.0)替换原来的蓝牙4.0鼠标(Q9 蓝牙4.0+2.4Ghz无线双模),新设备并不能像旧设备一样在两个系统下无缝切换;切换系统必须删除设备重新配对链接。
网上有很多相关的实现,基本原理是修改替换Linux/Windows的配对信息,使两个系统配对信息保持一致,让鼠标完全将其识别为同一匹配设备。但是不同蓝牙版本,配对信息不完全相同,从3.0 -> 4.0就新增了几个参数,而4.0- 5.0是否还有新增参数目前尙不明了,SEO靠前的国内平台大多只有带货的广告帖子,几乎找不到有用的技术分析。我愿称之为开源分享技术上的东亚病夫:)
参考文章:
Linux 与 Windows 双系统共享蓝牙鼠标-南浦月
Bluetooth Pairing on Dual Boot of Windows & Linux Mint/Ubuntu - Stop having to Pair Devices
Dual Boot Bluetooth Pair
本文食用说明
推荐使用Dual Boot Bluetooth Pair仓库的自动脚本进行转换再手动更改,否则你就得手动按照如下步骤完成。
由于蓝牙5.0没有CSRK这一项,所以注释掉bluetooth_fix.py 的84-85行。
dumphive这个项目很老了,我在Linux Mint20.3una上也没编译成功,只能到Windows10下手动去读取了。
在Linux Mint下配对并链接鼠标
此时系统创建了一个配对信息文件
读取Windows下注册表中的配对信息
先切换到Windows10,在windows下重新配对鼠标,使系统自动创建配对信息。
下载 PSTools,使用压缩包中的PsExec/PsExec64.exe 以系统权限打开注册表(理论上如果你能使用别的方式提升权限到系统级也可以试试自己提权。)
psexec64.exe -si regedit
然后就可以去HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\<本机蓝牙 MAC>\<鼠标蓝牙 MAC>
这个路径找自己的蓝牙配对设备信息了。
此处 MAC 地址不带分隔符,并且这里需要系统权限才能访问。以下内容已脱敏QwQ
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\145af*****\d104d9****]
"LTK"=hex:8c,5a,62,4e,62,41,bd,eb,44,f3,3e,e9,de,68,11,40
"KeyLength"=dword:00000010
"ERand"=hex(b):9d,b1,9d,be,42,14,bb,0c
"EDIV"=dword:0000a573
"IRK"=hex:2b,4b,26,b5,7d,7d,03,9e,ce,bf,92,a7,5e,a5,cc,8b
"Address"=hex(b):c0,8a,d1,d9,04,d1,00,00
"AddressType"=dword:00000001
"MasterIRKStatus"=dword:00000001
"AuthReq"=dword:0000002d
蓝牙4.0和5.0配对配置文件参数列表对比
蓝牙5.0(Windows) | 蓝牙4.0(Windows) | 对应Linux下键名 | 转换方式 |
---|---|---|---|
LTK | LTK | [LongTermKey] Key | 十六进制转十进制 |
KeyLength | KeyLength | [LongTermKey] EncSize | 本人设备不需要改动 |
ERand | ERand | [LongTermKey] Rand | 先反转字符串顺序再从十六进制转十进制 |
EDIV | EDIV | [LongTermKey] EDiv | 十六进制转十进制 |
IRK | IRK | [IdentityResolvingKey] Key | 转大写,去掉逗号空格 |
Address | Address | 本人设备不需要改动 | |
AddressType | AddressType | 本人设备不需要改动 | |
MasterIRKStatus | 本人设备不需要改动 | ||
CSRK | [LocalSignatureKey] Key | 转大写,去掉逗号空格。(网上看部分设备有这个,但是我这个就没有) | |
OutboundSignCounter | 本人设备不需要改动 | ||
AuthReq | AuthReq | 本人设备不需要改动 |
回到Linux下修改蓝牙配置信息
Linux 下蓝牙设备的配对信息存储在 /var/lib/bluetooth/<本机蓝牙 MAC> 目录下,
注意,这里的MAC地址带:,手动输入需要转义\建议在终端里TAB自动补全。进入此处目录需要root权限,可以直接在root用户下操作。
接下来按照对应关系修改配置文件,如果不知道转换
操作完成后,仍然无法正常链接,仔细观察蓝牙地址,我发现Windows下Gm90鼠标的蓝牙MAC地址竟然有一位和Linux下的配置文件写的不同!这一位数字似乎是累加,我先在Linux下链接鼠标一次是03,到了Windows10下再重新配对就变成04!
Linux Mint下 MAC:D1:03
:D9:::**
Windows10 下 MAC: D1:04
:D9:::**
是不是发现了什么?我所参考的文章里和网上的一些案例里都常常出现设备MAC地址在重新配对后某一位出现变动的情况。
所以修改Linux下蓝牙设备配置文件所在目录名称和Windows10下保持一致。
最后sudo systemctl restart bluetooth
打开蓝牙,Linux Mint下Gm90自动正常链接,大功告成!
后记:
2022年5月21日 5点38分
显然我已经熬夜到第二天早上了,熬夜过程中发现了自动读取指定导出好的注册表文件并转换的工具,也就是
dual-boot-bluetooth-pair这个仓库,尽管过时,但是依旧十分有效。我必须要说,当你用中文在搜索引擎上找不到你想要的答案,请用英语,哪怕语法有错误。(语法是中国人发明的,即使不按照语法输入语句,外国人一样能知道你在说什么),这个工具和一半的内容参考来自我搜索:Windows Linux double systeam BLE
这串关键词
看完本文,建议去看看Bluetooth mouse (简体中文) 这篇Archlinux的wiki同样适用其他发行版,介绍了对于蓝牙鼠标的配置和故障排除步骤。
早上6点18分更新:
蓝牙鼠标突然断开了,原因不明可能仍然需要重新配置。重启蓝牙不管用,依旧无法链接,重启系统之后恢复正常工作了。
2022年6月19日3:00更新:
我发现蓝牙鼠标刚开始链接上移动会有明显卡顿感,但是使用一段时间后就没那么卡顿了,有点怪,仿佛链接后得先自动磨合一会儿。