Android BLE 蓝牙控制硬件设备(一)代码结构

更新日期: 2023-07-07 阅读次数: 565 字数: 990 分类: Android

没想到这个月的开发工作全部是 Android 平板相关,而且都要用到 BLE 蓝牙,一个是控制设备运行,一个是蓝牙对讲。

看来之前练手写的那个 Android BLE 调试工具真是派上用场了,大部分代码可以复用上。

需求

用 Android 平板通过 BLE 低功耗蓝牙控制硬件设备,例如,开始、暂停、显示运行状态等。

功能非常简单,时间就两个 fragment 界面就能搞定:

  • 蓝牙设备列表页 (List Fragment)。用于显示扫描出来的附件蓝牙设备
  • 具体设备的控制界面 (Home Fragment)。用于显示实时运行数据,及控件按钮

交互逻辑

打开 Android 平板 App 时,先显示 Home Fragment,即控制界面。

  • 判断已经连接到蓝牙设备时,进行运行状态查询。
  • 判断未连接到蓝牙设备时,跳转到 List Fragment,扫描附件设备,选择后,进行蓝牙配对,然后进入 Home Fragment

代码结构

由于要在两个 Fragment 间共享蓝牙设备状态,即共享 BluetoothGatt, 所以需要放到一个全局可以访问的地方。

问了一下 ChatGPT:

在 Android 应用程序中,如果多个 Fragment 都需要共享同一个 BLE BluetoothGatt 对象,可以考虑使用以下设计模式或技术:

  1. 使用单例模式:可以使用单例模式来创建 BLE BluetoothGatt 对象,并确保在应用程序的整个生命周期内只创建一个对象实例。这样,所有 Fragment 都可以访问同一个对象,以便共享 BLE 连接状态和数据。
  2. 使用 ViewModel:使用 Android Architecture Components 中的 ViewModel 可以帮助组织和管理应用程序的 UI 和数据,以及在 Fragment 之间共享数据。您可以将 BLE BluetoothGatt 对象保存在一个 ViewModel 中,并在需要访问该对象的 Fragment 中共享该 ViewModel。
  3. 使用外部类:可以创建一个单独的 Java 类,用于管理 BLE 连接和数据传输,并将该类的实例传递给所有需要访问 BLE 连接的 Fragment。这样,所有 Fragment 都可以使用同一个 BLE 连接,而无需创建多个 BluetoothGatt 对象。

无论选择使用哪种方法,都需要确保在应用程序的整个生命周期中只存在一个 BluetoothGatt 对象,并采取必要的措施来避免并发访问问题。此外,在访问 BluetoothGatt 对象时,需要小心处理可能出现的异常情况,并确保在不需要使用 BluetoothGatt 对象时及时关闭连接以释放资源。

而之前写的 BLE 调试助手的经验是,用第二套方案就挺好。

即,BluetoothGatt 放到 Main Activity 关联的 ViewModel 中,在 Fragment 中访问这个 ViewModel 即可。

BluetoothGatt

BluetoothGatt 是 Android 平台上用于连接和与 Bluetooth LE 设备进行通信的 API。它提供了一组方法,用于管理 BLE 连接、发现服务和特征,以及读取、写入和监听 BLE 特征的变化等操作。具体包括:

  1. 连接 BLE 设备:使用 BluetoothGatt 连接到 BLE 设备,并管理 BLE 连接的状态和生命周期。这包括发现设备服务、特征和描述符,并监听连接状态的变化。
  2. 发现服务和特征:使用 BluetoothGatt 发现 BLE 设备上的服务、特征和描述符。这可以帮助您了解 BLE 设备支持的功能和数据结构。
  3. 读取和写入特征:使用 BluetoothGatt 读取和写入 BLE 设备上的特征值。这可以帮助您从 BLE 设备中读取数据,或将数据发送到 BLE 设备。
  4. 监听特征变化:使用 BluetoothGatt 监听 BLE 设备上的特征变化,并在特征值发生变化时接收通知。这可以帮助您实时地获取 BLE 设备的数据更新或状态变化。

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式