网站访问量大打不开,做一家公司网站要注意哪些,校园门户网站系统建设方案,天天外链Windows、Linux多系统共享蓝牙设备 近来遇到一个新问题#xff0c;就是双系统共享蓝牙鼠标。因为一直喜欢在Windows、Linux双系统之间来回切换#xff0c;而每次切换系统蓝牙就必须重新配对#xff0c;当然#xff0c;通过网络成功解决了问题。
通过这个问题#xff0c;稍… Windows、Linux多系统共享蓝牙设备 近来遇到一个新问题就是双系统共享蓝牙鼠标。因为一直喜欢在Windows、Linux双系统之间来回切换而每次切换系统蓝牙就必须重新配对当然通过网络成功解决了问题。
通过这个问题稍微增加了一点对蓝牙了理解这也是哪怕没有完全弄懂也能照搬照套成功的原因。因为网上找到的方案后面很多评论说不行可能就是因为生搬硬套而某些细节没注意到吧。
首先要理解为什么蓝牙要配对而普通的无线鼠标以及其他一些无线设备不需要配对。不需要配对的其实非常不可靠单独使用可能感受不到当在很近的距离内使用多套无线鼠标或者无线话筒就会发现相互干扰的现象因为它们都是基于一个简单的标签或者信道来区分而这种划分很容易重复。既便是MAC地址这种有统一分配机构的方案但并不能防止未经分配就使用的情况仍然有可能发生地址冲突。而蓝牙就考虑得比较充分除了同样使用MAC地址这种标识设备的方案外连接协议还增加了配对这个过程也就是通信前产生一个足够随机的密钥来对通信进行加密并不完全依赖有可能会冲突的设备地址。当然设备是可以记住之前协商的通信密钥的并不需要每次使用都要配对。而有些设备可以记住多个密钥所以就可以和多个设备通信虽然不一定是同时但至少可以不用再次配对。像我的车载蓝牙就可以与多个手机配对但同时只能连一个。而一般鼠标、耳机就只能记住一个密钥所以它们和别的设备配对后哪怕与原来配对过的设备连接仍然需要重新配对因为密钥已经变过了。不需要掌握蓝牙协议只需要理解上述这些那么解决多系统共享蓝牙的问题只需要找到配对成功后的密钥信息把它们替换成同一个。当然鼠标、耳机这些设备上的信息没法找但是可以找操作系统记录的然后修改它。
Windows记录蓝牙连接信息的地方毫无疑问是注册表但是这部分键值是隐藏的需要用到PSEXEC这个工具才能够查看和修改。
在以管理员方式找开的命令行窗口下用psexe -si regedit打开注册表编辑器在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys本机蓝牙 MAC鼠标蓝牙 MAC下就可以找到蓝牙鼠标的配对信息。以我现在这个鼠标为例如下
Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\d4f32dd11356]
CentralIRKhex:62,39,a1,04,42,1e,48,07,db,01,d6,85,52,5e,77,3e[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\d4f32dd11356\d10038413433]
LTKhex:81,e3,b2,26,c5,95,2d,ea,8f,25,20,32,16,42,6b,5c
KeyLengthdword:00000010
ERandhex(b):4d,d9,3a,6a,d2,15,70,da
EDIVdword:00001c7e
IRKhex:b9,7b,43,48,d5,27,9d,44,12,5c,70,ac,63,ca,f0,e5
Addresshex(b):33,34,41,38,00,d1,00,00
AddressTypedword:00000001
CEntralIRKStatusdword:00000001
AuthReqdword:0000002d[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\d4f32dd11356\d10238413433]
LTKhex:47,96,a1,e8,41,aa,0f,be,05,7c,e3,5a,f2,6c,f0,55
KeyLengthdword:00000010
ERandhex(b):5e,17,be,55,f0,41,fa,83
EDIVdword:000069b8
IRKhex:99,b6,88,4f,a4,2d,09,45,35,e7,d1,55,66,a0,2d,4b
Addresshex(b):33,34,41,38,02,d1,00,00
AddressTypedword:00000001
CEntralIRKStatusdword:00000001
AuthReqdword:0000002d这里因为配对了两次所以有两条记录Address有一位发生了变化。键路径的最后一段也是所以它们应该是Address的不同表示方式。
而Linux下蓝牙的配对信息是在/var/lib/bluetooth/本机蓝牙 MAC/鼠标蓝牙 MAC下的info文件中同样以我的已经配对好的为例长这样。
[General]
NameRAPOO BT MOUSE
Appearance0x03c2
AddressTypestatic
SupportedTechnologiesLE;
Trustedtrue
Blockedfalse
WakeAllowedtrue
Services00001800-0000-1000-8000-00805f9b34fb;00001801-0000-1000-8000-00805f9b34fb;0000180a-0000-1000-8000-00805f9b34fb;0000180f-0000-1000-8000-00805f9b34fb;00001812-0000-1000-8000-00805f9b34fb;00010203-0405-0607-0809-0a0b0c0d1912;[IdentityResolvingKey]
Key99B6884FA42D094535E7D15566A02D4B[LongTermKey]
Key4796A1E841AA0FBE057CE35AF26CF055
Authenticated0
EncSize16
EDiv27064
Rand-8936758010076850338[PeripheralLongTermKey]
Key15C2CB0F3B2EA50D6D5602053C207479
Authenticated0
EncSize16
EDiv23906
Rand7133880575682007210[SlaveLongTermKey]
Key15C2CB0F3B2EA50D6D5602053C207479
Authenticated0
EncSize16
EDiv23906
Rand7133880575682007210[ConnectionParameters]
MinInterval8
MaxInterval8
Latency44
Timeout300[DeviceID]
Source2
Vendor9354
Product33382
Version1内容很多但只是解决共享问题肯定不必全部改应该只改和密钥相关部分就行了。而且像EncSize明显表示密钥长度的肯定也是不需要改的。所以要改的其实很少。对照两个系统的记录格式容易发现Linux下除了Key类型的是用16进制外其他都是10进制而Windows下都是16进制。所以修改的话就涉及到16进制与10进制的转换。基于Linux命令行的强大修改Linux要方便得多当然反过来也不是不行。总之只需要修改一边与另一边一致就行了。剩下就是找键之间的对应关系了其实也挺简单Linux这边基本上是单词Windows这边是缩写
IdentityResolvingKeyIRK-CentralIRK 意识是身份解析密钥既然是身份那一个设备只应该有一个所以Windows这边还加了Centra表示中心的意思在注册表里面位于主键下而两次配对的信息分别在两个子键下这很好找。LongTermKeyLTK-LTK 这个是长期密钥。LongTermKey这一节下面又有几项目其中的Key对应注册表的LTK就不必说了EncSize-KeyLength 都是密钥长度的意思一边是16一边是10前面已经提过这不需要改EDiv-EDiv 两边名称一样很容易对上。这个是加密算法里面的除数因子应该会不同需要修改Rand-ERand Windows这边多了个E而已也很容易对上。这个是随机数每次配对肯定不同肯定要修改Authenticated 找不到对应这样一个过去式单词应该是表示状态的应该是不需要修改。
Linux下还有PeripheralLongTermKey、SlaveLongTermKey这两节Windows这边都没有不过从名称来看一个是阶段性长期key一个是从长期key应该在配对好之后就不用了所以先不管。其他不管是Windows这边多余的还是Linux多余的看样子也是表示标识或状态的因为关键的就那些东西就先不管了。
下面只剩转换的问题了。
IRK、LTK这两个都是16进制串只剩下逗号分割和字母大小写问题。高手已经写好转换命令了这样echo ‘e3,c0,b2,8e,64,2b,12,16,d8,c2,d7,d4,59,55,92,cd’ | tr a-z A-Z | sed ‘s/[[:punct:]]//g’ERand这个就不是16进制串了就是一个数但是在注册表的类型是hex(b)多了个b表示是大端序所以转换要先反转再换成10进制。16进制转10进制命令为echo $((16#DA7015D26A3AD94D))同理Address也是hex(b)类型也要反序。只不过反序过来直接修改目录不用换10进制MAC地址只有48位多余那两个00明显是不需要的其实反过来再去掉0就跟键路径最后一段一样了。当然在Linux下改目录名要按照Linux原来目录名的格式也就是把字母大写并且用:分隔字节。
基本上就这些了。再具体就变成抄别人的了。在网上查资料的过程中蓝牙协议好像不单只有目前我的鼠标这一种子协议但是道理应该是差不多的只是达到共用的目的的话按照前面的办法应该搞得定。当然前提得知道这些信息记录保存在哪这也是认识并不深但仍然记这一篇的原因吧。