Windows、Linux多系统共享蓝牙设备

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]
"CentralIRK"=hex: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]
"LTK"=hex:81,e3,b2,26,c5,95,2d,ea,8f,25,20,32,16,42,6b,5c
"KeyLength"=dword:00000010
"ERand"=hex(b):4d,d9,3a,6a,d2,15,70,da
"EDIV"=dword:00001c7e
"IRK"=hex:b9,7b,43,48,d5,27,9d,44,12,5c,70,ac,63,ca,f0,e5
"Address"=hex(b):33,34,41,38,00,d1,00,00
"AddressType"=dword:00000001
"CEntralIRKStatus"=dword:00000001
"AuthReq"=dword:0000002d[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys\d4f32dd11356\d10238413433]
"LTK"=hex:47,96,a1,e8,41,aa,0f,be,05,7c,e3,5a,f2,6c,f0,55
"KeyLength"=dword:00000010
"ERand"=hex(b):5e,17,be,55,f0,41,fa,83
"EDIV"=dword:000069b8
"IRK"=hex:99,b6,88,4f,a4,2d,09,45,35,e7,d1,55,66,a0,2d,4b
"Address"=hex(b):33,34,41,38,02,d1,00,00
"AddressType"=dword:00000001
"CEntralIRKStatus"=dword:00000001
"AuthReq"=dword:0000002d

这里因为配对了两次,所以有两条记录,Address有一位发生了变化。键路径的最后一段也是,所以它们应该是Address的不同表示方式。

而Linux下蓝牙的配对信息是在/var/lib/bluetooth/<本机蓝牙 MAC>/<鼠标蓝牙 MAC>下的info文件中,同样以我的已经配对好的为例,长这样。

[General]
Name=RAPOO BT MOUSE
Appearance=0x03c2
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;00010203-0405-0607-0809-0a0b0c0d1912;[IdentityResolvingKey]
Key=99B6884FA42D094535E7D15566A02D4B[LongTermKey]
Key=4796A1E841AA0FBE057CE35AF26CF055
Authenticated=0
EncSize=16
EDiv=27064
Rand=-8936758010076850338[PeripheralLongTermKey]
Key=15C2CB0F3B2EA50D6D5602053C207479
Authenticated=0
EncSize=16
EDiv=23906
Rand=7133880575682007210[SlaveLongTermKey]
Key=15C2CB0F3B2EA50D6D5602053C207479
Authenticated=0
EncSize=16
EDiv=23906
Rand=7133880575682007210[ConnectionParameters]
MinInterval=8
MaxInterval=8
Latency=44
Timeout=300[DeviceID]
Source=2
Vendor=9354
Product=33382
Version=1

内容很多,但只是解决共享问题肯定不必全部改,应该只改和密钥相关部分就行了。而且像EncSize明显表示密钥长度的,肯定也是不需要改的。所以要改的其实很少。对照两个系统的记录格式,容易发现Linux下除了Key类型的是用16进制外,其他都是10进制,而Windows下都是16进制。所以修改的话就涉及到16进制与10进制的转换。基于Linux命令行的强大,修改Linux要方便得多,当然,反过来也不是不行。总之只需要修改一边与另一边一致就行了。剩下就是找键之间的对应关系了,其实也挺简单,Linux这边基本上是单词,Windows这边是缩写:

  • IdentityResolvingKey=IRK->CentralIRK 意识是身份解析密钥,既然是身份那一个设备只应该有一个,所以Windows这边还加了Centra表示中心的意思,在注册表里面位于主键下,而两次配对的信息分别在两个子键下,这很好找。
  • LongTermKey=LTK->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原来目录名的格式也就是把字母大写并且用:分隔字节。

基本上就这些了。再具体就变成抄别人的了。在网上查资料的过程中,蓝牙协议好像不单只有目前我的鼠标这一种(子协议),但是道理应该是差不多的,只是达到共用的目的的话,按照前面的办法应该搞得定。当然,前提得知道这些信息记录保存在哪,这也是认识并不深但仍然记这一篇的原因吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/17810.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu无密码用SCP复制文件到windows

默认情况下,ubuntu使用scp复制文件到windows需要输入密码: scp *.bin dev001@172.16.251.147:~/Desktop/. 为了解决每次复制文件都要输入密码这个问题,需要按如下操作: 1.创建ssh密钥 ssh-keygen -t ed25519 -C "xxx_xxx_xxx@hotmail.com" 2.使用scp复制公钥到w…

单片机GPIO中断+定时器 软件串口通信

单片机GPIO中断定时器 软件串口通信 解决思路代码示例 解决思路 串口波特率9600bps,每个bit约为1000000us/9600104.16us&#xff1b; 定时器第一次定时时间设为52us即半个bit的时间&#xff0c;其目的是偏移半个bit时间&#xff0c;之后的每104us采样并读取1bit数据。使得采样…

使用Web Components构建模块化Web应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 引言 Web Co…

每行数据个数在变的二维数组的输出

#include<stdio.h> int main() {//定义四个一维数组int arr1[1] { 1 };int arr2[3] { 1,2,3 };int arr3[5] { 1,2,3,4,5 };int arr4[7] { 1,2,3,4,5,6,7 };//把四个一维数组放进一个二维数组int* arr[4] { arr1,arr2,arr3,arr4};//预先计算好每一个数组真实的长度in…

【SSL证书】腾讯云SSL续签备忘录

适用于证书过期了&#xff0c;需要替换证书的场景。本备忘录为nginx使用证书场景 步骤&#xff1a;一共7步。 登录腾讯云控制台->申请免费证书->腾讯云审核->下载->登录服务器->替换证书->重启nginx 1.登录控制台 https://console.cloud.tencent.com/ssl…

AVL树

一.AVL树的概念 AVL树是一颗特殊的二叉搜索树。二叉搜索树在有些极端情况下可能会出现单支的情况&#xff0c;这会影响其插入查找的效率。而AVL树是一个高度平衡的二叉搜索树&#xff0c;它要求任何的左右子树的高低差都小于等于1。它可以通过去控制左右子树的高度差来控制二叉…

鸿蒙开发-网络数据访问、应用本地数据保存

HTTP概述 HTTP&#xff0c;全称Hyper Text Transfer Protocol 超文本传输协议。 HTTP请求为短连接。客户端发起请求&#xff0c;服务器返回响应。本次连接即结束。 添加网络权限 在访问网络之前&#xff0c;需要在module.json5中给APP添加网络权限 "module": {&…

画 五边形 思路

1. 计算圆心 view 中心点 2.规定半径 R < view宽度 / 2 3.计算五边形五个顶点&#xff08;角度A 2π / 5&#xff09; 4. 五点相连 转载&#xff1a; Android自定义控件 芝麻信用分雷达图 - 简书

网络工程实验三:DHCP的配置

#实验仅供参考&#xff0c;勿直接粘贴复制&#xff0c;用以学习交流# #对于软件的使用&#xff0c;请移步到实验一观看# 1、实验目的&#xff1a; &#xff08;1&#xff09;掌握DHCP工作原理。 &#xff08;2&#xff09;配置路由器作为DHCP服务器。 &#xff08;3&#x…

手写体识别Tensorflow实现

简介&#xff1a;本文先讲解了手写体识别中涉及到的知识&#xff0c;然后分步讲解了代码的详细思路&#xff0c;完成了手写体识别案例的讲解&#xff0c;希望能给大家带来帮助&#xff0c;也希望大家多多关注我。本文是基于TensorFlow1.14.0的环境下运行的 手写体识别Tensorflo…

【SpringBoot】公共字段自动填充

问题引入 JavaEE开发的时候&#xff0c;新增字段&#xff0c;修改字段大都会涉及到创建时间(createTime)&#xff0c;更改时间(updateTime)&#xff0c;创建人(craeteUser)&#xff0c;更改人(updateUser)&#xff0c;如果每次都要自己去setter()&#xff0c;会比较麻烦&#…

【项目开发】为什么文件名要小写?

未经许可,不得转载。 文章目录 一、可移植性二、易读性三、易用性四、便捷性一、可移植性 Linux 系统对文件名大小写敏感,而 Windows 和 Mac 系统则不敏感。这种差异可能导致跨平台的问题。 例如,以下四个文件名: computerComPutercomPuterCOMPOTer在 Linux 系统上,它们…

ssm127基于SSM的乡镇篮球队管理系统+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;乡镇篮球队管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本乡镇篮球队管理…

C#获取视频第一帧_腾讯云媒体处理获取视频第一帧

一、 使用步骤&#xff1a; 第一步、腾讯云开启万象 第二步、安装Tencent.QCloud.Cos.Sdk 包 第三步、修改 腾讯云配置 图片存储目录配置 第四步、执行获取图片并保存 二、封装代码 using System.Text; using System.Threading.Tasks;using COSXML.Model.CI; using COSXML.A…

【数据分享】2003-2022年各省土地利用面积统计数据

数据介绍 2003-2022年各省土地利用面积统计数据数据时间2003-2008、2013、2015-2017、2019、2022数据类型excel数据指标土地调查面积/万公顷农用地面积/万公顷园林面积/万公顷牧草地面积/万公顷建设用地面积/万公顷居民点及工矿用地/万公顷交通用地/万公顷水利设施用地/万公顷…

任务调度工具Spring Test

Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 作用&#xff1a;定时自动执行某段Java代码 应用场景&#xff1a; 信用卡每月还款提醒 银行贷款每月还款提醒 火车票售票系统处理未支付订单 入职纪念日为用户发送通知 一.…

20 轮转数组

20 轮转数组 20.1 轮转数组解决方案 class Solution { public:void rotate(vector<int>& nums, int k) {int n nums.size();k k % n; // 如果 k 大于数组长度&#xff0c;取模减少不必要的旋转// 第一步&#xff1a;反转整个数组reverse(nums.begin(), nums.end(…

字符串相关题解

目录 字母异位词 最长公共前缀 博主主页&#xff1a;东洛的克莱斯韦克-CSDN博客 字母异位词 49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 这道题更像一道语法题&#xff0c;考察对容器的掌握情况。如果按题目要求去模拟&#xff0c;不仅要分析每个字符串&am…

【微软:多模态基础模型】(3)视觉生成

欢迎关注【youcans的AGI学习笔记】原创作品 【微软&#xff1a;多模态基础模型】&#xff08;1&#xff09;从专家到通用助手 【微软&#xff1a;多模态基础模型】&#xff08;2&#xff09;视觉理解 【微软&#xff1a;多模态基础模型】&#xff08;3&#xff09;视觉生成 【微…

CentOS8 启动错误,enter emergency mode ,开机直接进入紧急救援模式,报错 Failed to mount /home 解决方法

先看现场问题截图&#xff1a; 1.根据提示 按 ctrld 输入 root 密码&#xff0c;进入系统。 2. 在紧急模式下运行&#xff1a;journalctl -xe &#xff0c;查看相关日志&#xff0c;找到关键点&#xff1a; Failed to mount /home 3.接着执行修复命令&#xff1a; xfs_repa…