学校寒假有个程序设计比赛,我也一直想要去写一个安卓模拟的蓝牙键盘,这样无论到哪里,比如班班通和没有键盘的电脑设备,有手机就可以操作它,也比USB方便一些。忙活了一个寒假,也走了不少歪路,终于整成了,下面分享一些经验。
在安卓API28后开放了BluetoothHidDevice类,主要就是用它来完成。首先是注册HID服务:
在发起连接上,我试了从电脑端发起连接、从手机端发起连接,而且使用的都是点进系统蓝牙列表的方式,均无法建立稳定连接。 后来看到大佬文章,解决了这个问题,即使用代理连接:
只要把mac地址改成所想要连接的蓝牙设备的mac即可。电脑可以采用cmd指令ipconfig /all,拉到最底即可;手机使用adb连接后,输入指令adb shell settings get secure bluetooth_address即可。当然也可以直接扫描,但我目前还未完成相关代码。
发送报告使用sendReport(),发送对应ID和字节的报告即可。
这玩意在安卓上适配都挺好,但Windows上会有一些问题。我自己找了一版描述符,目前是正常的(也是在GitHub上找的):
也确实尝试了很多版,这版可以。但需要注意其中的(byte) 0x85, (byte) 0x08, // REPORT_ID (Keyboard)反映了报告的ID = 8,需要和report中的相对应,如:
这里需要注意的一点是发送报告每一位的对应意义。如:
b1是修饰键的描述。需要注意的是如果只发送一个修饰键如shift来切换输入法中英文输入,只用在修饰键位添加字节即可,此时字母位置为0。 一个合理的根据输入的修饰键调整b1的值的代码如下。不在需要单独为修饰键创建映射集合:
在输入端也做了一些多键位输入、组合键识别的处理(使用的是JavaScript构建前端),大家可以参考参考,也可以去看我的仓库:
后来使用Wireshark对蓝牙抓包,发现安卓是这样的:
而Windows总是这样:
显示正在Pending,无法直接success;而且相同SCID的request最后会以PSM not support请求失败。HID-Control对应的PSM是0x0011。
在Windows开发文档上看到了以下:
若要接收来自特定 PSM 的任何远程设备的传入 L2CAP 连接请求,配置文件驱动程序应首先生成并发送 BRB_L2CA_REGISTER_标准版RVER 请求,并在请求的 _BRB_L2CA_REGISTER_标准版RVER 结构的 Psm 成员中指定 NULL,并在请求的 _BRB_L2CA_REGISTER_标准版RVER 结构的 Psm 成员中指定 NULL。 发送 BRB_L2CA_REGISTER_标准版RVER 请求时,配置文件驱动程序还必须向蓝牙驱动程序堆栈注册 L2CAP 回调函数。 这使蓝牙驱动程序堆栈能够通知配置文件驱动程序传入 L2CAP 连接请求。 然后,配置文件驱动程序应生成并发送BRB_REGISTER_PSM请求,以便蓝牙驱动程序堆栈将接受请求注册的 PSM 的连接。 否则,蓝牙驱动程序堆栈将拒绝具有未知(未注册)连接请求的所有连接请求。 有关 PSM 的详细信息,请参阅 _BRB_PSM 结构。
所以就感觉是不是驱动的问题。最后下载更新最新版的蓝牙驱动即可。注意更新完后要重启。 于是问题就解决了。抓包结果是,虽然也不是立刻success,但是最后依然请求成功。这估计是因为Windows多了以上的请求过程机制。
简介:蓝牙4.0分为标准蓝牙和低功耗蓝牙(BLE),标准蓝牙就是手机上用的那种,低功耗蓝牙由于其具有最大化的待机时间、快速连接和低峰值的发送和接收特性,被广泛用于智能手表、智能手环等可穿戴设备上。在安卓4.3之前,安卓平台上的BLE开发相当难搞,好在谷歌在4.3之后发布了官方的API。在安卓5.0之后又引入了新的API,原来的API已经被废弃。在新的系统里采用旧API开发的APP仍可使用,但采用新
已BLE HID为例,Android原生代码bta_hh_le_add_dev_bg_conn按照Spec描述,在加载配对记录后,对已配的BLE HID Device设备执行了Auto connection流程,代码内,会触发中心设备向BLE HID Device设备自动发起连接的情况包括如下三种:配对成功之后;车机蓝牙(中心设备)启动,加载配对记录之后;原因是connection timeout
一个典型蓝牙控制器的基本结构如图,右上角处理器处理上层协议,并通过ahb的总线接口将命令与数据配置到reg和sram中。生成的串行bit数据送入左下modem。左边的radio为蓝牙收发的模拟电路,接受link控制的配置。 以上结构中,除了跟cpu交互用到的bus interface, register,sram,还有另外很多模块,这里逐一解释一下功能。这里最核心的模块是mem con
设置蓝牙我们都知道,在手机的设置-蓝牙中,可以进行蓝牙设置的相关操作。其实可以不离开自己的APP,直接完成蓝牙设置的主要操作,可以结合自己的业务需求,相应地提示用户开启相关设置,提升用户体验。首先要知道,蓝牙连接需要知道待连接设备的MAC地址。已配对设备的MAC地址是已知的,只要对方开启了蓝牙并在连接范围内,就能连接成功。未配对设备则需要通过搜索才能知道MAC地址,知道MAC地址后如果直接请求和对
好吧,这是交易.我买了两部兼容蓝牙的Galaxy Nexus手机.我编写了一个蓝牙连接管理应用程序,用于设备发现和连接.它还输出设备可以支持的所有可用UUID.> 0x1116 – NAP> 0x112f – PBAP(电话簿访问配置文件)> 0x111f – HFP(免提)> 0x1105 – OPP(对象推送配置文件)> 0x1112 – HSP(耳机配置文件)&
安卓系统蓝牙配对流程分析 配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程。配对,顾名思义就是将两个设备通过相关技术进行绑定,达到能够互相识别彼此的目的。因此通过蓝牙技术进行的配对就是大家理解中的蓝牙配对。随着蓝牙技术在消费市场上越来越普及,生活中很容易就能遇到蓝牙配对这一使用蓝牙功能事必不可缺失的步
今天记录一下前几天做的一个关于智能窗户APP的制作过程。这次制作是通过APP inventor来实现的下面是最原始的版本,虽然有点丑,但这都不是重点,以后有待改进。(1)APP初次打开的显示:如图所示,这一APP有获取蓝牙地址、连接蓝牙、开关灯、气泵的开关、智能模式的开关、湿度的显示等功能。图中程序的作用是:当初次打开APP程序,屏幕会出现提醒语“欢迎使用本软件”,然后使按键“连接”
原标题:技术丨如何解决蓝牙设备无法连接的问题?技术丨如何解决蓝牙设备无法连接的问题?在日常使用PC的过程中,偶尔会遇到蓝牙设备无法连接的情况,那么如何处理这样的问题呢?以下几个步骤来帮你解决。注意如果PC的现象是找不到蓝牙图标,或蓝牙图标显示异常(比如打红叉,惊叹号等现象)可以直接按照第三步解决方案来操作。1确认蓝牙设备是否可用蓝牙设备连接的问题,绝大多数会出在蓝牙设备端,因此首先需要解确认网络环
蓝牙协议栈:simplelink_cc2640r2_sdk_1_40_00_45IAR版本:IAR for ARM 8.11.3开发板:CC2640R2F蓝牙版本:BLE4.2配对模式:PasscodeEntry 密码输入模式主机端仅具有GAPBOND_IO_CAP_KEYBOARD_ONLY按键能力,从机端仅具有显示能力GAPBOND_IO_CAP_DISPLAY_ONLY。从机端:如果用手机做
蓝牙配对机制为了统一规范,蓝牙在2.1版本引入了安全简单的配对机制,从尔加强了蓝牙通讯安全方面性能。以下总结了蓝牙配对机制:一、遗留配对(Lagacy pairing){密码配对(PIN Code Pairing)} 仅适用于蓝牙v2.0及之前版本。每个设备必须输入PIN码(Personal identification number),且只有双方输入的PIN码相同时才会配对成功。任何16字节的U
蓝牙4.1,是一个大杂烩:BR/EDR沿用旧的蓝牙规范;LE抄袭802.15.4;AMP直接使用802.11。而这一切的目的,就是以兼容性和易用性为基础,在功耗和传输速率之间左右为难。1.蓝牙技术的概述1.1 两种蓝牙技术:经典蓝牙(检称 BT)和低功耗蓝牙(简称BLE) 蓝牙协议包括两种技术:经典蓝牙(简称BT)和低功耗蓝牙(简称BLE)。这两种技术,都包括搜索(discovery)管理、连接
1、什么是蓝牙Bluetooth是目前是使用的最广泛的无线通讯协议之一; 主要针对短距离设置通讯;5到10米 常用语连接耳机、鼠标和移动通讯设备等;与蓝牙相关的api: BluetoothAdapter:该类的对象代表了本地的蓝牙适配器;BluetoothAdapter的常用方法: isEnabled()判断蓝牙是否打开,已打开返回true,否则,返回falsegetAddress()获取本
现在各种各样的数码设备在我们的生活当中几乎可以说是无处不在,平时我们使用的手机,IP,电脑等等这些都属于数码设备,那么这些数码设备当中会存在着很多的功能,当然在我们使用的过程当中自然也会出现说各种的问题,那么我们如何才能去解决这些问题以及使用好这些功能呢?这个时候就需要我们去了解这些功能及问题的解决方法,今天小编就来给大家分享下,关于索尼MDR-100ABN耳机怎么连接安卓手机方面的问题及功能的详
明年就要毕业了,所以最近开始刷面试题,碰到了一个问题“蓝牙自动配对怎么实现的?”,刚开始有点懵逼了。于是学习一波,记录下来。1 实现过程及原理 配对是建立连接的基础,任何从未配对过的设备(或曾经配对但其中一方已删除配对关系)都无法建立连接,因此配对无法绕过。配对的方式有输入pin码、输入密码、免输入的随机验证码等多种。当前XX设备与控制端的配对方式为免输入的随机验证码,两端确认6位数密码一致,点
在很多需要长期会话、来源可控、城市级定位的业务中(如电商监测、广告验证、本地化测试等),住宅IP的稳定性与地域精度往往比数量更重要。 下面总结一些企业在选型与使用静态住宅IP时的关键考量指标和经验。 一、核心指标 成功率(Success Rate) 稳定的网络请求成功率应在 99% 以上,可支 ...
通过事件和委托来实现银行的还款功能1.如果未到还款日期,则不会触发还款事件2.如果到了还款日期,钱不够,则会显示还差多少钱待还3.如果到了还款日期,钱够了,则会显示还剩多少钱储蓄卡类:基础的类,实现简单的用户和余额的定义class Saving_card{private int money;public string customer;public int Mon
本文将聚焦于跨境电商领域,介绍如何通过GEO优化提升品牌在全球市场的SEO排名,打破流量瓶颈。文章将分享多个跨境电商品牌的优化案例,探索如何利用GEO提升品牌曝光和用户流量,进一步推动全球电商业务的增长。