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

时间:2015-03-24 02:27:16

标签: java android bluetooth connectivity

Q值。 管理蓝牙连接的最佳做法是什么?

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

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

我之前从未使用外部设备编码连接。我用了两个星期的时间来绕过扫描附近蓝牙设备的代码并将它们扔进ListView。听众,广播和适配器!

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

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

2 个答案:

答案 0 :(得分:5)

对不起简短的回答,但是从我使用蓝牙API的练习中,我发现这个视频描述的东西非常好(完全是个人意见......)

Video 1

此外,如果您没有任何以前的经验,这将非常有用

Tutorial

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

再次为这次短缺感到抱歉,但我相信,如果你检查这些,至少你的大多数问题和疑虑都会得到解答!

:)


修改


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

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

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

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

  • 持续读取手机与BLE设备之间的强度信号(为aprox。距离)


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

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

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

    • 要区分设备(可能你周围有很多:) :)你可以使用BLE设备的名称或UUID或......最好 - 使用名称;)
  3. 在两个设备相互连接后,您可以启动Gatt通信。使用状态机的方法对我来说有点太过分了。但无论如何,通信是通过字节完成的(在我的情况下......)

  4. 在其中一个视频/资源中,至少对我来说有一些特定且非常有用的东西!说实话,我并不完全记得它,但想法是在任何通信之前,建议您阅读/获取BLE设备或类似设备的所有选项......

    • 也许它就像discoverOptions()之类的东西
  5. 很棒的事情是了解您的设备“通信代码”,或者至少我称之为通信代码。

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

  6. 我真的希望这在某种程度上有所帮助!

    请注意 这完全取决于我的经验,可能存在一些不匹配或错误的术语,但这就是我个人看到的东西,因为我的项目很久以前,我不记得大部分内容。

答案 1 :(得分:3)

重要:

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

原帖...

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

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

请打电话给我任何不正确的事情。

蓝牙LE的视频

(涵盖一堆随意的东西)

虽然我“不喜欢”代码视频: - 我看了它,因为它被推荐......我很高兴我做到了。虽然不是很有帮助但它确实引入了一些我不知道的概念。由于我的目标是旧的Android设备(v8 +),因此LE功能无关紧要。

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

保持连接打开

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

  1. 了解功耗。
    • 让适配器处于活动状态只会消耗额外的电量。如果可以在不“绝对需要”的情况下关闭适配器,则可以节省电池电量。
  2. 管理意外断开连接。
    • 除了连接连接外,还可以断开连接。定期重新连接以确保连接正常。
    • 在用于I / O的线程中,可以检查断开连接并重新连接(可能启动新线程)。
  3. I / O Streams连接

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

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

    1. 分别通过getInputStream()和getOutputStream()获取通过套接字处理传输的InputStream和OutputStream。
    2. 使用read(byte [])和write(byte [])读取和写入数据流。
    3. ...但继续注意到阅读&互相写块。我仍需要进一步研究的东西。看起来你不能同时在同一个插槽上进行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