我应该如何在 Android 中管理蓝牙连接?

Posted

技术标签:

【中文标题】我应该如何在 Android 中管理蓝牙连接?【英文标题】:How should I manage Bluetooth connections in Android? 【发布时间】:2015-03-24 02:27:15 【问题描述】:

问。 您在管理蓝牙连接方面的最佳做法是什么?

我已阅读 android 蓝牙指南和许多蓝牙连接教程。对封装设计和最佳实践没有帮助。

我应该什么时候打开/关闭连接? 与单个蓝牙设备的“连接”是否称为“套接字”连接? 单个连接可以在监听的同时发送数据吗? (...或在侦听状态之间)。

我以前从未编写过与外部设备的连接。我花了两个星期的时间来研究扫描附近蓝牙设备并将它们放入 ListView 的代码。侦听器、广播和适配器!

我的项目将在蓝牙收据打印机上每 15 分钟打印 1-40 张收据。目前,安全不是问题。在同一连接上,它还将接收数据(同时发送和接收似乎不是必需的,但很有用)。我还不确定这些设备是如何在这个单一的加密狗设备上配置的,但我猜这些设备是通过 USB 控制器连接到加密狗的。

到目前为止,我有 1 个对象来管理单个 I/O 连接。我静态地打开一个活动来选择一个连接(稍后将 labelmacpin 保存在数据库中)。根据教程,我有“打开”、“收听”、“发送”和“关闭”方法。 让我困惑的是“如何”使用这些功能。我可以让连接全天(10 小时)打开并每 3 分钟使用一次吗?我应该在发送或请求数据时打开/关闭连接吗?我在哪里可以检测到需要重新连接?

【问题讨论】:

不分心,不闲聊(阅读help→tour) 是的,没有干扰或闲聊。我不想要与蓝牙连接无关的主题。 merriam-webster.com/dictionary/chitchat我确实有提供太多信息的习惯,但是由于我刚刚扫描连接时遇到了所有麻烦,因此了解如何处理蓝牙连接将非常有用。 【参考方案1】:

很抱歉简短的回答,但从我对蓝牙 API 的实践中,我发现这个视频描述的东西非常好(完全个人意见......)

Video 1

此外,当您以前没有任何经验时,这很有用

Tutorial

最后在***查看这个问题,它有很多很好的参考和例子!!

再次对短缺感到抱歉,但我相信如果您查看这些内容,至少您的大部分问题和疑虑都会得到解答!

:)


编辑


所以,让我描述一下并分享一些我的经验。

我编写了一个与具有 3 个功能的 BLE 设备通信的应用程序

双面事件驱动按钮(按下手机上的按钮 -> 向设备触发事件;按下 BLE 设备上的按钮 -> 向手机触发事件)

从手机发送请求 -> BLE 设备以当前电池百分比应答

连续读取手机与 BLE 设备之间的强度信号(近似距离)


到目前为止一切顺利,现在基本方法是:

    搜索 BLE 设备(蓝牙搜索或“发现”附近的蓝牙设备)

    这里你需要安卓权限!

    选择您要连接的设备

    要区分设备(也许您周围有很多 :))您可以使用 BLE 设备的名称或 UUID 或...最好 - 使用名称 ;)

    两台设备相互连接后,您就可以开始 Gatt 通信了。状态机的方法对我来说有点过分了。但无论如何,通信是通过字节完成的(在我的情况下......)

    在其中一个视频/资源中,有一些具体的内容,至少对我很有帮助!老实说,我记不太清了,但我的想法是,在进行任何通信之前,建议从 BLE 设备或类似设备中读取/获取所有选项……

    可能是discoverOptions() 之类的东西

    知道您的设备“通信代码”或者至少我是这样称呼它们是一件好事。

    查看此链接,例如:Link ** 现在您可以看到带有有用信息的表格!例如。如果你想读取电池电量,你导航到这个页面,发现为了读取电池,服务名称是 UUID XXXXX,你需要发送 0x01 到 BLE 设备,它会用一些“应答”你的电话再次以字节为单位的数据。

我真的希望这会有所帮助!

请注意 这完全来自我的经验,可能存在一些不匹配或错误的术语,但这是我个人的看法,因为我的项目是很久以前的,我不记得确切的大部分内容。

【讨论】:

只是要注意一些重要的事情,根据我的经验,蓝牙活动连接的最大数量(尤其是低功耗蓝牙)硬编码为 6!在这个数字之后,结果是不可预测的:) 谢谢!发布了笔记,但将您的笔记标记为我的答案。希望以这种方式发帖没问题。这是很多信息要经过。 ;)【参考方案2】:

重要提示:

这只是上面 STUCI 提供的链接的摘要。此后,他更新了他的答案,并且 我没有 在今年夏天更新/编辑。我的摘要中的主题不是解释性的,而是提供参考和帮助产生具体问题。

原帖...

谢谢斯图西!其中一些是有帮助的:- 有些没有。我认为最好收集我的想法,看看已经解释了什么,如果有什么没有解释。

(我不能在评论中发布这么多,抱歉)

如有任何不正确之处,请致电给我。

低功耗蓝牙视频

(涵盖一堆随机的东西) 虽然我“不喜欢”代码视频:- 我观看它是因为它被推荐……我很高兴我做到了。虽然不是很有帮助,但它确实介绍了一些我不知道的概念。由于我的目标是旧的 android 设备 (v8+),因此 LE 功能无关紧要。

推送数据:[取决于源功能集],不需要持续提取数据(例如使用温度传感器),但某些设备可以在更改时将其“推送”到设备。似乎使用了“广告”的设计理念。 UUID 定义连接设备的服务和/或特征。 可以在(到)连接的设备上写入配置。 似乎只是可以通过蓝牙分配的“设置”的特性。不确定这(约 19 分钟)是否适用于非 gatt 连接,但似乎类似于控制 的状态机 广告似乎是关于设备当前状态或配置的“元数据”(约 24 分钟)。同样,不确定这是否适用于非 LE 蓝牙。

保持连接打开

蓝牙连接确实可以保持打开状态;从成功调用“startActivityForResult(...)”方法的那一点开始。 有两个基本因素会影响一个人是否想要保持打开的连接:

    了解功耗。 使适配器处于活动状态只会消耗额外的电量。如果可以在适配器不是“绝对需要”时将其关闭,这将大大节省电池电量。 意外断开连接得到管理。 除了保持连接持续连接外,还可以在指定的时间间隔定期断开连接并重新连接,以确保连接正常。 在用于 I/O 的线程中,可以检查是否断开连接并重新连接(可能会启动一个新线程)。

I/O 流公关连接

单个连接确实可以“拥有”同时输入和输出流。我

由于有人建议,我重新阅读了 Android 的蓝牙指南,并在“管理连接”(谈论单个套接字)下注意到了这一点......

    分别通过 getInputStream() 和 getOutputStream() 获取处理通过套接字传输的 InputStream 和 OutputStream。 使用 read(byte[]) 和 write(byte[]) 在流中读取和写入数据。

...但继续注意读写相互阻塞。我还需要进一步研究。好像不能在同一个socket上同时I/O???

最大连接数

我还查看了 Stuci 添加的最大连接问题,但没有发现 Android 端的文档。它可能存在,我找不到它。但是,大多数人似乎都同意,无论您编写什么硬件,都有一个限制(可能低至 4 个)。 一些值得注意的链接: - How many devices we can pair via Bluetooth of BLE to Android? - How many maximum device can we pair via Bluetooth to android device at a time? - https://groups.google.com/forum/#!topic/android-developers/adeBD275u30

【讨论】:

以上是关于我应该如何在 Android 中管理蓝牙连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Android蓝牙开发

蓝牙低能耗清单

如何在后台的两个 android 活动之间交换数据以通过蓝牙发送数据?

如何检查android中其他设备的蓝牙是不是打开/关闭?

多个蓝牙连接

Android 低功耗蓝牙 - 如何访问之前配对的设备?