header image

在多系统间共用蓝牙配对信息

蓝牙设备虽然很方便,不需要专门的接收器。但对使用多系统的用户来说,每次使用都需要重新配对十分麻烦,即使设备能够记住多个配对配置,但对于同一台电脑来说,因为系统不同就切换配置也实在是不够优雅。

那么,有没有方法可以在多个系统间共享配对的方法呢?

其实蓝牙配对就是生成了一个随机的key,只要想办法让不同系统里保存的key一致就行了。

因为不同蓝牙版本有所差异,下面分开来说。

在Ubuntu shell里转换key的表示方法

Windows下和Ubuntu下的key的表示方法不一样,所以需要进行转换。下面给出用Shell命令进行转换的方法,可以先略过,后面需要用到再回来看:

  1. 十六进制转为小写并加逗号分隔(Ubuntu –> Windows)(AA5AB39BA3590E11D491B7993610F720替换为你自己的内容):
echo $(echo AA5AB39BA3590E11D491B7993610F720|tr A-F a-f|sed -r 's/(..)/\1\n/g')|sed -r 's/\ /,/g'
  1. 十六进制去除逗号并转换为大写(Windows –> Ubuntu)(09,be,cd,1f,b3,16,d0,e8,e6,7b,24,de,9f,8b,a0,80替换为你自己的内容):
echo 09,be,cd,1f,b3,16,d0,e8,e6,7b,24,de,9f,8b,a0,80|tr a-f A-F|tr -d ,
  1. 十进制转换为8位十六进制(Ubuntu –> Windows)(32527替换为你自己的内容):
echo $(printf "%08x" 32527)
  1. 十六进制转换为十进制(Windows –> Ubuntu)(00007f0f替换为你自己的内容):
echo $((16#00007f0f))
  1. 十进制转换为16位十六进制、逗号分隔并倒序(Ubuntu –> Windows)(885403952940349154替换为你自己的内容):
echo $(printf "%016x" 885403952940349154|sed -r 's/(..)/\1\n/g'|tac)|sed -r 's/\ /,/g'
  1. 十六进制倒序并转换为十进制(Windows –> Ubuntu)(e2,76,bc,41,34,96,49,0c替换为你自己的内容):
echo $((16#$(echo e2,76,bc,41,34,96,49,0c|tac -s ','|tr -d ',')))

蓝牙3.0设备

分别配对设备

首先,我们需要将蓝牙设备分别在不同系统下(下面以Ubuntu和Windows为例)与电脑配对(如果有多配置切换功能的蓝牙设备,需要用同一个配置配对),以生成配置文件。然后在最后配对的系统里获取key,再到另一个系统里写入这个key就可以了。

Ubuntu

获得设备地址

首先,在系统设置中,点击已配对的蓝牙设备,查看设备的地址。

蓝牙设置

获得key

打开终端,用cat查看设备信息:

cat /var/lib/bluetooth/xx:xx:xx:xx:xx:xx/yy:yy:yy:yy:yy:yy/info

其中xx:xx:xx:xx:xx:xx是蓝牙适配器的设备地质,可以在输入的过程中使用Tab补全。yy:yy:yy:yy:yy:yy是上面在设置中看到的设备地址。

你会看到类似如下内容:

[General]
Name=ALT Bluetooth keyboard
Class=0x002540
SupportedTechnologies=BR/EDR;
Trusted=true
Blocked=false
WakeAllowed=true
Services=00001000-0000-1000-8000-00805f9b34fb;00001124-0000-1000-8000-00805f9b34fb;00001200-0000-1000-8000-00805f9b34fb;

[LinkKey]
Key=BD735AA0061A72C57E7FF906FA664538
Type=4
PINLength=0

[DeviceID]
Source=2
Vendor=1452
Product=544
Version=1

其中[LinkKey]下的Key就是我们需要的内容。

修改key

Windows下获得key后(必要时用第1节方法2转换),直接修改/var/lib/bluetooth/xx:xx:xx:xx:xx:xx/yy:yy:yy:yy:yy:yy/info文件中[LinkKey]下的Key的内容即可。如使用vim修改(注意需要root权限):

sudo vim /var/lib/bluetooth/xx:xx:xx:xx:xx:xx/yy:yy:yy:yy:yy:yy/info

Windows

获得设备地址

首先我们还是要获得蓝牙设备地址,可以打开设备管理器,找到蓝牙下的对应设备,双击打开属性,然后在详细信息选项卡中属性下选择设备实例路径,并在下方找到BTHENUM\DEV_yyyyyyyyyyyy&...这样的内容,yyyyyyyyyyyy就是我们要找到的设备地址。

Windows设备管理器

使用系统管理员权限运行注册表编辑器

Windows下蓝牙配置保存在注册表中,并且由于权限较高,直接运行注册表编辑器并不能访问,所以需要一个提权工具PsExec,其为PsTools的一部分,可以在微软Sysinternals下载得到(页面中的Download PsTools Suite)。

下载后解压,假设解压到X:\path\to\PSTools。先在开始按钮上点右键,选择终端管理员,以管理员身份打开终端。然后在终端中执行如下命令:

X:\path\to\PSTools\PsExec.exe -s -i regedit

就可以以系统管理员身份打开注册表编辑器了。

获得key

在注册表编辑器中导航到HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx,其中xxxxxxxxxxxx和上面Ubuntu下类似,是蓝牙适配器地址(Windows下没有冒号:)。然后在右边可以找到设备地址yyyyyyyyyyyyREG_BINARY类型的键,其值就是对应的key了。

可以用下面的命令直接导出(假设导出文件路径为X:\path\to\BT.reg):

X:\path\to\PSTools\PsExec.exe -s -i regedit /e X:\path\to\BT.reg HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys

然后用文本编辑器打开X:\path\to\BT.reg,找到[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx]下的"yyyyyyyyyyyy"=hex:bd,73,5a,a0,06,1a,72,c5,7e,7f,f9,06,fa,66,45,38这样的内容,hex:后面的就是我们需要的key。

修改key

可以直接在系统管理员权限的注册编辑器中直接编辑HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx下的设备地址yyyyyyyyyyyyREG_BINARY类型的键,双击打开然后把所有内容删除,然后把Ubuntu下获得的十六进制key填入即可。

亦或者可以新建一个注册表文件(假设保存为X:\path\to\BT.reg),内容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx]
"yyyyyyyyyyyy"=hex:bd,73,5a,a0,06,1a,72,c5,7e,7f,f9,06,fa,66,45,38

xxxxxxxxxxxx是蓝牙适配器地址,yyyyyyyyyyyy是设备地址,bd,73,5a,a0,06,1a,72,c5,7e,7f,f9,06,fa,66,45,38替换为Ubuntu下获得的key(必要时用第1节方法1转换)。

然后在终端管理员中使用如下命令导入:

X:\path\to\PSTools\PsExec.exe -s -i regedit /s X:\path\to\BT.reg

蓝牙4.0及以后设备

蓝牙4.0设备与3.0设备类似,也是先分别配对设备,然后再从最后配对的系统里获取key,写入另一个系统。只是key的内容有所差异。

Ubuntu

首先用上述第2.2.1节方法获得设备地址。

获得key

和上面第2.2.2节方法一样,也是在/var/lib/bluetooth/xx:xx:xx:xx:xx:xx/yy:yy:yy:yy:yy:yy/info中,只不过内容有所差异,例如:

[General]
Name=BT5.0 KB
Appearance=0x03c1
AddressType=static
SupportedTechnologies=LE;
Trusted=true
Blocked=false
WakeAllowed=true
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;

[DeviceID]
Source=2
Vendor=9639
Product=64020
Version=26369

[IdentityResolvingKey]
Key=09BECD1FB316D0E8E67B24DE9F8BA080

[RemoteSignatureKey]
Key=78077D26D601957D869EDBA71E3E74A2
Counter=0
Authenticated=false

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

[LongTermKey]
Key=AA5AB39BA3590E11D491B7993610F720
Authenticated=0
EncSize=16
EDiv=25496
Rand=4689627501084073450

[PeripheralLongTermKey]
Key=B98F17E1D08C3E23580135A9EFF5A996
Authenticated=0
EncSize=16
EDiv=32527
Rand=885403952940349154

[SlaveLongTermKey]
Key=B98F17E1D08C3E23580135A9EFF5A996
Authenticated=0
EncSize=16
EDiv=32527
Rand=885403952940349154

[ConnectionParameters]
MinInterval=12
MaxInterval=12
Latency=32
Timeout=300

Ubuntu和Windows下键名的对应关系如下(转换方法为上面第1节中所描述方法):

Ubuntu下info文件中的内容 Windows注册表中的键名 Windows –> Ubuntu 转换方法 Ubuntu –> Windows 转换方法
[IdentityResolvingKey]下的Key IRK 2 1
[LocalSignatureKey]下的Key CSRK 2 1
[LongTermKey]下的Key LTK 2 1
[LongTermKey]下的EDiv EDIV 4 3
[LongTermKey]下的Rand ERand 6 5
修改key

Windows下获得key后(必要时用上一节表格中的转换方法转换),直接修改/var/lib/bluetooth/xx:xx:xx:xx:xx:xx/yy:yy:yy:yy:yy:yy/info文件中对应的内容即可。如使用vim修改(注意需要root权限):

sudo vim /var/lib/bluetooth/xx:xx:xx:xx:xx:xx/yy:yy:yy:yy:yy:yy/info

Windows

首先用上述第2.3.1节方法获得设备地址。

获得key

按第2.3.2节方法用系统管理员权限打开注册表编辑器。导航到HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx\yyyyyyyyyyyy,其中xxxxxxxxxxxxyyyyyyyyyyyy即蓝牙适配器地址和设备地址(Windows下没有冒号:)。然后在右边就可以找到类型为REG_BINARYCSRKIRKLTK,以及类型为RED_DWORDEDIV,以及类型为REG_QWORDERandEDIVERand可以直接获取十进制的值用于Ubuntu下修改,免去转换。

同样也可以直接用如下命令导出:

X:\path\to\PSTools\PsExec.exe -s -i regedit /e X:\path\to\BT.reg HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys

然后用文本编辑器打开X:\path\to\BT.reg,找到[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx\yyyyyyyyyyyy]下的对应内容,如:

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\04ed33eaf253\f4ee25fe2468]
"LTK"=hex:aa,5a,b3,9b,a3,59,0e,11,d4,91,b7,99,36,10,f7,20
"KeyLength"=dword:00000010
"ERand"=hex(b):ea,dd,04,93,5d,e7,14,41
"EDIV"=dword:00006398
"IRK"=hex:09,be,cd,1f,b3,16,d0,e8,e6,7b,24,de,9f,8b,a0,80
"Address"=hex(b):68,24,fe,25,ee,f4,00,00
"AddressType"=dword:00000001
"CSRKInbound"=hex:ab,90,f2,4a,89,fe,5e,d1,fc,d4,ea,df,1e,01,14,15
"InboundSignCounter"=hex(b):ff,ff,ff,ff,ff,ff,ff,ff
"CSRK"=hex:d3,1b,8b,98,d5,9a,38,7d,83,b0,d5,5c,2c,50,57,b8
"OutboundSignCounter"=dword:00000000
"CEntralIRKStatus"=dword:00000001
"AuthReq"=dword:0000002d

其中键名后的等号=后即是键的类型(hexdwordhex(b)),紧接着冒号:之后的就是对应的值。

修改key

可以直接在系统管理员权限的注册编辑器中直接编辑HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx\yyyyyyyyyyyy下对应的键的值。对于REG_BINARY类型的CSRKIRKLTK,直接双击打开然后把所有内容删除,然后把Ubuntu下获得的十六进制key填入即可。对于REG_DWORD类型的EDIVREG_QWORD类型的ERand,双击打开后,把基数切换为十进制,然后对应填入Ubuntu下获得的数值即可。

亦或者可以新建一个注册表文件(假设保存为X:\path\to\BT.reg),内容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx\yyyyyyyyyyyy]
"LTK"=hex:aa,5a,b3,9b,a3,59,0e,11,d4,91,b7,99,36,10,f7,20
"ERand"=hex(b):ea,dd,04,93,5d,e7,14,41
"EDIV"=dword:00006398
"IRK"=hex:09,be,cd,1f,b3,16,d0,e8,e6,7b,24,de,9f,8b,a0,80
"CSRK"=hex:d3,1b,8b,98,d5,9a,38,7d,83,b0,d5,5c,2c,50,57,b8

xxxxxxxxxxxx是蓝牙适配器地址,yyyyyyyyyyyy是设备地址,对应的值替换为Ubuntu下获得的key(必要时用第3.1.1节表格中提到的转换方法转换)。

然后在终端管理员中使用如下命令导入:

X:\path\to\PSTools\PsExec.exe -s -i regedit /s X:\path\to\BT.reg

总结

在修改完成后,蓝牙设备可以立即连上使用。

简单流程:

  1. 在一个系统A里按正常配对方式连接蓝牙设备
  2. 到另一个系统B里同样按正常配对方式连接蓝牙设备
  3. 在最后连接的系统B里获取蓝牙设备对应的key
  4. 到系统A里修改对应的key

本方法除了可以用于同一台电脑共用蓝牙设备之外,在不同电脑上、不同系统上都可以共用,只要蓝牙适配器地址和设备地址正确即可,具体方法请自行举一反三。

GRUB2记住最后的启动项

GRUB玩Linux的应该都不陌生,甚至有时候折腾Windows都会用到。

GRUB2在启动时会有一个超时时间,如果时间内不操作就启动到默认选项。但有时候,我们想让它记住最后一次的启动选项,下一次启动时默认进入上一次的选项。

在Ubuntu下很简单,只需要修改/etc/default/grub文件即可。

用编辑软件打开上述文件之后,可以看到如下内容:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

后面省略。

其中GRUB_DEFAULT=0表示默认为第一项,只要改成GRUB_DEFAULT=saved,然后再在下面新加一行GRUB_SAVEDEFAULT=true即可。

保存后,用如下命令更新grub配置即可:

sudo update-grub

重启即可看到效果。

来源:https://www.maketecheasier.com/set-grub-remember-last-selection/#:~:text=Change%20it%20to%20GRUB_DEFAULT%3Dsaved.%20Then%2C%20press%20the%20Enter,to%20save%20and%20%E2%80%9CCtrl%20%2B%20x%E2%80%9D%20to%20exit.

绕过限制安装Windows Subsystem for Android(WSA)

最近,Windows Subsystem for LinuxWSL)和Windows Subsystem for AndroidWSA)都正式上架微软商店了。相信有不少人都已经尝试了。

Windows 11上安装WSA的常规方法

  1. 系统设置时间和语言语言和区域中,将国家或地区改为美国

  2. 系统设置应用可选功能中,点击页面最下面的相关设置下的更多Windows功能,然后在弹出的窗口中找到并勾选Hyper-V虚拟机平台,点击确定,按提示安装并重启电脑。

  3. 点击本文一开始的WSA链接,用浏览器打开商店网页,然后点击网页中的Get in Store app,会打开并跳转微软商店应用,点击安装即可。

突破限制安装的方法

但是对一些较老电脑来说,WSA却有着安装限制,不能从微软商店直接安装。

WSA安装要求

其实方法还是有的,如这篇文章所述,我们只需要下载商店应用的安装包,然后用命令行安装即可。

  1. 打开https://store.rg-adguard.net/ ,这是一个下载微软商店应用安装包的网站。

  2. 在左边的选择框中选择ProductId,在中间的框中填入9P3395VX91NR(这个ProductId其实就在商店链接里),右边的框选择Retail表示下载正式版。然后点击最右边的对勾按钮,页面下方就会出现相关的安装包。

获取安装包

  1. 其他的都是相关的库,只有最下面一个MicrosoftCorporationII.WindowsSubsystemForAndroid才是我们需要的,下载扩展名为msixbundle的文件,保存(如保存到D:\MicrosoftCorporationII.WindowsSubsystemForAndroid_2209.40000.26.0_neutral_~_8wekyb3d8bbwe.msixbundle)。

  2. 右键单击开始按钮,然后单击终端(管理员)

以管理员权限打开终端

  1. 在终端窗口中输入如下命令,回车运行:
    Add-AppxPackage PATH\TO\msixbundle
    

    其中PATH/TO/msixbundle改为上面保存的位置,如D:\MicrosoftCorporationII.WindowsSubsystemForAndroid_2209.40000.26.0_neutral_~_8wekyb3d8bbwe.msixbundle

  2. 等待安装完成。

如何使用WSA

安装好后,我们可以在开始菜单中找到适用于Android™的Windows子系统设置,点击可以打开设置。在设置中启用开发者选项

然后就可以在微软商店中下载apk安装工具,诸如WSATools这样的。在首次使用时,会提示你选择adb保存位置,然后WSA会弹出调试模式的提示,一路确定即可。我们只需要使用工具安装一个第三方应用市场(如酷安),今后就可以像使用安卓设备一样使用WSA了。

据说WSA的性能表现不输现在流行的安卓模拟器,不知微软有没有可能把WSA搬到Xbox上,这样就能大大扩展Xbox的应用规模了。希望吧!

解决Epic Online Services安装出错失败

相信很多人都在Epic Games商城里白嫖了不少游戏了。但有一点令不少强迫症抓狂。

设置上的小黄点

就是这个设置上的小黄点,点进去是提示安装Epic Online Services(以下简称EOS)的。

提示安装Epic Online Services

然而,你点了现在安装之后,等待你的通常是一个大大的错误提示。虽然并不影响使用,但总觉得浑身难受。

怎么办?上网搜了一下,有一篇B站小伙伴的文章提到了一个方法,但试了之后并不能解决,还是出错。

经过一番探索,终于找到了解决方法。

既然是这个EOS出错,那就上EOS的网站上看看。结果是一个提供在Epic上发布游戏的服务的网站,并没有单独的软件包下载。

Epic开发者网站

点击右上角的DEV PORTAL,登录之后,会出现开发者门户。然后看到了一个下载SDK的按钮,也许在SDK有这个包呢?于是下载了SDK。

进入Dev Portal后,下载SDK

SDK类型我选择了C# SDKC SDK应该也是有的,iOS SDKAndroid SDK就不知道了。

版本默认最新,下载之后得到一个zip压缩包。经过一番搜索,果然在压缩包里的SDK/Tools路径下找到了EpicOnlineServicesInstaller.exe文件,解压安装之后,问题终于解决。

希望对各位能有所帮助。

隐藏Ubuntu Dock上的磁盘挂载图标

在Ubuntu的Dock栏上,未挂载的磁盘的磁盘分区会一致在那里占着位置,不仅难看,还可能会误点。如果我要挂载其他分区,我自己会挂载的,根本不需要你多此一举!

当然,隐藏的方法是有的,只要打开终端(可用Ctrl+Alt+T来打开),输入如下命令即可(不需要root权限):

gsettings set org.gnome.shell.extensions.dash-to-dock show-mounts false

恢复也很简单,把最后的false改成true即可。