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

How should I manage Bluetooth connections in Android?

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

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

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

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

到目前为止, 我有 1 个对象来管理单个 I/O 连接。我静态地打开一个 activity 到 select 的连接(稍后保存 labelmac,和数据库中的 pin)。根据教程,我有 "open"、"listen"、"send" 和 "close" 方法。 让我感到困惑的是 "how" 使用这些功能。 我可以让连接全天(10 小时)打开并每 3 分钟使用一次吗?我应该在发送或请求数据时 open/close 连接吗?我在哪里可以检测到需要重新连接?

不好意思回答这么短,但是根据我对蓝牙的实践API,我发现这个视频描述的东西非常好(完全是个人意见...)

Video 1

此外,如果您以前没有任何经验,这也很有用

Tutorial

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

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

:)


编辑


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

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

  • 双面事件驱动按钮(按下 phone 上的按钮 -> 事件被触发到设备;按下 BLE 设备上的按钮 -> 事件被触发到 phone)

  • 从 phone 发送请求 -> BLE 设备以当前电池百分比回答

  • 持续读取 phone 和 BLE 设备

  • 之间的强度信号(近似距离)

到目前为止一切顺利,现在的事情是,基本的做法是:

  1. 搜索 BLE 设备(蓝牙搜索或 "discovery" 附近的蓝牙设备)

    • 这里你需要android权限!
  2. 选择您要连接的设备

    • 为了区分设备(也许你周围有很多设备:))你可以使用 BLE 设备的名称或 UUID 或者...最好 - 使用名称 ;)
  3. 两个设备相互连接后,您就可以开始Gatt通信了。状态机的方法对我来说有点过分了。但无论如何,通信是通过字节完成的(在我的例子中......)

  4. 其中一个 videos/resources 有一些特别的东西,至少对我来说非常有帮助!老实说,我记不太清了,但我的想法是,在进行任何通信之前,建议 read/get 来自 BLE 设备或类似设备的所有选项...

    • 也许是 discoverOptions() 之类的东西
  5. 了解您的设备是件好事 "communication codes" 或者至少我是这样称呼它们的。

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

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

请注意 这完全是根据我的经验得出的,可能会有一些不匹配或错误的术语,但这是我个人的看法,因为我的项目是很久以前的事了,所以我不记得大部分内容了。

重要提示:

这只是 STUCI 提供的上述链接的总结。他已经更新了他的答案,我没有 updated/edited 这个夏天。我的总结中的主题不是解释性的,而是提供参考和帮助产生具体问题。

原始Post...

谢谢斯图奇!其中一些有帮助:- 有些没有。我认为最好整理一下我的想法,看看已经解释了什么,如果还没有。

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

有任何不正确的地方请给我打电话。

低功耗蓝牙视频

(涵盖了一堆随机的东西)

当我 "dont-like" 代码视频时:- 我观看它是因为有人推荐它……我很高兴我看了。虽然不是很有帮助,但它确实介绍了一些我不知道的概念。由于我的目标是旧 android 设备 (v8+),因此 LE 功能无关紧要。

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

保持连接打开

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

  1. 了解功耗。
    • 激活适配器只会消耗额外的电量。如果可以在适配器未关闭时保持关闭状态,"absolutely-needed" 将大大节省电池电量。
  2. 意外断开连接得到管理。
    • 除了保持连接持续连接外,还可以按指定的时间间隔定期断开连接并重新连接,以确保连接正常。
    • 在用于 I/O 的线程中,可以检查断开连接并重新连接(可能启动一个新线程)。

I/O 流 pr 连接

单个连接确实可以 "have" 同时输入和输出流。我

因为有人建议,我重新阅读了 Android 的蓝牙指南,在 "managing a connection"(谈论单个插座)下,我注意到了这一点...

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

...但继续注意读写相互阻塞。我仍然需要进一步研究的东西。好像你不能在同一个插座上同时 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