繁体   English   中英

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

[英]How should I manage Bluetooth connections in Android?

问: 管理蓝牙连接的最佳做法是什么?

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

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

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

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

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

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

视频1

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

教程

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

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

:)


编辑


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

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

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

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

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


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

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

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

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

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

    • 也许它就像discoverOptions()之类的东西
  5. 伟大的事情将是知道你的设备“通信代码”或至少我这样称呼他们。

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

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

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

重要:

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

原帖...

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

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

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

蓝牙LE的视频

(涵盖一堆随机的东西)

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

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

保持连接打开

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

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

I / O Streams连接

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

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

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

...但继续注意到读写会相互阻塞。 我仍需要进一步研究的东西。 好像你不能同时在同一个插槽上进行I / O ???

最大连接数

我还查看了Stuci添加的最大连接问题,并且在Android端没有找到任何文档。 它可能存在,我找不到它。 但是,大多数人似乎都同意,无论您编写什么硬件,都存在限制(可能低至4)。 一些值得注意的链接: - 我们可以通过BLE蓝牙与Android配对多少台设备? - 我们一次可以通过蓝牙与Android设备配对多少台设备? - https://groups.google.com/forum/#!topic/android-developers/adeBD275u30

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM