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

技术标签: linux  蓝牙模拟HID设备  

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的页面配置图:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fanxiushu/article/details/138161953

智能推荐

从入门到精通,掌握程序员必备IDE使用技巧!-程序员宅基地

文章浏览阅读320次,点赞5次,收藏4次。IDE是Integrated Development Environment的缩写,即集成开发环境。它是为了方便开发人员进行软件开发而专门设计的应用软件。IDE提供了编辑器、编译器、调试器、自动化工具等多种工具,可以集成由不同的厂商提供的各种工具,成为最佳的开发环境

解决问题:FileStream 将不会打开Win32设备(如磁盘分区和磁带机)。请避免在路径中使用“\\.\”_filestream 将不会打开 win32 设备(如磁盘分区和磁带机)。请避免在路径中使用“\\-程序员宅基地

文章浏览阅读3.3k次。原因:文件名使用了操作系统设备保留字,如com、con、lpt等_filestream 将不会打开 win32 设备(如磁盘分区和磁带机)。请避免在路径中使用“\\

蓝桥杯JAVA-知识点汇总复习-程序员宅基地

文章浏览阅读4.2w次,点赞167次,收藏2.1k次。为准备第十三届蓝桥杯大赛(软件类)省赛。个人博客www.tothefor.com知识点蓝桥杯JAVA-1.入门必知、正常输入输出和快速输入输出蓝桥杯JAVA-2.数组操作蓝桥杯JAVA-3.自定义类排序、进制转换、保留小数位数蓝桥杯JAVA-4.常用数据类型蓝桥杯JAVA-5.位运算技巧和原理蓝桥杯JAVA-6.大数(整数、小数)处理蓝桥杯JAVA-7.集合(容器)在竞赛中的使用..._蓝桥杯java-知识点汇总复习

计算机怎么无线连接网络地址,电脑怎么设置无线网络ip地址-程序员宅基地

文章浏览阅读5k次。有时候我们的电脑连接无线网络不能上网时,可能是因为ip地址获取不到的问题,这个时候可以自己设置无线网络ip地址。下面是学习啦小编整理的电脑设置无线网络ip地址的方法,供您参考。电脑设置无线网络ip地址的方法WIN7电脑点击右小脚网络连接图标,进入网络设置界面,如图2,接着点击无线网络,如果是有线的就点击有线网络。点击底下属性栏目进入下步骤,点击TCP IP 协议则进入设置界面此时大家在这里要注意的..._无线网ip地址怎么设置

mongodb客户端 robo 3T 查询突破50行限制_robo 3t 只能显示50条数据-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏4次。robo 3T的小bug这个mongodb客户端,每次查询数据只有50行,虽然有向下翻页的功能但实际上点击后会被重置,还是只有前50条解决办法DBQuery.shellBatchSize = 500;当前窗口最大查询数量修改到500(只有当前窗口生效)在查询结束语句后加上.toArray()db.getCollection('example').find({}).toArray()..._robo 3t 只能显示50条数据

Android Q Data Disconnection For Default Mobile Data-程序员宅基地

文章浏览阅读166次。直接上流程图和之前的博文类似,可参考Android N Data Disconnection For Long Connection转载请注明出处。_default mobile data

随便推点

MySQL如何更改数据库名字_mysql update数据库名称-程序员宅基地

文章浏览阅读3.9k次。MySQL如何更改数据库名字_mysql update数据库名称

windows上最好用的文件管理软件 Directory Opus_directory ops-程序员宅基地

文章浏览阅读9w次,点赞24次,收藏65次。windows上最好用的文件管理软件 Directory Opuswindows 自带的文件管理软件就不用提了,垃圾的一比。而市面上比较流行的文件管理软件 xyploer,total commander 之类我都使用过,其中 total commander 的确是神器,但是界面太难看,还有学习路径比较陡峭,最后还是放弃了。后来我使用了 windows 上的资源管理器增强软件 clover 感觉..._directory ops

AWT图形界面设计编程——1.AWT容器_awt容器定义-程序员宅基地

文章浏览阅读212次。1.1AWT容器1.1.1Window和FrameWindow独立存在不依赖于任何其他容器。Window有两个子类:Frame和Dialog。一、窗体Frame:带有标题,而且可以调整大小。1.Frame的构造方法: 1). Frame() 构造的新实例 Frame初始时不可见。 2). Frame(GraphicsConfiguration gc) 构造一个新的,最初看不见的 F..._awt容器定义

一文看懂mybatis底层运行原理解析-程序员宅基地

文章浏览阅读656次,点赞24次,收藏12次。包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

Spring Cloud Alibaba 介绍_sprngcloud alba-程序员宅基地

文章浏览阅读175次。Spring Cloud Alibaba 介绍Sping体系Spring 以 Bean(对象) 为中心,提供 IOC、AOP 等功能。Spring Boot 以 Application(应用) 为中心,提供自动配置、监控等功能。Spring Cloud 以 Service(服务) 为中心,提供服务的注册与发现、服务的调用与负载均衡等功能。Sping Cloud介绍官方介绍​ Tools for building common patterns in distributed systems_sprngcloud alba

测试 数据类型的一些测试点和经验_基础字段的测试点-程序员宅基地

文章浏览阅读3.2k次,点赞4次,收藏21次。我这里是根据之前在测试数据类项目过程中的一些总结经验和掉过个坑,记录一下,可以给其他人做个参考,没什么高深的东西,但是如果不注意这些细节点,后期也许会陷入无尽的扯皮当中。1 需求实现的准确度根据产品需求文档描述发现不明确不详细的或者存在歧义的地方一定要确认,例如数据表中的一些字段,与开发和产品确认一遍,如有第三方相关的,要和第三方确认,数据类项目需要的是细心,哪怕数据库中的一个字段如果没有提前对清楚,后期再重新补充,会投入更大的精力。2 数据的合理性根据业务场景/常识推理,提..._基础字段的测试点