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 设备 的相关文章

  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • 在我的 Android 应用程序中使用 ServerValue.TIMESTAMP

    我读过很多相关的 stackoverflow 问题 ServerValue TIMESTAMP 但我不知道如何在我的应用程序中使用它 我需要获取帖子创建的时间戳 时间戳应该添加到与帖子的 uid 作者等相同的位置 代码片段其中写这篇文章Fi
  • 从历史堆栈中删除活动

    我的应用程序在用户第一次运行应用程序时显示注册活动 如下所示 活动启动画面 欢迎来到游戏 注册帐户 ActivitySplashScreenSignUp 很好 填写此信息 ActivityGameMain 游戏主屏幕 因此 当用户单击每个屏
  • 需要使用手机后退按钮返回 Web 视图的帮助

    这是我的代码 package com testappmobile import android app Activity import android os Bundle import android view KeyEvent impor
  • 如何在android中压缩和解压png图像

    您好 在我的应用程序中 当我单击 zip 按钮时 我需要压缩图像文件 当我单击解压缩按钮时 我需要解压缩文件 我尝试使用下面的代码来压缩图像 但我的问题是当我单击 zip 按钮时 正在创建 zip 文件 但之后在使用 winzip 软件的系
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • 具有自定义源集的 Android Gradle 风格 - gradle 文件应该是什么样子?

    我有一个旧的 eclipse 项目 我已经转移到 android studio 并设置为使用flavor 它似乎工作得很好 直到我开始尝试在我的风格之间使用不同的 java 文件 我的项目设置是这样的 ProjectRoot acitonb
  • 我想从 android 中服务器的视频 url 创建缩略图

    My code public static Bitmap retriveVideoFrameFromVideo String videoPath throws Throwable Bitmap bitmap null MediaMetada
  • Emma 不生成coverage.ec

    我设置了艾玛 它曾经对我有用 然后我们更改了源代码 现在它没有生成coverage ec根本不 它确实生成coverage em 测试临近结束时 出现错误消息 exec INSTRUMENTATION CODE 0 echo Downloa
  • 如何从android中的外部存储中获取所选文件的文件路径?

    我在选择文件的文件路径时遇到问题 我搜索了整个堆栈溢出 但问题没有解决 从设备中选择文件的代码如下所示 Intent intent new Intent Intent ACTION GET CONTENT intent setType in
  • android中listview显示数据库中的数据

    我是安卓新手 我想知道如何在列表视图中显示数据库中的数据 它不会向数据库添加数据 我只是显示我们存储在数据库中的任何内容 请帮助我实现这一目标 提前致谢 使用这些课程可能会对您有所帮助 用于数据库创建 package com example
  • Android 中的列表视图分页

    我有一个列表视图 其中显示了 50 个元素 我决定对视图进行分页 以便视图的每个部分都有 10 个元素 然后单击 下一个 按钮以获取下一个 10 个元素 如何设置10个数据 我关注这篇文章http rakhi577 wordpress co
  • 即使 Android M 上的移动数据已打开(有连接),也可以通过 WiFi(无连接)发送请求

    我必须在没有互联网连接的情况下将 UDP 数据包发送到 WiFi 模块 配有自己的 AP 但是当我将手机连接到 AP 时 Android 会在移动数据接口上重定向我的数据包 因为它有互联网连接 我使用下面的代码来完成我的工作 但它似乎不适用
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 屏幕开/关检测

    在这里 我试图确定屏幕是否打开 但按下电源锁定 解锁按钮时它似乎不起作用 应用程序运行没有错误 但 if else 中的代码似乎没有效果 Edited现在代码可以工作了 谢谢Olgun 但媒体播放器播放不会停止 并且每次在屏幕上 离屏时都会
  • SDK >=26 仍需要 mipmap/ic_launcher.png?

    在 Android 中 有两种指定启动器图标 可以说是应用程序图标 的方法 老 方式 在 mipmap 文件夹中指定不同的 png 文件 通常命名为 ic launcher png 但可以通过以下方式设置名称android icon mip
  • Glass 语音命令给定列表中最接近的匹配项

    使用 Glass 您可以通过 确定 Glass 菜单启动应用程序 它似乎会选择最接近的匹配项 除非命令相距数英里 并且您可以明显看到命令列表 无论如何 是否可以从应用程序内或从语音提示 在初始应用程序触发后 给出类似的列表并返回最接近的匹配
  • 无法使用文件提供程序从内部存储打开 PDF 以便在 Android 8 和 9 上查看

    仅适用于 Android 8 和 9 我这里有一个 PDF 文件管理器 String url file storage emulated 0 Android data com verna poc files Download mypdf p
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • 为什么带处理程序的连续自动对焦相机不允许切换相机闪光灯?

    到目前为止我所做的 我已经实现了用于读取二维码的自定义相机 需要继续聚焦相机以获得更好的二维码读取 我的问题当我使用处理程序每 秒聚焦一次时 相机闪光灯开 关按钮不起作用 或者打开和关闭相机闪光灯需要太多时间 当我删除每秒自动对焦相机的代码

随机推荐