# BTHID **Repository Path**: benjaminwan/BTHID ## Basic Information - **Project Name**: BTHID - **Description**: 蓝牙外设,把android手机作为蓝牙键鼠使用。 - **Primary Language**: Kotlin - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 0 - **Created**: 2020-07-20 - **Last Updated**: 2025-02-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BTHID #### 介绍 它的功能是让手机成为蓝牙键盘鼠标,并且实现像罗技键鼠那样的宏功能。 它的目的原本只是因为我上车了掌阅F1并受到了一些启发,所以APP的名字叫做ReadFree。 但是随着功能的扩展,它的作用不止局限于此,从1.2.0版开始正式更名为【蓝牙外设】。 它的作用可以是,作为智能机顶盒的遥控器,作为PC的键盘鼠标,作为iPhone的无线键盘或另一台安卓手机的无线键鼠。 APP内置的脚本执行功能,可以在玩端游和支持键鼠的手游时,为玩家提供辅助,比如模拟器游戏的发招等。 最后,APP的安装要求:安卓9.0或以上,但并非任何手机都支持,安装后第一步会有兼容性测试页面。 #### 功能和进展: 1、论坛相关:--论坛登陆(已去除),查看本帖(已去除),复制帖子的code内容到剪切板(已完成),从剪切板粘贴code回帖(未完成)-- 2、兼容性测试:测试安卓手机底层是否支持蓝牙HID协议并给出结果(已完成) 3、蓝牙鼠标:手机模拟成标准3键蓝牙鼠标(已完成) 4、蓝牙键盘:手机模拟成标准104键蓝牙键盘(已完成),坛友提出需要87键横屏布局(已完成) 5、运行脚本:把键盘鼠标的各种操作定义为基本动作以自定义脚本的形式运行 类似按键宏(已完成),单步运行功能(未实现) 6、编辑脚本:脚本打开、保存、分享(已完成),剪切板复制粘贴脚本(已完成),脚本动作顺序调整、删除(已完成) 7、通知栏控制:类似音乐播放器的通知栏控制功能(已完成) 8、运行服务:按HOME键返回桌面后仍保留服务继续执行脚本(已完成) 9、蓝牙手柄:手机模拟成蓝牙手柄(部分完成) 10、外部应用调用:考虑出个demo或SDK,让外部的应用可以传递参数给执行核心,连接主机,启动脚本等(取消) #### 使用说明 1. 请参考app起始页说明 #### 实现原理是什么? 要从HID协议说起,HID协议是各种输入输出设备的通用通讯协议,最早由USB组织定义。 操作系统一般都内置了HID协议支持,HID设备多种多样,包括鼠标、键盘、游戏手柄、方向盘、摇杆、医疗设备等等。 随着蓝牙的发展,这些USB有线外设也借助蓝牙进化成为了无线外设,而蓝牙HID协议也基本照抄了USB HID协议。 到了安卓9.0,谷歌为系统底层加入了HID Profile相关代码,所以让手机模拟成蓝牙HID设备才成为可能。 剩下的事情,就是做类似做外设开发一样,按协议开发一款鼠标键盘了。 #### HID协议白皮书哪里看? USB组织的HID协议相关白皮书: https://www.usb.org/sites/default/files/hid1_11.pdf https://www.usb.org/sites/default/files/hut1_2.pdf #### iPhone支持蓝牙鼠标吗? 从IOS13开始,iPhone才支持蓝牙鼠标,而且必须到【设置】-【辅助】里开启 具体请以“IOS 蓝牙鼠标”为关键字去搜索引擎找教程 #### 关于boot模式 主要针对键盘和鼠标设备。 当主机还没有启动到操作系统时,在没有系统驱动和协议支持的情况下,怎么使用键盘鼠标? 比如进BIOS的时候。 所以专门针对键鼠定义了boot模式,规定了鼠标和键盘通信的固定格式。 APP是支持boot模式的,不过没有详细测试能不能用。 #### 模拟多种设备? 是的,当前APP就模拟了蓝牙键盘和蓝牙鼠标。 蓝牙的带宽应该足够,再往里加个手柄什么的完全不成问题。 协议没有限制一个设备支持的角色。 #### 所有键盘鼠标能做的手动操作,脚本都能定义且运行吗? 没错!这是键盘鼠标的宏定义所没有的自由度。 #### 经典蓝牙与低功耗蓝牙 主机端的蓝牙芯片大多是支持蓝牙双模(经典蓝牙+低功耗蓝牙) 外设则可能因为成本只支持其中一种。 蓝牙键鼠,有可能用经典蓝牙,也可能用低功耗蓝牙。 本APP模拟的键鼠是经典蓝牙协议的键鼠。 #### 鼠标一段时间不动后,指针隐藏了? 鼠标是周期性向主机发送相对坐标的设备,有个回报率参数。 普通鼠标的回报率是125Hz,每8ms向主机发送一次数据。 经典蓝牙是比较耗电的,手机如果模拟为外设,这样发送的话,电量应该会尿崩。 但是,一段时间不用蓝牙,手机蓝牙芯片进入低功耗状态后,重新唤醒进入工作状态又需要一些时间。 具体表现就是,比如某些模拟器游戏的发招,对按键时序要求比较严格,往往第一次发招会不成功。 目前APP并没有像鼠标那样以固定频率发送坐标,所以安卓系统一段时间后鼠标指针就隐藏了,今后考虑加入定时发送坐标的功能。