【蓝牙协议栈】【BLE】【BAS】蓝牙电池服务
蓝牙电池服务(Bluetooth Battery Service)介绍
蓝牙电池服务是蓝牙设备与其他设备通信时用于报告其剩余电池电量的标准服务。它让用户能够随时了解蓝牙设备(如无线耳机、智能手表、蓝牙鼠标/键盘等)的电池状态,从而方便地管理这些设备的续航与电源使用。
BAS通常用于在一个电池(可由一个或多个电芯组成)连接于一台设备的语境下暴露其电量及其他信息。当一台设备有多个需要监控的电池时应支持多个BAS实例,每个BAS实例对应一个电池。以下例子展示使用BAS的各种方式,在每种方式中电池可以是可拆装的。
图1展示含有一个电池的手机支持一个BAS实例的例子。
图2和图3分别展示在由两台设备组成的一个系统中支持BAS的例子。图2中的两个耳塞在物理上是分离的,图3中的平板和平板键盘在物理上是可拆装的。两图中的每一台设备均有一个电池、BAS服务实例和GATT服务器。
图2: 在两台物理上分离的设备上使用BAS
蓝牙电池服务的背景
作为物联网和移动设备越来越普及的一部分,电池供电的蓝牙设备(如耳机、健身追踪器、智能穿戴设备等)需要一种标准化的方式将其电池状态和电量信息反馈给用户设备(如手机、平板或电脑)。为了实现这一功能,蓝牙规范定义了电池服务(Battery Service,UUID: 0x180F),该服务的核心作用是提供实时电量信息,如剩余百分比。
这项服务的结构简化了蓝牙设备报告电池信息的工作,并且统一了使用标准,使它们能够跨设备互操作。
电池服务的核心概念
电池服务属于**蓝牙低功耗(Bluetooth Low Energy, BLE)中的GATT(通用属性协议)**服务之一。蓝牙通信采用 GATT 协议来定义如何在蓝牙设备之间交换数据。它通常通过如下几个要素工作:
1. 电池服务 UUID(Battery Service UUID)
- 蓝牙电池服务的唯一标识符是 UUID:0x180F。
- 蓝牙设备使用此服务 UUID 来标识它是在发布电池信息。
2. 电池电量特征(Battery Level Characteristic)
- 电池电量特征的 UUID 是 0x2A19,用于表示设备的剩余电量百分比。
- 该特征的值是一个 8位的无符号整数字节(0 到 255),但通常它的有效范围是 0 到 100,代表百分比电量(0 表示没有电量,100 表示电量满格)。
3. 通知与订阅机制
- 主设备(如手机或计算机)可以订阅电池服务中的电量特征,以便接收电池电量的通知。这意味着当电池电量有变化时,设备会主动推送更新,而不需要主设备一直查询。
主要功能
蓝牙电池服务的主要功能是:
- 报告电量状态:报告设备如耳机、鼠标、智能手表等的电力剩余百分比,便于用户了解设备电量情况。
- 实时监控:客户端可以订阅电池电量的变化,并在电池电量变化时接收到通知(Notification)。
电池服务组件
-
Battery Service UUID (0x180F):
电池服务的唯一标识符,用于标识这个服务。 -
Battery Level Characteristic UUID (0x2A19):
电池电量百分比的特征值,用来告诉客户端设备的当前电量。这个值是一个 8 位的无符号整数,表示当前电量的百分比(范围是 0 至 100)。
电池服务的典型工作流程概述
-
连接与服务发现
当主设备(例如手机)与蓝牙从设备(例如无线耳机)成功连接后,主设备会扫描并发现从设备上所包含的 GATT 服务,找到并识别出电池服务。 -
读取电池电量
主设备可以通过 GATT 读取蓝牙从设备的电池电量特征值,即Battery Level
特征。这通常是一个字节,表示电量剩余的百分比。 -
订阅电池电量变化
为了监控电池电量的变化,主设备可以启用通知。当电池电量发生变化时,蓝牙设备会通过通知机制推送新的值到主设备,而不需要主设备反复轮询查询。 -
电池电量通知
当设备的电量变化(例如从 80% 变为 75%)时,主设备会通过启用的通知机制自动接收到这些变化信息。在一些高级设备上,这些变化会以弹窗或 GUI 元素的形式提醒用户。
常见设备中的蓝牙电池服务
蓝牙电池服务广泛应用于各种蓝牙设备,帮助用户获取实时的电量信息,常见的设备包括:
- 无线耳机:蓝牙耳机或 TWS(真无线立体声)耳机可通过此服务将剩余电量显示在主机设备(如手机)上。
- 智能手表与健身腕带:这些设备通常通过蓝牙实时同步健康数据,电池服务则额外报告设备的剩余电量,方便用户计划充电工作。
- 蓝牙鼠标和键盘:蓝牙外设常常依赖电池供电,电池服务可以帮助用户在设备电量低时获得通知,避免突然断电导致的工作中断。
- 蓝牙手柄和游戏控制器:为玩家提供低电量提示,确保在游戏过程中设备不会突然断开。
电池服务的优势
-
统一的电池电量报告标准:
蓝牙电池服务提供了一个标准化的方式,使得包括智能设备、音频设备和外设等各种不同类型的设备都可以通过相同的服务向主设备报告电池电量。 -
节省设备资源:
蓝牙低功耗技术由于其低数据传输速率和较少的功耗特性,使得它比传统蓝牙更加适合电池供电的设备。通过电池服务,设备可以采用即时(Notification
)的方式报告电量变化,而无需主设备频繁轮询从设备,减少了通信的冗余和功耗。 -
提高用户体验:
对于用户来说,电池服务优化了多设备使用体验。在电量过低时,系统可以提前通知用户进行充电,避免突然没电的尴尬情况。现代操作系统(如 Android、iOS)甚至可以通过图形界面实时显示蓝牙外设的电量,进一步提升了易用性。
工作原理示意图
+-------------------------------+
| 主设备 (Host Device) |
| |
| +----------------------+ |
| | 电池服务客户端 |<---------+
| +----------------------+ | |
| | |
+-------------------------------+ |||
+-------------------------------+ |
| 从设备(Peripheral Device) | |
| | |
| +------------------------+ | |
| | 蓝牙电池服务 |--------->+
| +------------------------+ |
| | 电池电量特征 (Percent) |-->---|
| +------------------------+ |
| |
+-------------------------------+
读取电量等级的具体步骤:
客户端发送读取请求:客户端设备通过GATT层向服务器设备发送一个读取请求,请求读取“Battery Level”Characteristic的值。
服务器响应:服务器设备接收到请求后,会检查“Battery Level”Characteristic的Client Configuration Descriptor,确保其设置为NOTIFY或INDICATE模式。如果设置正确,服务器会通过Notify或Indicate机制将当前的电量信息发送给客户端设备。
客户端处理数据:客户端设备接收到电量信息后,将其转换为电量百分比或其他相关格式进行显示。
电量信息的格式和单位:
电量信息通常以百分比形式表示,范围从0%到100%。在某些情况下,电量值可能会乘以2后再发送,例如20%的电量会发送为40。
代码实现示例
以下是一个简单的蓝牙电池服务在 Python 中使用 bluepy
库的示例。假设你已经与蓝牙设备配对并知道设备的地址。
from bluepy.btle import Peripheral# 蓝牙设备的地址
device_address = "XX:XX:XX:XX:XX:XX" # 替换为你的蓝牙设备地址# 电池服务和电池电量特征的UUID
BATTERY_SERVICE_UUID = "180F"
BATTERY_LEVEL_UUID = "2A19"# 连接到蓝牙设备
device = Peripheral(device_address, "public")# 发现特定服务
battery_service = device.getServiceByUUID(BATTERY_SERVICE_UUID)# 获取电池电量特征
battery_level_char = battery_service.getCharacteristics(BATTERY_LEVEL_UUID)[0]# 读取电池电量
battery_level = battery_level_char.read()
battery_level = int.from_bytes(battery_level, byteorder='little')print(f"当前电池电量: {battery_level}%")# 断开连接
device.disconnect()
电池服务与蓝牙协议版本
蓝牙电池服务是在**蓝牙低功耗(Bluetooth Low Energy, BLE)**规范下建立的,它首次定义于蓝牙 4.0 版本协议中,而这一技术随着蓝牙 4.0 及以后主流技术的推行而得到了广泛应用,如蓝牙 5.0、5.1 技术标准中,BLE 及其电池服务应用更加成熟。
未来展望
随着蓝牙设备越来越多,电池信息变得愈发重要,尤其是在一些低功耗设备和智能设备中。蓝牙电池服务为这些设备提供了一种标准化的方式,使设备和用户能够及时准确地获取电池状态,不仅改善了用户体验,还帮助用户合理管理设备的电量使用。
总结
蓝牙电池服务是蓝牙低功耗协议中的重要服务,统一了蓝牙设备如何向主机报告电池电量信息的方式。通过标准化的电量报告机制,主设备能够实时监控附加蓝牙设备的电量状态,从而优化用户体验,提升蓝牙设备的持续使用管理能力。这项服务用于多种常见蓝牙设备,比如耳机、鼠标、键盘和智能手表等,帮助用户直观获得电池信息,并及时进行充电管理。电池电量特征通过 GATT 协议提供,对于开发者和设备厂商来说,实现该服务能够显著提高设备的用户体验。