macOS 与 BootCamp 双系统共用同一蓝牙设备指引

本文首发于 少数派:macOS 与 BootCamp 双系统共用同一蓝牙设备指引,未经允许,禁止转载。

前言

因为我的部分工作需要在 BootCamp 中完成,手头上也只有一个蓝牙音箱,每次在 macOS 与 BootCamp 中切换时,蓝牙音箱需要重新配对才可连接。故在互联网上搜寻了解决方法。

有趣的是,MacBook 在电脑启动时,会自动连接蓝牙键盘,因此无论在 macOS,还是 BootCamp 中,无需做出修改,便可连接(我使用的是 Logitech K480)。除了 BootCamp 用户,此方法还适用于 Windows To Go 用户。Windows → Windows 的修改方法大致与方法二相同,在此便不做过多阐述。

下面以手上的华为蓝牙音箱为例,其它蓝牙设备连接方法类似。如果已经连接,建议删除配对记录,重新连接。(以下方案理论上在 macOS、Windows、Linux 系统中通用,部分路径可能存在差异)

感谢 @Newlearner365 的热心协助,成功在其电脑上复现。请大家的实际操作中注意备份。


温馨提示

以下操作涉及修改系统文件,食用前请注意 **备份!备份!备份!**因此造成的一切后果,本人皆不负责


便捷方法:借助 HackinTool 导入蓝牙链接密钥至 Windows

Hackintool 是由 @headkaze 开发,用于 Hackintosh 上的一款小工具。此处借助当中的功能,为 Windows 生成蓝牙设备配对密钥的注册表文件。

本人的系统版本与使用工具的版本(macOS:10.14.6;Windows:1909;HackinTool:3.4.0),不同电脑、系统可能会有一定差异。

1、将蓝牙音箱分别在 macOS 与 Windows 中配对

macOS:打开系统偏好设置 → 蓝牙

macOS :打开系统偏好设置 → 蓝牙

Windows:打开系统偏好设置 → 蓝牙

Windows:系统设置 → 蓝牙和其他设备

2、回到 macOS,打开 Hackintool

Hackintool 导出配对密钥

Hackintool 导出配对密钥

进入「工具」选项卡,点击下方的「蓝牙」图标,输入用户密码,随后在桌面上可找到一个注册表文件。

配对密钥

配对密钥

如果有不需要导入的设备,按 Option 键点击屏幕左上角的  图标,进入系统信息 → 蓝牙,找到对应设备的 MAC 地址,在注册表中删去该行即可。

选择需要导入的设备

选择需要导入的设备

3、进入 Windows,关闭蓝牙,导入注册表

进入系统设置,关闭电脑蓝牙与蓝牙音箱。

通过 U 盘或其它方式将注册表文件复制到 Windows 中,双击打开导入注册表。

导入注册表

导入注册表

导入完成后,进入系统设置 - 蓝牙和其他设备,打开电脑蓝牙与蓝牙音箱,此时蓝牙音箱可自动连接至电脑。

连接蓝牙音箱

连接蓝牙音箱


极客方法:手动修改 Windows 下的蓝牙设备密钥

此方法相对复杂,不推荐使用。
以下方法基于 pcBeta - lisai9093:解决 Windows 与 macOS 双系统下的蓝牙设备共用的问题 的教程整合而成。

1、打开终端,拷贝 macOS 中的蓝牙配对密钥

在终端中运行以下命令(命令中的「xw」需要更改为当前的用户名),输入用户密码,回车执行。

# High Siera 以上
sudo defaults read /private/var/root/Library/Preferences/com.apple.bluetoothd.plist

# High Siera 以下
sudo defaults read /private/var/root/Library/Preferences/blued.plist
查询蓝牙设备配对密钥

查询蓝牙设备配对密钥

执行后,找到 Link Keys 节点,拷贝对应设备的密钥。

2、重新排序、转换格式

打开文本编辑器,这里我们需要将密钥转换为 Big Endian 格式。关于大端格式与小端格式的区别可参照 维基百科:字节顺序百度百科:Endian ,此处不做过多讨论(我也不会 x。

重新排序

重新排序

3、导入密钥

进入系统设置 - 蓝牙和其它设备,关闭电脑蓝牙和蓝牙音箱。

下载 PsExec Tool,使用管理员身份在 Power Shell 或命令行中运行。

.\PsExec.exe -s -i regedit
通过提权工具 PsExec 运行注册表编辑工具

通过提权工具 PsExec 运行注册表编辑工具

进入注册表 - HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\,展开当前电脑的蓝牙适配器,找到对应设备,右键 - 修改二进制数据,将刚才重新排序的密钥复制到这里,保存,关闭。

导入配对密钥

导入配对密钥

因在方法一中,已通过注册表修改,故此处的密钥已更改完成。

4、连接

进入系统设置 - 蓝牙和其它设备,打开电脑蓝牙和蓝牙音箱,此时蓝牙音箱可自动连接至电脑。


其它方法

除了 HackinTool,还可使用 BT-LinkKeySync 来导出连接密钥,具体方法可以参照 GitHub 上的指引。不过很不幸,无法在我的电脑成功导出对应的 Plist 文件与注册表。


原理

蓝牙设备的连接过程如上图所示,相关资料来源于 Bluetooth SIG, Inc

蓝牙设备的连接过程如上图所示,相关资料来源于 Bluetooth SIG, Inc

由于蓝牙耳机连接的是同一个蓝牙适配器(同一个 MAC 地址),先前在 macOS 配对时产生的密钥会被后面 Windows 配对的密钥暂时覆盖,因此将 A / B 的密钥覆盖至 B / A 中,便可相互连接。说法可能有误,希望各位带佬斧正,不胜感激。


问答

Q:有没有更简单的方法?

A:可能……没有。在某宝 / 某东购买一个 USB 蓝牙适配器,专门给 BootCamp / WTG 使用,让蓝牙设备将电脑当作新设备连接,但切换系统后,需要在蓝牙设备中手动连接(macOS 用户可通过 OneSwitch 实现蓝牙设备的快速连接)。

OneSwitch 快捷切换

OneSwitch 快捷切换

Q:使用方法一更改密钥时,提示注册表被保护,无法更改?

A:可通过 PsExec 工具提权修改,具体操作参照方法二。

Q:使用的时候存在跳切的问题(在 Windows 中,蓝牙设备会不停地在 「已配对」、「已连接」 状态之间跳动)

A:这个问题我后来试验的时候遇到过。(可能)解决的方法是:
1、分别在 macOS、BootCamp 中取消该蓝牙设备的配对;
2、按照 macOS → BootCamp 的顺序重新配对;
3、使用文中方法修改配对密钥;

如果有问题和建议,欢迎在评论区中留言,我会尽快做出回复,谢谢。


相关链接

工具

教程

技术文档


温馨提示

以上操作涉及修改系统文件,食用前请注意备份。因此造成的一切后果,本人皆不负责。

感谢群友 @SunsetYe@StevApple 的提醒,当修改的是 Windows 中的 Link Key 时(即文中的方法一), macOS 中操作无需关闭 SIP(系统完整性保护)。

虽然在覆盖顺序上,没有过多要求,使用 macOS 的 Link Key 覆盖 Windows 的,或者是使用 Windows 的覆盖 macOS 的,这两种方式皆可使蓝牙音箱在两边顺利连接,但因 macOS 中还涉及到隔空传送、接力和随行功能,一旦出错容易造成以上功能不可用。因此 更推荐按照「读取 macOS、修改 Windows」的顺序 进行。