在 Arch 与 Windows 间共享蓝牙4.0设备

操作步骤见仁见智,本文仅叙述笔者的操作过程(此处蓝牙设备以 Surface Mouse 为例)。

Arch 下

安装协议栈及相关工具,其中bluez提供蓝牙协议栈,bluez-utils提供bluetoothctl工具:

sudo pacman -S bluez bluez-utils

用任意方式配对蓝牙设备,图形化或命令行均可。亦可用刚安装的bluetoothctl,详见ArchWiki

查看本机蓝牙适配器的MAC地址mac1

$ bluetoothctl list
Controller C4:9D:ED:AC:09:B9 user [default]

查看已配对蓝牙设备的MAC地址mac2

$ bluetoothctl paired-devices
Device FC:6B:BA:C9:EC:3D Surface Mouse

查看对应的蓝牙连接信息(mac1mac2均为大写):

sudo cat /var/lib/bluetooth/[mac1]/[mac2]/info

记录其输出(仍以 Surface Mouse 为例):

# /var/lib/bluetooth/[mac1]/[mac2]/info
[General]
Name=Surface Mouse
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;

[IdentityResolvingKey]
Key=703598F990B41C73D1D2CC8E10A33743

[LocalSignatureKey]
Key=21C50AF71141D482B17D3616D26690D4
Counter=0
Authenticated=false

[LongTermKey]
Key=A56BB33F05C81E1EE9FCA4155AE2F1E3
Authenticated=0
EncSize=16
EDiv=58647
Rand=14939592941820431239

[DeviceID]
Source=2
Vendor=1118
Product=2329
Version=306

[ConnectionParameters]
MinInterval=6
MaxInterval=6
Latency=60
Timeout=200

[ServiceChanged]
CCC_LE=2

记录输出后,重启进入 Windows。

Windows 下

Win + R 执行 regedit,打开注册表并定位到\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\[mac1]\[mac2](其中mac1mac2均为小写,中间无:连接)。

按下述映射修改注册表项(注意进制转换):

Address <- mac2

LTK <- LongTermKey.Key
ERand <- LongTermKey.Rand
EDiv <- LongTermKey.EDiv
IRK <- IdentityResolvingKey.Key
CSRK <- LocalSignatureKey.Key

若设备的MAC地址(mac2)变化(例如 Surface Mouse 每次配对后第四位byte会自增),请同时修改\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Devices项。

上述修改完成后,重启蓝牙服务。管理员权限运行powershell并执行(如果你懒可以直接重启 Windows):

Get-Service -DisplayName *Bluetooth* | Restart-Service

至此应该就大功告成了。