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原来目录名的格式也就是把字母大写并且用:分隔字节。
基本上就这些了。再具体就变成抄别人的了。在网上查资料的过程中,蓝牙协议好像不单只有目前我的鼠标这一种(子协议),但是道理应该是差不多的,只是达到共用的目的的话,按照前面的办法应该搞得定。当然,前提得知道这些信息记录保存在哪,这也是认识并不深但仍然记这一篇的原因吧。
相关文章:
Windows、Linux多系统共享蓝牙设备
Windows、Linux多系统共享蓝牙设备 近来遇到一个新问题,就是双系统共享蓝牙鼠标。因为一直喜欢在Windows、Linux双系统之间来回切换,而每次切换系统蓝牙就必须重新配对,当然,通过网络成功解决了问题。 通过这个问题,稍…...
C语言 | Leetcode C语言题解之第564题寻找最近的回文数
题目: 题解: #define MAX_STR_LEN 32 typedef unsigned long long ULL;void reverseStr(char * str) {int n strlen(str);for (int l 0, r n-1; l < r; l, r--) {char c str[l];str[l] str[r];str[r] c;} }ULL * getCandidates(const char * n…...
wsl虚拟机中的dockers容器访问不了物理主机
1 首先保证wsl虚拟机能够访问宿主机IP地址,wsl虚拟机通过vEthernet (WSL)的地址访问,着意味着容器也要通过此IP地址访问物理主机。 2 遇到的问题:wsl虚拟机中安装了docker,用在用到docker容器内的开发环境,但是虚拟机…...
Spark RDD 的宽依赖和窄依赖
通俗地理解 Spark RDD 的 宽依赖 和 窄依赖,可以通过以下比喻和解释: 1. 日常生活比喻 假设你在管理多个团队完成工作任务: 窄依赖:每个团队只需要关注自己的分工,完成自己的任务。例如,一个人将纸张折好&…...
二进制转十进制
解题思路分析 二进制转十进制原理:二进制数转换为十进制数的基本原理是按位权展开相加。对于一个二进制数,从右往左每一位的位权依次是将每一位上的数字(0 或 1)乘以其对应的位权,然后把所有结果相加,就得…...
深度学习:神经网络中的非线性激活的使用
深度学习:神经网络中的非线性激活的使用 在神经网络中,非线性激活函数是至关重要的组件,它们使网络能够捕捉和模拟输入数据中的复杂非线性关系。这些激活函数的主要任务是帮助网络解决那些无法通过简单的线性操作(如权重相乘和偏…...
Python缓存:两个简单的方法
缓存是一种用于提高应用程序性能的技术,它通过临时存储程序获得的结果,以便在以后需要时重用它们。 在本文中,我们将学习Python中的不同缓存技术,包括functools模块中的 lru_cache和 cache装饰器。 简单示例:Python缓…...
原生微信小程序在顶部胶囊左侧水平设置自定义导航兼容各种手机模型
无论是在什么手机机型下,自定义的导航都和右侧的胶囊水平一条线上。如图下 以上图iphone12,13PRo 以上图是没有带黑色扇帘的机型 以下是调试器看的wxml的代码展示 注意:红色阔里的是自定义导航(或者其他的logo啊,返回之…...
经验笔记:远端仓库和本地仓库之间的连接(以Gitee为例)
经验笔记:远端仓库和本地仓库之间的连接 方法一:先创建远端仓库,再克隆到本地 创建远端仓库 登录到你的Git托管平台(如Gitee、GitHub、GitLab、Bitbucket等)。点击“New Repository”或类似按钮,创建一个新…...
利用RAGflow和LM Studio建立食品法规问答系统
前言 食品企业在管理标准、法规,特别是食品原料、特殊食品法规时,难以通过速查法规得到准确的结果。随着AI技术的发展,互联网上出现很多AI知识库的解决方案。 经过一轮测试,找到问题抓手、打通业务底层逻辑、对齐行业颗粒度、沉…...
ffplay音频SDL播放处理
1、从解码数组获取到解码后的数据 static int audio_decode_frame(VideoState *is) {int data_size, resampled_data_size;av_unused double audio_clock0;int wanted_nb_samples;Frame *af;if (is->paused)return -1;//音频数组队列获取数据do { #if defined(_WIN32)while …...
自动化仪表故障排除法
自动化仪表主要是指在企业的实际生产工程当中,开展检测、控制、执行以及显示等一系列仪表的总称。合理地利用自动化仪表能够及时地掌握企业生产的动态,并获取相应的数据,从而推动生产过程的有序运行。 在自动化控制系统中,自动化…...
WPF 中 MultiConverter ——XAML中复杂传参方式
1. XAML代码 <!-- 数据库表格 --> <!-- RowHeaderWidth"0": 把默认的行表头隐藏 --> <DataGridx:Name"xDataGrid"Grid.Row"2"hc:DataGridAttach.ShowRowNumber"True"ItemsSource"{Binding WaferInfos, ModeT…...
实验室管理现代化:Spring Boot技术方案
4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…...
aws凭证(一)凭证存储
AWS 凭证用于验证身份,并授权对 DynamoDB 等等 AWS 服务的访问。配置了aws凭证后,才可以通过编程方式或从AWS CLI连接访问AWS资源。凭证存储在哪里呢?有以下几个方法: 一、使用文件存储 1、介绍 文件存储适用于长期和多账户配置。AWS SDK 也会自动读取配置文件中的凭证。…...
jmeter常用配置元件介绍总结之断言
系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之线程组 4.jmeter常用配置元件介绍总结之函数助手 5.jmeter常用配置元件介绍总结之取样器 6.jmeter常用配置元件介绍总结之jsr223执行pytho…...
JMeter监听器与压测监控之Grafana
Grafana 是一个开源的度量分析和可视化套件,通常用于监控和观察系统和应用的性能。本文将指导你如何在 Kali Linux 上使用 Docker 来部署 Grafana 性能监控平台。 前提条件 Kali Linux:确保你已经安装了 Kali Linux。Docker:确保你的系统已…...
MySQL8 安装教程
一、从官网下载mysql-8.0.18-winx64.zip安装文件( 从 https://dev.mysql.com/downloads/file/?id484900 下载zip版本安装包 mysql-8.0.18-winx64.zip 解压到本地磁盘中,例如解压到:D盘根目录,并改名为MySQL mysql-8.0.34-winx6…...
聚焦 NLP 和生成式 AI 的创新与未来 基础前置知识点
给学生们讲解的技术内容可以根据他们的背景、兴趣和教学目标来规划。以下是一些适合不同阶段和领域的技术主题建议,尤其是与大语言模型(如 ChatGPT)相关的内容: 1. 自然语言处理(NLP)基础 适合对 NLP 了解…...
23种设计模式-访问者(Visitor)设计模式
文章目录 一.什么是访问者模式?二.访问者模式的结构三.访问者模式的应用场景四.访问者模式的优缺点五.访问者模式的C实现六.访问者模式的JAVA实现七.代码解释八.总结 类图: 访问者设计模式类图 一.什么是访问者模式? 访问者模式(…...
ssm150旅游网站的设计与实现+jsp(论文+源码)_kaic
毕 业 设 计(论 文) 题目:旅游网站设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游网站就是在这样的大…...
【SKFramework框架】一、框架介绍
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…...
Arcgis地图实战三:自定义导航功能的实现
文章目录 1.最终效果预览2.计算两点之间的距离3.将点线画到地图上4.动态展示点线的变化5.动态画线6.动态画点 1.最终效果预览 2.计算两点之间的距离 let dis this.utilsTools.returnDisByCoorTrans(qdXYData, zdXYData, "4549")当距离小于我们在配置文件中预设置的…...
LLaMA-Factory 上手即用教程
LLaMA-Factory 是一个高效的大型语言模型微调工具,支持多种模型和训练方法,包括预训练、监督微调、强化学习等,同时提供量化技术和实验监控,旨在提高训练速度和模型性能。 官方开源地址:https://github.com/hiyouga/L…...
黑马点评 秒杀下单出现的问题:服务器异常---java.lang.NullPointerException: null(已解决)
前言: 在此之前找了好多资料,查了很多,都没有找到对应解决的方法,虽然知道是userid为空,但不知道要修改哪里,还是自己的debug能力不足,以后得多加练习。。。 问题如下: 点击限时抢…...
购物街项目TabBar的封装
1.TabBar介绍 在购物街项目中 不论页面如何滚动 始终存在一个TabBar固定在该项目的底部 他在该项目中 扮演者选项卡栏的角色 内部存在若干选项 而选项中 固定存在两部分(图片文本) 其中主要涉及到TabBar/TabBarItem这些和业务无关的共享组件(建议存放于components/common中)、…...
C++游戏开发面试题及参考答案
目录 在游戏开发中,为什么选择 C++ 作为编程语言? 为什么 C++ 语言更适合游戏开发? 描述游戏中的碰撞检测的基本原理。 解释游戏中的碰撞检测机制,并用 C++ 举例说明如何实现。 描述游戏中的物理模拟的基本原理。 阐述游戏中的物理模拟,如重力模拟在 C++ 中的实现方…...
字符串的基本操作(C语言版)
一、实验内容: 采用顺序结构存储串,编写一个函数substring(strl,str2),用于判定str2是否为strl的子串;编写一个函数,实现在两个已知字符串中找出所有非空最长公共子串的长度和最长公共子串的个数; ①字符…...
C缺陷与陷阱 — 7 可移植性缺陷
目录 1 应对C语言标准变更 2 标识符的名称限制 3 整数的大小 4 字符是有符号整数还是无符号整数 5 移位运算符 6 内存位置0 7 除法运算时发生的截断 1 应对C语言标准变更 使用新特性可以使代码更容易编写且减少错误,但可能会导致代码在旧编译器上无法编译。…...
应急响应:玄机_Linux后门应急
https://xj.edisec.net/challenges/95 11关做出拿到万能密码,ATMB6666,后面都在root权限下操作 1、主机后门用户名称:提交格式如:flag{backdoor} cat /etc/passwd,发现后门用户 flag{backdoor} 2、主机排查项中可以…...
百度推广送企业网站吗/seo服务顾问
原文:http://blog.csdn.net/carl_zhong/article/details/12219485 CCShaderCache 类似 textureCache,spriteFrameCache ,AnimationCache,主要功能是对ShaderProgram进行记录,保留一份索引,供其他模块调用获…...
中英企业网站源码/网上seo研究
在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。而监控CPU的性能一般包括以下3点:运行队列、CPU使用率和上下文切换。 对于每一个CPU来说运行队列最好不要超过3,例如,如果是双核CPU就不要超…...
做网站配置/最近一周的重大热点新闻
设置父级div为相对位置 设置子级div为绝对位置 代码如下: <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><div style"width: 100%; height: 600px; border:…...
网站建设 10万元/app推广方案
参赛对象:西南交通大学在读本科生组队方式:参赛者以三人为一队报名参加本次比赛,并选一人作为队长,鼓励不同学院、专业、年级同学相互组队。比赛形式:本次西南交通大学数学建模竞赛由我校数学建模指导老师命题…...
html5网站案例/岳阳网站界面设计
矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴,左右边平行于 y 轴。 如果相交的面积为 正 ,则称两矩形重叠。需要明确的是,只在角或边接触…...
手机网站分享/企业管理培训班哪个好
RxJS 系列目录 RxJS 系列之一 - Functional Programming 简介 RxJS 系列之二 - Observable 详解RxJS 系列之三 - Operators 详解RxJS 系列之四 - Subject 详解 (本文)RxJS 系列之五 - RxJS 实战 (未完成)RxJS 系列之六 - RxJS 在 Angular 2 中的应用 (未完成)Observer Pattern …...