蓝牙 - BLE中的电池信息服务

本文围绕蓝牙GATT Server的电池服务展开,介绍了初始化Battery Service、注册回调函数、广播数据配置等操作。阐述了三个事件处理及对应操作,还给出参考协议栈代码获取方式。同时详细说明了Notify电池电量、初始化服务及GATT_ServerEventCallback处理的具体实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在目标设备的蓝牙模块启动时,作为GATT Server,要初始化Battery Service,并注册call back函数来处理Battery service相关的事件,callback函数名为BAS_Event_Callback。

然后在BLE GATT server设备向外发送广播数据时,在配置Service字段时,可以加入Battery Service的UUID值。按照大端存放,广播数据中的第一个字节是0x18,第二个是0x0F。

Assigned Numbers | Bluetooth® Technology Website中,3.4 GATT Services里,定义了BLE使用的各种服务的16bit UUID。其中Battery service的值是0x180F。

对于Battery Service, 是一个Service和一个Characteristic组成,Characteristic包含4个Attribute。

GATT Serve设备的电量信息可以通过Notify方式传递给GATT client的设备。需要GATT Server端的Battery level Characteristic的Client Configuration的属性值是支持NOTIFY的。

在事件处理的BAS event call back函数中,有三个事件:

typedef enum _tagBAS_Event_Type_t

{

   etBAS_Server_Read_Client_Configuration_Request,    /*!< Dispatched when a BAS Client requests read client configuration to a registered BAS Server. */

   etBAS_Server_Client_Configuration_Update,               /*!< Dispatched when a BAS Client requests to update client configuration to a registered BAS Server. */

   etBAS_Server_Read_Battery_Level_Request                 /*!< Dispatched when a BAS Client requests read battery level to a registered BAS Server. */

} BAS_Event_Type_t;

第一个事件,是GATT Client请求读取BAS GATT Server上已注册BAS服务的Battery Level Characteristic的Client Configuration的值。

第二个事件,是GATT Client请求更新BAS GATT Server上已注册BAS服务的Battery Level Characteristic的Client Configuration的值。

第三个事件,是GATT Client请求读取BAS GATT Server上已注册BAS服务的Battery Level Characteristic的值。

Client Configuration是GATT Server上的Characteristic里的一个属性(attribute),用来描述GATT Client的设置的。

这个属性的值以变量的数据形式存储在GATT Server上,一般由GATT Client发送请求来进行读取和写入,这个值用来表示此Characteristic值是否允许GATT server发起Notify或Indicate操作。比如将Battery level的值Notify给GATT Client。

默认值为0,GATT Server则不能使用Notify功能。

/* GATT Client Configuration Characteristic Definitions.             */

#define GATT_CLIENT_CONFIGURATION_CHARACTERISTIC_NOTIFY_ENABLE        0x0001

#define GATT_CLIENT_CONFIGURATION_CHARACTERISTIC_INDICATE_ENABLE      0x0002

所以GATT Server收到的前两个事件,就是GATT Client的关于Client Configuration的操作请求,一个是读取,一个是更新。

另外一个事件是GATT Client来读取Battery level的值。

这三个事件在BAS_Event_Callback里进行处理。收到etBAS_Server_Read_Client_Configuration_Request,会调用GATT_Read_Response,将值发送出去。

收到etBAS_Server_Client_Configuration_Update,将收到的值更新到本地。

收到etBAS_Server_Read_Battery_Level_Request,会将本地的Battery Level的值通过调用GATT_Read_Response,发送出去。

参考的蓝牙协议栈代码,可以访问TI网站:

TIBLUETOOTHSTACK-SDK Software development kit (SDK) | TI.com

下载TI的Bluetopia Protocol Stack。需要注册TI用户。

比如选择:MSP432 (CC256XMS432BTBLESW),CC256XMS432BTBLESW Driver or library | TI.com

下载后安装,在安装路径找到到蓝牙协议栈内容。找到里面的BAS.c和HOGPDemo.c,就有使用Battery Service的代码。

===== 分割线 =====

具体实现细节:

Array of GATT_Service_Attribute_Entry_t:

BTPSCONST GATT_Service_Attribute_Entry_t Battery_Service[] =

{

   {GATT_ATTRIBUTE_FLAGS_READABLE,          aetPrimaryService16,            (Byte_t *)&BAS_Service_UUID},

   {GATT_ATTRIBUTE_FLAGS_READABLE,          aetCharacteristicDeclaration16, (Byte_t *)&BAS_Battery_Level_Declaration},

   {GATT_ATTRIBUTE_FLAGS_READABLE,          aetCharacteristicValue16,       (Byte_t *)&BAS_Battery_Level_Value},

   {GATT_ATTRIBUTE_FLAGS_READABLE_WRITABLE, aetCharacteristicDescriptor16,  (Byte_t *)&Client_Characteristic_Configuration},

};

这个表有四个属性,第一个是Service的UUID值。Byte0 0x0F,Byte1 0x18,小端排列。

第二个是声明这个Characteristic,Byte0 0x19,Byte1 0x2A,小端排列。这个在Assigned Numbers文档里,3.8 Characteristics -> 3.8.1 Characteristics by Name,有一行定义。

Characteristic Name是Battery Level,UUID是0x2A19。

第三个是这个Characteristic的值,也是前面Notify Battery Level时,使用offset 2时就是发送的这个属性的通知。

第四个是,Client Configuration。这个在Assigned Numbers文档里,3.7 Descriptors, UUID是0x2902,表示Client Characteristic Configuration。

1,Notify Battery Level

调用函数:

int GATT_Handle_Value_Notification(unsigned int BluetoothStackID, unsigned int ServiceID, unsigned int ConnectionID, Word_t AttributeOffset, Word_t AttributeValueLength, Byte_t *AttributeValue);

传入参数:

BluetoothStackID // Stack ID

ServiceID    // Battery Service ID

ConnectionID // GATT Connection ID

AttributeOffset = BAS_BATTERY_LEVEL_ATTRIBUTE_OFFSET = 2

AttributeValueLength = 1

*AttributeValue = Battery Level

返回值:

ret_val = NON_ALIGNED_BYTE_SIZE = 1

2,Initialize Battery Service

调用函数:

int GATT_Register_Service(unsigned int BluetoothStackID, Byte_t ServiceFlags, unsigned int NumberOfServiceAttributeEntries, GATT_Service_Attribute_Entry_t *ServiceTable, GATT_Attribute_Handle_Group_t *ServiceHandleGroupResult, GATT_Server_Event_Callback_t ServerEventCallback, unsigned long CallbackParameter);

传入参数:

BluetoothStackID // Stack ID

ServiceFlags = GATT_SERVICE_FLAGS_LE_SERVICE

NumberOfServiceAttributeEntries = 4

ServiceTable = Array of GATT_Service_Attribute_Entry_t

BAS_Event_Callback_t  = GATT_ServerEventCallback  // In this GATT call back, it will cal BAS Event call back.

CallbackParameter = 1 // Instance ID for Application to refer the service info

传出参数:

ServiceHandleGroupResult // Starting Handle and Ending Handle

返回值:

ret_val = ServiceID 

3,GATT_ServerEventCallback 里的处理

主要是处理两个事件,一个etGATT_Server_Read_Request和etGATT_Server_Write_Request。

  • etGATT_Server_Write_Request

收到的是GATT Event。根据AttributeOffset,找到Attribute表格里的属性。需要判断这个属性是aetCharacteristicDescriptor16,也就是要写入的是Client_Characteristic_Configuration。

再根据GATT Event中的AttributeValueLength和AttributeValue值,构造一个BAS_Client_Configuration_Update事件发给BAS Event call back,即etBAS_Server_Client_Configuration_Update。

  • etGATT_Server_Read_Request

如果读取的是Client Configuration,则构造一个etBAS_Server_Read_Client_Configuration_Request的BAS_Event_Data_t,发给BAS Event call back函数,请求读取Client Configuration的值。

如果读取的是Battery Level Attribute,则构造一个etBAS_Server_Read_Battery_Level_Request的BAS_Event_Data_t,发给BAS Event call back函数,请求读取Battery Level的值。

### ATK-BLE03 蓝牙模块概述 ATK-BLE03 是一款基于低功耗蓝牙BLE)技术的模块,适用于短距离无线通信场景。它通常被设计用于物联网设备、可穿戴设备以及需要低功耗特性的应用场合[^1]。 #### 主要特性 - **协议版本**:该模块支持 Bluetooth 4.0 或更高版本的 BLE 协议。 - **工作模式**:作为低功耗蓝牙模块,其核心功能在于提供超低功耗的数据传输能力,适合电池供电的应用环境。 - **接口形式**:具备 UART 接口,能够通过串口与其他微控制器或主机设备进行数据交互。 - **波特率设置**:类似于 HC-04 模块,默认波特率为 9600 bps (无校验位、8 位数据位、1 停止位)[^2]。然而具体到 ATK-BLE03 的配置可能有所不同,请参照产品文档确认实际参数。 #### 使用方法与注意事项 ##### 配置串口参数 当连接 ATK-BLE03 至其他硬件平台时,需确保双方具有匹配的串口通讯设定。如果目标系统采用标准工业级默认值,则可以尝试初始化为常见的速率组合比如 `9600, N, 8, 1` 来建立初步联系后再调整至更高速度以便提升效率[^2]。 ##### AT指令集操作 大多数BLE模块都提供了相应的命令集合来实现特定的功能控制,例如修改名称、PIN码或者切换角色等功能。对于 ATK-BLE03 ,可以通过发送指定格式的字符串消息激活这些预定义好的动作序列完成个性化定制需求。以下是几个常用的通用型例子: ```plaintext // 设置设备名 AT+NAME=MyDeviceName\r\n // 查询当前连接状态 AT+STATE?\r\n // 进入透传模式 AT+MODE=0\r\n ``` > 注:每条命令后面都需要加上回车符(\r)和换行符(\n),这是为了满足终端解析器的要求。 #### 数据手册获取途径 关于详细的规格描述和技术细节应该查阅厂商发布的正式资料文件——《ATK-BLE03 用户指南》或者是《技术参考手册》,它们会详尽列举电气特性、物理尺寸图样以及其他重要指标等内容。这类资源一般可以从生产制造商官网下载得到。 #### 驱动程序安装指导 由于此款器件主要是面向嵌入式开发领域而打造出来的外设组件之一,在PC端并不像USB那样直接识别驱动即可使用,而是依赖应用程序层面的支持来进行管理运作。因此,“驱动”的概念更多体现在如何编写合适的固件代码去适配它的行为逻辑方面而非传统意义上的操作系统级别加载项。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值