Skip to main content

Android蓝牙

Android版本中蓝牙简介​

Android 平台包含蓝牙网络堆栈支持,此支持能让设备以无线方式与其他蓝牙设备交换数据。应用框架提供通过 Android Bluetooth API 访问蓝牙功能的权限。这些 API 允许应用以无线方式连接到其他蓝牙设备,从而实现点到点和多点无线功能。

  • BLE 与经典蓝牙的区别
  • BLE 的 Kotlin 下实践
  • 经典蓝牙(Classic Bluetooth)& 低功耗蓝牙(Bluetooth Low Energy)
  • 经典蓝牙可以用与数据量比较大的传输,如语音,音乐,较高数据量传输等。
  • BLE 特点就如其名,功耗更低的同时,对数据包做出了限制。所以适用于实时性要求比较高,但是数据速率比较低的产品,如鼠标,键盘,传感设备的数据发送等。

蓝牙 4.0 支持单模和双模两种部署方式,其中单模即是我们说的 BLE,而双模指的是 Classic Bluetooth + BLE 。 实际上,BLE 和经典蓝牙的使用等各方面都像是没有关联的两个东西,甚至因为 BLE 的通讯机制不同,所以是不能向下兼容的;经典蓝牙则可以兼容到蓝牙 3.0 / 2.1。

Android 应用可通过 Bluetooth API 执行以下操作:

  • 扫描其他蓝牙设备
  • 查询本地蓝牙适配器的配对蓝牙设备
  • 建立 RFCOMM 通道
  • 通过服务发现连接到其他设备
  • 与其他设备进行双向数据传输
  • 管理多个连接

蓝牙进行通信的四大必需任务:设置蓝牙、查找局部区域内的配对设备或可用设备、连接设备,以及在设备之间传输数据

Android系统版本中,蓝牙的变化有,但是不多,这里简要说明一下。​

  • Android1.5 中增加了蓝牙功能,立体声 Bluetooth 支持:A2DP [Advanced Audio Distribution Profile]、AVCRP [Audio/Video Remote Control Profile],自动配对。
  • Android2.0 中支持Bluetooth2.1协议。
  • Android3.0 中能让应用查询已经连接上 Bluetooth 设备的 Bluetooth Profile、音频状态等,然后通知用户。
  • Android3.1 中系统可以通过 Bluetooth HID 方式同时接入一到多款输入设备。
  • Android4.0 中新增支持连接 Bluetooth HDP [Health Device Profile)] 设备,通过第三方应用的支持,用户可以连接到医院、健身中心或者家庭等场合中的无线医疗设备和传感器。
  • Android4.2 中引入了一种新的针对 Android 设备优化的 Bluetooth 协议栈 BlueDroid,从而取代 BlueZ 协议栈。Bluedroid 协议栈由 Google 和 Broadcom 公司共同开发,相对于 BlueZ 协议栈,BlueDroid 提升了兼容性和可靠性。
  • Android4.3 中增加了对低功耗蓝牙的支持,内置支持 Bluetooth AVRCP 1.3,基于 Google 和 Broadcom 公司功能研发的针对于 Android 设备优化的新的蓝牙协议栈 BlueDroid。
  • Android4.4 中新增两种新 Proifle 支持:HID [Human Interface Device]、MAP [Message Access Profile]
  • Android5.0 中支持Bluetooth4.1协议。
  • Android6.0 中扫描蓝牙需要动态获取定位才行。
  • Android7.0 中支持Bluetooth4.2协议。
  • Android8.0 中支持Bluetooth5.0协议,强化了蓝牙音频的表现。比如编码/传输格式可选SBC、AAC、aptX/aptX HD、LDAC等四种,音质依次提高。
  • Android10.0 中支持Bluetooth5.1协议,在5.0的基础上,增加了侧向功能和厘米级定位服务,大幅度提高了定位精度。使室内定位更精准。
  • Android11.0 中支持Bluetooth5.2协议,增强版ATT协议,LE功耗控制和信号同步,连接更快,更稳定,抗干扰性更好。
  • Android12.0 中支持Bluetooth5.3协议,增强了经典蓝牙BR/EDR(基础速率和增强速率)的安全性。蓝牙5.3的延迟更低、抗干扰性更强、提升了电池续航时间。系统引入了新的运行时权限 BLUETOOTH_SCAN、BLUETOOTH_ADVERTISE 和 BLUETOOTH_CONNECT权限,用于更好地管理应用于附近蓝牙设备的连接。

低功耗蓝牙BLE(Bluetooth Low Energy()

Android 4.3(API Level 18)开始引入Bluetooth Low Energy(BLE,低功耗蓝牙)的核心功能并提供了相应的 API, 应用程序通过这些 API 扫描蓝牙设备、查询 services、读写设备的 characteristics(属性特征)等操作。

Android BLE 使用的蓝牙协议是 GATT 协议,有关该协议的详细内容可以参见蓝牙官方文档。以下我引用一张官网的图来大概说明 Android 开发中我们需要了解的一些 Bluetooth Low Energy 的专业术语。

img

蓝牙协议图

Service​

一个低功耗蓝牙设备可以定义许多 Service, Service 可以理解为一个功能的集合。设备中每一个不同的 Service 都有一个 128 bit 的 UUID 作为这个 Service 的独立标志。蓝牙核心规范制定了两种不同的UUID,一种是基本的UUID,一种是代替基本UUID的16位UUID。所有的蓝牙技术联盟定义UUID共用了一个基本的UUID: 0x0000xxxx-0000-1000-8000-00805F9B34FB 为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。例如,心率测量特性使用0X2A37作为它的16位UUID,因此它完整的128位UUID为: 0x00002A37-0000-1000-8000-00805F9B34FB

Characteristic​

在 Service 下面,又包括了许多的独立数据项,我们把这些独立的数据项称作 Characteristic。同样的,每一个 Characteristic 也有一个唯一的 UUID 作为标识符。在 Android 开发中,建立蓝牙连接后,我们说的通过蓝牙发送数据给外围设备就是往这些 Characteristic 中的 Value 字段写入数据;外围设备发送数据给手机就是监听这些 Charateristic 中的 Value 字段有没有变化,如果发生了变化,手机的 BLE API 就会收到一个监听的回调。

更详细的内容可以参见 GATT Profile 简介 通用属性配置文件(GATT)及其服务,特性与属性介绍 GATT specification GATT Services 蓝牙【GATT】协议介绍

Android BLE API 简介​

BluetoothAdapter BluetoothAdapter 拥有基本的蓝牙操作,例如开启蓝牙扫描,使用已知的 MAC 地址 (BluetoothAdapter#getRemoteDevice)实例化一个 BluetoothDevice 用于连接蓝牙设备的操作等等。

BluetoothDevice 代表一个远程蓝牙设备。这个类可以让你连接所代表的蓝牙设备或者获取一些有关它的信息,例如它的名字,地址和绑定状态等等。

BluetoothGatt 这个类提供了 Bluetooth GATT 的基本功能。例如重新连接蓝牙设备,发现蓝牙设备的 Service 等等。

BluetoothGattService 这一个类通过 BluetoothGatt#getService 获得,如果当前服务不可见那么将返回一个 null。这一个类对应上面说过的 Service。我们可以通过这个类的 getCharacteristic(UUID uuid) 进一步获取 Characteristic 实现蓝牙数据的双向传输。

BluetoothGattCharacteristic 这个类对应上面提到的 Characteristic。通过这个类定义需要往外围设备写入的数据和读取外围设备发送过来的数据。

参考文献:

官网classic蓝牙:https://developer.android.com/guide/topics/connectivity/bluetooth?hl=zh-cn

UUID​

UUID(Universally Unique Identifier)在 BLE(Bluetooth Low Energy)中用于标识蓝牙设备的特征和服务。

在 BLE 中,每个服务和特征都有一个唯一的 UUID。这些 UUID 用于识别和区分不同的服务和特征,以便蓝牙设备可以相互通信并交换数据。UUID 可以是 16 位、32 位或 128 位长,其长度与所代表的数据类型和标识符有关。

  • 服务 UUID:标识不同的服务,如心率监测、环境传感器、音频传输等。每个服务都有一个唯一的 UUID。
  • 特征 UUID:标识服务中的特定特征,如读取心率值、设置环境传感器参数等。每个特征也有一个唯一的 UUID。

使用 UUID 可以帮助蓝牙设备识别所需的服务和特征,并与其他设备进行交互。在 BLE 开发中,开发人员可以使用标准的 BLE UUID(如心率服务的 UUID、通用属性服务的 UUID 等),也可以定义自定义的 UUID 来满足特定的应用需求。

以往的 BLE 设备通信都需要事先知道设备的 UUID,但现在,多数 BLE 应用都开始采用 GATT(通用属性框架任务)协商服务(GATT discovery)来动态地获得服务和特征的 UUID。

综上所述,UUID 在 BLE 中起着唯一标识和区分不同服务和特征的作用,促进了蓝牙设备之间的通信和数据交换。

安卓相关蓝牙的包​

包名描述
android.bluetooth.le包含与蓝牙低功耗(BLE)广告和扫描相关的类和接口。
android.bluetooth包含与传统蓝牙(Classic Bluetooth)相关的类和接口。
android.bluetooth.gatt提供与蓝牙通用属性(GATT)相关的类和接口,用于实现BLE设备之间的通信。
android.bluetooth.a2dp包含与蓝牙音频分发(A2DP)相关的类和接口,用于管理蓝牙音频设备之间的连接和音频数据传输。
android.bluetooth.hid包含与蓝牙人机接口设备(HID)相关的类和接口,用于管理与蓝牙键盘、鼠标等输入设备之间的通信。