windows/linux双系统共享蓝牙设备
windows/linux双系统共享蓝牙设备
linux下操作
首先启动linux系统,按正常方式连接蓝牙设备,并确认蓝牙设备可以正常使用。
通过蓝牙管理界面记录蓝牙设备的MAC地址,记为$device_addr
。
查看蓝牙设备配置信息
打开终端,使用sudo su
作为root用户,然后cd到/var/lib/bluetooth
。
此时目录下应有一个以设备蓝牙适配器的MAC地址命名的目录,记为$adapter_addr
。
cd进入/var/lib/bluetooth/$adapter_addr/$device_addr
,目录下应有一个info文件,使用vim或cat查看文件内容。
通过general部分的name可以确认是否是需要共享的蓝牙设备。
|
|
按照文件后面的内容Key类型不同,需要区分不同的设备类型。
情况一、后面只有[LinkKey]
|
|
情况二、后面有[IdentityResolvingKey]、[LongTermKey]
等多项
|
|
这种情况说明你的蓝牙设备属于低功耗蓝牙设备(BLE)
按照上述情况不同,后续需要进行不同的操作。
windows下操作
重启到windows,在windows下重新配对蓝牙设备,并确认蓝牙设备可以正常使用。
查看注册表蓝牙信息
直接运行注册表编辑器权限不够,需要通过PSExec来运行。
先下载PSTools并解压,使用管理员权限打开Powershell并cd到解压后的PSTools文件夹。
使用下述指令打开注册表编辑器(如果杀毒软件有拦截选择放行):
|
|
定位到[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\$adapter_attr]
,其中$adapter_attr
是之前得到的蓝牙适配器MAC地址。
如果没有CurrentControlSet,可以找ControlSet001。
提取Key
情况一、需要[LinkKey]
查看$adapter_attr
注册表项本身存储的数据,应该如下所示:
|
|
MasterIRK应当是都存在的键,而在其他键中需要寻找一个以之前获取的蓝牙设备的MAC地址命名的键,并通过注册表的导出功能导出为文件以备后续使用。
情况二、需要[IdentityResolvingKey]、[LongTermKey]
等多项
对于BLE设备,其Key信息以子项形式存储。在$adapter_attr
的子项中寻找与之前获取的$device_attr
,并通过注册表导出功能导出为文件以备后续使用。
|
|
MAC地址变化问题
部分蓝牙设备在windows下重新配对之后MAC地址会发生变化,例如+1.此时需要以新的MAC地址为准。
应用Key到linux
接下来我们要做的就是将提取的Key信息写入到linux下的配置文件中,使得linux无需再次配对能够重新直接连接蓝牙设备。
更新MAC地址
重启到linux,同样以root用户cd /var/lib/bluetooth/$adapter_addr/
。
如果在windows下重新连接后设备的MAC地址发生了变化,此时需要更改linux原先存储的MAC地址。
|
|
如果之前MAC地址没变,则不需要这一步。
更新Key
用编辑器打开配置文件:
|
|
然后根据下述情况修改Key。
情况一、[LinkKey]
注册表中$adapter_attr
注册表项中存储的以$device_attr
为键的数据的值就对应info文件中[LinkKey]
项下的Key字段。
从注册表导出文件中获取的信息格式如下所示:
|
|
可以通过如下bash命令转换为大写并去除逗号,输出为需要的格式(其他的shell可能不兼容):
|
|
将得到的结果替换info文件中的[LinkKey]
项下的Key字段即可。
情况二、[IdentityResolvingKey]、[LongTermKey]
等多项
下表展示了注册表键对应info中数据的关系:
注册表键 | info中项 | 如何转换 |
---|---|---|
LTK | [LongTermKey]-> Key | 去掉逗号,全大写 |
ERand | [LongTermKey]-> Rand | 去掉逗号,转为十进制 |
EDIV | [LongTermKey]-> EDiv | 转为十进制 |
IRK | [IdentifyResolvingKey]->Key | 去掉逗号,全大写 |
CSRK | [LocalSignatureKey]->Key | 去掉逗号,全大写 |
在少部分情况下ERand需要进行字节逆序后再转为十进制。通常不必要。
重启蓝牙服务
在root下systemctl restart bluetooth
。
如果系统托盘图标有蓝牙开关,将蓝牙开关关闭之后再重新打开。
检查设备连接
开启蓝牙设备,此时应当无需配对也能直接连接到linux。