Android:自动重新连接 BLE 设备

2024-04-27

我的目标是让 Android 设备重新连接到之前连接过的 BLE 设备无需用户干预与经典 BT 配对设备的操作方式相同(甚至可以通过电源循环工作)。

BTLE 设备的想法之一是节省服务、绑定和启用状态,以便重新连接非常快并且在外设上消耗很少的功率。

我所做的似乎有效,但效果很差。

第一步是连接或配对并连接到新设备,将“autoconnect”参数设置为“true”。 当设备断开连接时,不要打电话gatt.close()。我到处都看到应该调用 gatt.close()。但如果我确实调用 gatt.close(),Android 中央应用程序将永远不会重新连接。我已经测试过很多次了。

如果我没有调用 gatt.close() 并且没有重新启动 Android,通常会发生自动连接。有时可能需要很长时间,尤其是在 5.0 版本之后。然而,它是不可靠的,并且由于非常低负载的扫描周期以及设备在扫描周期实际检测到广告之前退出广告而可能是不可靠的。我不确定,因为没有办法像有广告那样检测到扫描操作!扫描也可能在一段时间后停止,但没有相关文档。

所以我认为我需要做的是,当设置自动连接时,以某种方式将 Android 使用的后台扫描速率设置为更高的占空比(仅可能在 5.0 及更高版本中),但我不知道如何执行此操作。我不想开始自己的扫描,但以某种方式设置 Android 用于重新连接的后台扫描速率。有谁知道如何做到这一点?有谁真正知道 autoconnect 和 gatt.close() 是如何工作的?

也许自动连接并不意味着像我上面指出的那样重新连接?


经过多次试验和磨难之后,这就是我如何最好地让 Android 自动连接,唯一的用户操作是首先选择设备(如果使用设置菜单,然后首先配对)。

您必须在 BroadcastReceiver 中捕获配对事件,并执行 BluetoothDevice.connectGatt() 将自动连接设置为 true。然后,当设备断开连接时,调用 gatt.connect()。

更新:虽然上述方法通常有效,但有时会非常慢,可能是因为挂起的连接使用极其保守的扫描速率。另一个缺点是,对于要自动重新连接的每个设备,您必须保留一个执行挂起连接的 BluetoothGatt 对象。在嵌入式世界中,这是疯狂的。相反,人们所做的是通过检查其广告来连续扫描并连接到所需的设备。人们仅保存有关设备的最少量数据(服务、其配对状态和密钥等)。当广告被捕获时,您会看到它是否是您已知的设备之一,如果是,则连接到它。 我在 Android 上尝试过类似的方法。始终扫描(低功率)并连接到感兴趣的广告,并维护代表已知设备的类。这种方法有一些烦人的细节(例如在连接时关闭扫描并在连接后重新启动),但它基本上可以在没有维护连接的开销的情况下工作。但有一个例外我不明白。扫描仪永远不会看到一台预配对设备的广告。但是,如果我调用此设备的挂起连接,我会重新连接。我完全不明白这一点。在我的嵌入式平台上,它可以正常工作。 如果其他人尝试过这种自动重新连接的方法,请分享您的经验!

我发现了 Android 无法识别预配对设备的原因。 Android 仅在设备响应扫描请求时报告扫描结果。配对后,该设备仅发出广告并忽略扫描请求,因此 Android 系统不会在 ScanCallback 中传递其广告。因此,为了使用扫描方法工作,我必须对这些特定设备使用挂起连接方法。看来你赢不了了!

============= 2020 年更新

许多年过去了,我对后台扫描方法有了更多的经验。如果保留支持的平台 5 及以上,则只能使用最新的扫描仪 API 并使用过滤器,从而无需自行解码原始广告。我还发现,如果您在连接时不关闭扫描,连接和重新连接会更快。我知道它违背了所有文档,但它有效,并且在某些平台上允许发生否则不会发生的连接。另外,到目前为止,我只发现一台(健康)设备需要挂起连接。免责声明:我所使用过的都是健康设备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:自动重新连接 BLE 设备 的相关文章

  • Android 两次请求 USB 许可

    我有一个运行 Android 4 0 4 的开发板 并将其用作 USB 配件 当我关闭板上的应用程序然后通过 USB 插入 Android 手机时 板会提示 连接此 USB 设备时打开 AppName 当我触摸 确定 时 应用程序启动并再次
  • HttpURLConnection getResponseCode 未返回

    我尝试在 Android 上使用 HttpURLConnection 将文件发布到我们的服务器 但 getResponseCode 调用只是挂起并且永远不会返回 该问题源于文件对于服务器来说太大 因此服务器发回 HTTP 错误代码 413
  • 在操作栏中编辑文本

    我正在使用 Action Bar Sherlock 为我的应用程序创建 UI 在将依赖项添加到我的项目等后 我创建了一个活动来测试它 public class PPS extends SherlockActivity Override pu
  • 修改 Settings.apk 以与 Project Glass 配合使用

    我正在尝试构建要在 Google I O 的 Hacking Glass 会议上在 Glass 上使用的 Settings apk 他提到 为了让设置 apk 正常工作 需要修改清单中的一行 这是 AOSP 清单 http pastebin
  • Android - Firebase - 保存新数据而不覆盖旧数据

    创建此问题是因为我之前的问题包含 2 个问题 而不是将其缩小到 1 Aim 用户将能够存储新数据而不会覆盖之前提交的数据 描述 目前 当用户输入新报告时 事件报告节点中的用户事件报告数据将被覆盖 用户发送的旧事件报告中的数据应与新数据一起保
  • 使用Web蓝牙API时找不到移动设备

    我正在学习 Web 蓝牙 API 使用 google 开发控制台 我无法找到我的移动设备 还尝试了 github 上提供的演示 https github com WebBluetoothCG demos https github com W
  • 带有电子墨水显示屏的 Android

    我有兴趣使用 AndroidE Ink http www eink com technology howitworks html为基础的平台 我知道已经是证明了 http vimeo com 3162590MOTO 曾经使用过 但我有兴趣将
  • WebView ssl 错误

    对不起我的英语不好 我需要加载 url https 我有一些问题 当我尝试加载页面时 webView 给我错误 primary error 3 certificate Issued to CN my site com Issued by C
  • Cordova Android 应用程序中的网页不可用

    编辑 我一直在解决这个问题并回顾我的所有步骤 我很乐意缩小这个问题的规模 并在令人困惑的情况下获得更多确切的细节 目前 我觉得 Keycloak 似乎只想将我重定向到 https 据我所知 这应该是 Wildfly 服务器配置问题 编辑 我
  • 如何从 Java 类调用 Kotlin 类

    我需要将意图从 java 活动传递到 Kotlin 活动 Java活动ProfileActivity class Intent selectGameIntent new Intent ProfileActivity this kotlin
  • 如何从其他 Activity 类访问 Activity 的视图

    我的问题是当我更改文本时TextView在我的主类中 它返回 nullPointerException 这是我的代码 main xml
  • 处理网络视图中的链接

    我有我的WebView加载网络视图中的所有链接 但是当我选择电子邮件链接时 它会尝试将其加载到网络视图中 而不是在手机上启动电子邮件应用程序 我该如何解决这个问题 链接是mailto 电子邮件受保护 cdn cgi l email prot
  • 使用 jenkins.Creating .apk 文件生成 android 版本

    我正在使用 Jenkins 在 mac 上持续集成 android 应用程序 但是我无法使用 Jenkins 生成 apk 文件 就像我们在 iOS 应用程序中创建 ipa 一样 创建用于在 mac 上分发的 apk 文件的配置是什么 您可
  • proguard 不会删除日志

    In proguard rules pro 我有以下配置 assumenosideeffects class android util Log public static boolean isLoggable java lang Strin
  • 现已弃用使用 Google Places API 获取多种类型

    谷歌最近宣布 自 2016 年 2 月 16 日起 types 参数已被弃用 取而代之的是新的类型参数 每个搜索请求仅支持一种类型 我的问题是 现在有什么方法 不使用已弃用的参数 从单个 API 调用中获取多个地点类型吗 谢谢 None
  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • smoothScrollToPosition() 在 Android ICS 中只能滚动到一半?

    在 Gingerbread 中 我使用 smoothScrollToPosition 一次滚动数十个项目没有任何问题 在我的 Nexus S 升级到 Ice Cream Sandwich 后 我注意到无论我在 smoothScrollToP
  • 改造中的 SocketTimeoutException

    我在尝试着POST向服务器请求获取数据但有时会发生SocketTimeoutException I used Ok3Client解决它 但我面临同样的异常 我该如何解决它 我的代码如下 public void getNormalLogin
  • ContactsContract.CommonDataKinds.Phone.CONTENT_URI 与 ContactsContract.Contacts.CONTENT_URI

    In 如何在android中检索联系人列表 https stackoverflow com questions 16124034 how to retrieve the list of contacts in android我看到代码允许您
  • Android 如何在按下或聚焦时使 TextView 文本变为粗体

    我的布局中有一个文本视图 我的要求是当我按下或聚焦它时 文本应该是粗体 否则应该使用普通字体 我该如何实施 使用下面的代码 TextView name TextView findViewById R id TextView01 name h

随机推荐