Linux蓝牙驱动模拟HID设备(把Linux系统模拟成蓝牙鼠标和蓝牙键盘)

news2025/1/15 17:30:33

by fanxiushu 2024-04-24 转载或引用请注明原始作者。

在经过windows的蓝牙驱动开发模拟成HID设备的大风大浪之后,
现在回到linux下实现相同功能,简直就是如小孩嬉闹一样的轻松。
但无论如何,作为模拟蓝牙HID设备的windows,linux一系列的解决方案,本文还是简单阐述出来。

在windows中的蓝牙驱动,那才叫真正的驱动,而且是内核运行的,必须使用c/c++语言开发。
而在linux中,蓝牙的基础底层(blueZ)帮我们完成了大部分的工作,
而且连带应用层也留下非常简便的接口来使用。
因此linux的开发模拟HID设备的蓝牙驱动,只能叫简单调用应用层的接口而已,
不仅可以使用c/c++, 各种开发语言都可以,脚本也行,只要支持blueZ导出的接口。
所以,在windows必须实现内核驱动才能完成的功能,在linux就跟玩似的,怎么搞都行。

开始之前,我们依然需要一些准备知识:
linux主要是熟悉blueZ,至少需要熟悉它的接口以及如何调用接口以及工具程序,比如hciconfig,bluetoothctl等如何使用。
需要熟悉HID相关知识。当然包括最基本的socket套接字编程知识。

前面两篇文章阐述了windows下的蓝牙驱动模拟HID设备,也总体说明了模拟蓝牙HID设备的流程:
1,初始化,
2 ,注册0x11和0x13 的PSM,
3,设置listen l2cap侦听
4,accept,然后收发数据

其实linux下基本流程也是一样的,但是linux的更像普通的socket编程,
因为 blueZ 集成了AF_BLUETOOTH 的 socket,
所以可以使用 socket 来进行蓝牙通讯。

首先我们初始化,只需要简单的创建套接字:
    int sockint = socket ( AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP );
    int sockctl = socket ( AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP );
一个用于0x11(控制,传输控制命令),一个用于0x13(中断,用于数据传输)

接着就是注册0x11和0x13 的PSM, 在linux中,直接 bind 绑定即可,如下:
static int    bth_bind(int sockfd, unsigned short port) {
    struct sockaddr_l2 l2a;
    memset(&l2a, 0, sizeof(l2a));
    l2a.l2_family = AF_BLUETOOTH;
    bacpy(&l2a.l2_bdaddr, &bdaddr_any);
    l2a.l2_psm = htobs(port);
    int ret = bind(sockfd, (struct sockaddr *)&l2a, sizeof(l2a));
    if (ret < 0)
    {
        printf( "** Bluetooth: Bind error (PSM 0x%X): %s\n", port, strerror(errno));      
    }
    return    ret;
}
//
bth_bind(sockctl, 0x11); /注册0x11
bth_bind  (sockint, 0x13 );  /注册0x13

而且不像windows那样,注册这两个值会失败,必须做PATCH才能成功;
linux下始终都会成功的,
当然要正常运行起来,还得保证bluetoothd 带 -P input 参数运行,意思是blueZ忽略input的处理,
这样才能把HID的处理转到我们的程序上。

像在windows中开发的模拟HID设备的蓝牙驱动那样,linux中也需要发布属于我们的HID 的SDP描述信息。
生成HID SDP信息,这个可能是linux下唯一有点麻烦的地方了,
但是如果你事先就做好一个 profile hid文件,文件内容就是sdp信息,然后直接导入进来的话,也挺简单。
不过我这里是自己在程序中生成sdp。
主要使用 blueZ导出的 一大堆sdp_xxx接口函数来生成,生成的SDP格式都是标准的格式,
所以这里也不再赘述。

生成 sdp之后,调用 sdp_record_register 注册 sdp,不使用的时候,调用 sdp_device_record_unregister 注销。
这两个函数调用都需要调用sdp_connect函数 连接到本地 SDP Server上。

还需注意的是,要确保sdp_connect连接成功,
bluetoothd服务必须带 -C或者--compat参数运行。

所以总结起来,需要bluetoothd带两个参数运行:
bluetoothd -C -P input

接着就是调用accept函数来接收新连接上来的蓝牙客户端了。
连接成功之后,直接调用系统函数 send,recv 收发数据了。

所以。。。。。
非常的简单,比起windows下实现相同功能不知道简单到哪里去了!

研究蓝牙模拟HID设备的目的,其实在上面两篇文章中说过了,其实就为了能控制iOS手机,
而现在这个目的终于达成了。
下面是我的xdisp_virt程序实现的效果。

新版本的xdisp_virt实现了 AirPlay,
是的,用来镜像苹果设备的屏幕到xdisp_virt程序中,再通过xdisp_virt强大延展功能,
能把苹果设备(iOS,iPad,macOS)的屏幕带到更遥远的地方。

下面是演示视频:
 

xdisp_virt程序的AirPlay且蓝牙控制苹果手机


下面是AirPlay的页面配置图:

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

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

相关文章

冰箱、保险柜门不要对准外面

风水真的和我们的生活息息相关&#xff0c;它会影响到我们的事业财运、婚姻感情、健康平安等等。很多人在不知情的情况下&#xff0c;触犯了风水里的禁忌&#xff0c;那结果可想而知&#xff01; 峰民特别提示您&#xff1a;千万不要将冰箱、保险柜的门对准外面。冰箱是不能与…

什么是重放攻击(Reply attack)?

什么是重放攻击(Reply attack)? 重放攻击&#xff0c;也称为回放攻击&#xff0c;是一种网络攻击方式。重放攻击是一种中间人攻击&#xff0c;攻击者通过截获合法的数据传输并重新发送它们来欺骗接收方&#xff0c;让接收方误以为是合法的消息。重放攻击是非常常见的&#xf…

printjs打印表格的时候多页的时候第一页出现空白

现象&#xff1a;打印多页的时候第一页空白了&#xff0c;一页的时候没有问题 插件&#xff1a;printjs 网上搜索半天找到的方式解决&#xff1a; 1. 对于我这次的现象毫无作用。其他情况不得而知&#xff0c;未遇见过。&#xff08;这个应该是大家用的比较多的方式&#xf…

古籍数字化平台中的OCR:这个平台更精准

在浩瀚的历史长河中&#xff0c;古籍作为中华民族的文化瑰宝&#xff0c;承载着无数先人的智慧与心血。然而&#xff0c;由于岁月侵蚀、保存不当等多种原因&#xff0c;许多珍贵的古籍面临损坏、失传的危机。为了守护这些无价之宝&#xff0c;云聪研发团队倾力打造了一款尖端的…

使用QTcpSocket

(1)客户端每隔10ms向服务器发送一次数字字符串&#xff0c;从0开始。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpSocket> #include <QLabel> #include <QTimer> namespace Ui { class MainWindow; }class Mai…

11 - 在k8s官方文档上,经常搜索不到内容的问题

使用k8s官方文档时&#xff0c;会出现首页可以正常打开&#xff0c;但是输入搜索关键字之后&#xff0c;搜索不到内容的情况&#xff0c;如下图&#xff1a; 这是由于相关搜索组件被墙的原因&#xff0c;处理方法如下&#xff1a; 谷歌浏览器&#xff1a; 火狐浏览器&#x…

Epic游戏商店再送大作,兽人必须死3即将免费领取

Epic游戏商店再送大作&#xff01;兽人必须死3即将免费领取 圣诞节过后&#xff0c;Epic游戏商店一直在送出精心制作的小游戏或者在小圈子里备受热议的作品。虽然之前送过的游戏如《天外世界》和《幽灵行者》等名气不小&#xff0c;但对于一直在“白嫖”的玩家们来说&#xff0…

采用php vue2 开发的一套医院安全(不良)事件管理系统源码(可自动生成鱼骨图)

采用php vue2 开发的一套医院安全&#xff08;不良&#xff09;事件管理系统源码&#xff08;可自动生成鱼骨图&#xff09; 医院安全&#xff08;不良&#xff09;事件管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;以事件…

【Go语言快速上手(四)】面向对象的三大特性引入

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. 初识GO中的结构…

记内网http洪水攻击,导致网页无法访问一事

事由 最近两日&#xff0c;部分同事在访问税纪云平台时&#xff0c;登录跳转页面频繁转圈、要么就是出现无法连接的错误提示。 无法访问此页面 已重置连接。 请尝试: 检查连接 检查代理和防火墙 运行 Windows 网络诊断经过以下几方面的排查&#xff0c;无果。 后续通过检查…

【Node.js】02 —— Path模块全解析

&#x1f31f;Node.js之Path模块探索&#x1f308; &#x1f4da;引言 在Node.js的世界中&#xff0c;path模块就像一把万能钥匙&#x1f511;&#xff0c;它帮助我们理解和操作文件与目录的路径。无论你是初入Node.js殿堂的新手&#xff0c;还是久经沙场的老兵&#xff0c;理…

Docker容器概念介绍与基本管理

前言 在软件开发和部署环境中&#xff0c;使用 Docker 等容器技术可以帮助团队实现快速、一致、可靠的应用程序部署&#xff0c;提高开发效率和应用程序的可移植性。 目录 一、虚拟化产品介绍 1. 云服务模型 1.1 IaaS 1.2 PaaS 1.3 SaaS 1.4 DaaS 2. 产品介绍 2.1 虚…

【八股】Spring篇

why Spring? 1.使用它的IOC功能&#xff0c;在解耦上达到了配置级别。 2.使用它对数据库访问事务相关的封装。 3.各种其他组件与Spring的融合&#xff0c;在Spring中更加方便快捷的继承其他一些组件。 IoC和DI &#x1f449;IOC是Inversion of Control的缩写&#xff0c;“…

Nginx 四层和七层代理区别、配置

四层&#xff1a;通过报文中的目标地址和端口&#xff0c;加上负载均衡设备设置的服务器选择方式&#xff0c;决定最终选择的内部服务器&#xff0c;使用tcp、udp协议。 七层&#xff1a;"内容交换"&#xff0c;通过报文中真正有意义的应用层内容&#xff0c;加上负…

ETLCloud平台组件模版的使用技巧

ETL工具介绍 在ETLCloud平台中配备了各种不同的组件、模板、规则&#xff0c;用户可运用不同类型的组件来实现想要的业务流程。接下来直接进入平台组件模板的使用技巧说明吧。 使用技巧 1.组件复制 平时在使用的时候&#xff0c;如果遇到要用到一个组件&#xff0c;需要再来…

创建一个空的maven项目,整合SpringBoot和Redis

创建一个空的maven项目&#xff0c;整合SpringBoot和Redis 创建空的maven项目 在最新版的idea中创建maven项目的时候会让选择模板 如下图&#xff1a; 我们选择quickstart快速开始模板&#xff0c;quickstart快速开始模板创建的maven项目里面什么都不带&#xff0c;只有一个…

【机器学习】集成学习---投票法(Voting)

一、引言 集成学习&#xff08;Ensemble Learning&#xff09;是机器学习领域中的一种重要策略&#xff0c;它通过结合多个模型的预测结果来提高整体性能。在单个模型容易过拟合或欠拟合的情况下&#xff0c;集成学习能够通过综合多个模型的优点来减少这种风险&#xff0c;从而…

javaWeb项目-房屋房租租赁系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JSP技术 JSP(Jav…

企业如何创建自己的维基百科词条?难吗?

维基百科词条创建与编辑概述 &#xff08;Wikipedia&#xff09;是全球网络上最大且最受大众欢迎的参考工具&#xff0c;其内容丰富、更新及时&#xff0c;被广泛应用于学术研究、商业决策和普通大众的查询需求。词条的创建与编辑对于很多人来说可能是一个挑战&#xff0c;但实…

echarts树图-实现拓扑图效果

使用echarts树图来实现拓扑图效果&#xff0c;其效果如下&#xff1a; 代码如下&#xff1a; const data {name: XXX公司,children: [{name: 网络主机,children: [{name: 普通路由器,children: [{name: 智能网关},{name: 192.168.1.0/24}]}]},{name: 企业路由器},{name: 三…