android - 当设备未处于配对模式时,通过蓝牙 LE 在 Android 上的连接失败,但使用 Linux 成功
问题描述
问题描述 我有一个 BLE 设备。我想和它交流。我的 Android 应用程序代码:
device.connectGatt(context, false, ...)
如果设备处于配对模式,我可以连接到它。但是,如果我想使用相同的代码连接到已经配对的设备,则会出现错误。完全相同的用例在我的 Linux PC 上运行良好,设备处于配对和非配对模式。(我已经使用了Python gatt 模块)
我已经转储了蓝牙流量,并且在连接过程中发现了一些差异。
Linux/未配对
- 发送:LE 创建连接
- Rcvd:命令状态(LE 创建连接)
- Rcvd:LE Meta(LE 连接完成)
- 已发送:LE 读取远程功能
- Rcvd:LE Meta(LE 频道选择算法)
- Rcvd:命令状态(LE 读取远程功能)
- Rcvd:LE Meta(LE 读取远程功能完成)
- 发送:LE 开始加密
安卓/配对
- 发送:LE 创建连接
- Rcvd:命令状态(LE 创建连接)
- Rcvd:LE Meta(LE 增强连接完成)
- 发送:LE Read Peer Resolvable Address
- Rcvd:命令完成(LE 读取对等可解析地址)
- 已发送:LE 读取远程功能
- Rcvd:命令状态(LE 读取远程功能)
- Rcvd:LE Meta(LE 读取远程功能完成)
- 发送:读取远程版本信息
- Rcvd:命令状态(读取远程版本信息)
- Rcvd:读取远程版本信息完成
- 发送:LE 开始加密
Android/未配对
- 发送:LE 创建连接
- Rcvd:命令状态(LE 创建连接)
- Rcvd:LE Meta(LE 增强连接完成)
- 发送:LE Read Peer Resolvable Address
- Rcvd:命令完成(LE 读取对等可解析地址)
- 已发送:LE 读取远程功能
- Rcvd:命令状态(LE 读取远程功能)
- Rcvd:LE Meta(LE 读取远程功能完成)<-- 失败,状态:无法建立连接(0x3e)
所以我决定比较一下内容
LE Meta(LE 读取远程功能完成)
所有 3 次尝试的数据包:
Linux/未配对:支持的 LE 功能:0x0000000000004105、LE 加密、扩展拒绝指示、LE 2M PHY、信道选择算法 #2
Android/配对:支持的 LE 功能:0x0000000000000005、LE 加密、扩展拒绝指示
Android/未配对:支持的 LE 功能:0x00000000000000ef、LE 加密、连接参数请求过程、扩展拒绝指示、从站发起的功能交换、数据包长度扩展、LL 隐私、扩展扫描仪过滤策略
有谁知道我该如何解决这个问题?
解决方案
“Connection failed to be established”是指master发出CONNECT_IND响应ADV_IND后,slave似乎没有响应master发出的任何数据包。这可能是由于某些硬件或固件故障、信号质量不佳或外围设备使用白名单来忽略来自不需要的设备的连接而发生的。发生此错误没有其他原因。
如果外围设备正在使用白名单,请确保它正确处理可解析地址。
推荐阅读
- java - 在父/子仓库中配置 maven 插件的正确方法
- ethereum - 调用传递函数时会发生重入吗?
- javascript - const utf8Encoder = new TextEncoder(); 在节点 js
- django - 来自 url 的 DRF 嵌套路由器序列化程序源字段
- c - 无法打开头文件(VS2019)
- linux - 在 bash scriptlinux 中验证当前日期和 7 天前的命令
- multidimensional-array - 当要素的坐标频繁更新时,使用哪种空间数据结构?我试过 R 树,二维网格
- typo3 - 仅在 TYPO3 的根页面上缺少 JS 文件
- flutter - 在颤动中导航屏幕的一部分
- mysql - 为什么 SET 和 CONVERT 不能用于更新 MYSQL 中的表