DA1458x BASS Database的组成结构 -- Battery Service 分析(一)

Overview

本文基于DA1458x SDK 5.0.4。
Battery Service 以下简称BAS or BASS。BASS的代码主要有以下两个组C文件组成
BASS
另,BASS是依赖于APP_TASK任务来调度管理的。具体框架如下图(摘自Dialog官方文档)
DA1458X_SDK_ARCH

Full BAS Database Description (BAS Database 分析)

BASS的Database的变量名为 bas_att_db,由以下5个成员组成

No.NameDescription
1BAS_IDX_SVCBattery Service Declaration
2BAS_IDX_BATT_LVL_CHARBattery Level Characteristic Declaration
3BAS_IDX_BATT_LVL_VALBattery Level Characteristic Value
4BAS_IDX_BATT_LVL_NTF_CFGBattery Level Characteristic - Client Characteristic Configuration Descriptor
5BAS_IDX_BATT_LVL_PRES_FMTBattery Level Characteristic - Characteristic Presentation Format Descriptor

这个变量非常重要,本文我们就围绕着它来一步步来分析。

bas_att_db结构体数组索引

首先这是一个结构体数组的索引,该索引采取的是枚举类型,方便阅读和理解。

/// Battery Service Attributes Indexes
enum
{
    BAS_IDX_SVC,

    BAS_IDX_BATT_LVL_CHAR,
    BAS_IDX_BATT_LVL_VAL,
    BAS_IDX_BATT_LVL_NTF_CFG,
    BAS_IDX_BATT_LVL_PRES_FMT,

    BAS_IDX_NB,
};

接下来我们看下attm_desc这个结构体的定义

struct attm_desc 结构体的定义

这个结构体的定义如下

 /// Attribute description (used to create database)
 struct attm_desc
 {
     /// Element UUID
     uint16_t uuid;
     /// Attribute permission
     uint16_t perm;
     /// Maximum length of the element
     att_size_t max_length;
     /// Current length of the element
     att_size_t length;
     /// Element value array
     uint8_t* value;
 };

我们可以看到,第一个成员是16位UUID,用来记录这个Attribute(属性)的UUID;
第二个成员是Attribute permission(属性权限);
第三个成员是Maximum length of the element(元素的最大长度);
第四个成员是Current length of the element(当前元素的长处);
第五个成员是Element Value array(元素数组)。

uuid和perm为16bit无符号整型变量,value为uint8_t数组指针,att_size_t类型其实uint16_t

/// Attribute length type
typedef uint16_t att_size_t;

bas_att_db定义

定义如下(bass.c文件中)

/*
 * BAS ATTRIBUTES DEFINITION
 ****************************************************************************************
 */

/// Full BAS Database Description - Used to add attributes into the database
const struct attm_desc bas_att_db[BAS_IDX_NB] =
{
    // Battery Service Declaration
    [BAS_IDX_SVC]                  =   {ATT_DECL_PRIMARY_SERVICE, PERM(RD, ENABLE), sizeof(bas_svc),
                                        sizeof(bas_svc), (uint8_t *)&bas_svc},

    // Battery Level Characteristic Declaration
    [BAS_IDX_BATT_LVL_CHAR]        =   {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(bas_batt_level_char),
                                        sizeof(bas_batt_level_char), (uint8_t *)&bas_batt_level_char},
    // Battery Level Characteristic Value
    [BAS_IDX_BATT_LVL_VAL]         =   {ATT_CHAR_BATTERY_LEVEL, PERM(RD, ENABLE), sizeof(uint8_t),
                                        0, NULL},
    // Battery Level Characteristic - Client Characteristic Configuration Descriptor
    [BAS_IDX_BATT_LVL_NTF_CFG]     =   {ATT_DESC_CLIENT_CHAR_CFG, PERM(RD, ENABLE)|PERM(WR, ENABLE), sizeof(uint16_t),
                                        0, NULL},
    // Battery Level Characteristic - Characteristic Presentation Format Descriptor
    [BAS_IDX_BATT_LVL_PRES_FMT]    =   {ATT_DESC_CHAR_PRES_FORMAT, PERM(RD, ENABLE), sizeof(struct prf_char_pres_fmt),
                                        0, NULL},
};

由上述定义我们来一个个分析bas_att_db的五个成员变量。

[BAS_IDX_SVC]

首先是[BAS_IDX_SVC]成员变量。
BAS_IDX_SVC的value是bas_svc 变量,具体如下:

const att_svc_desc_t bas_svc = ATT_SVC_BATTERY_SERVICE;

我们可以看到bas_svc 被赋值为一个枚举类型变量,具体值为0x180F。
类似的还有ATT_SVC_GENERIC_ACCESS、ATT_SVC_GENERIC_ATTRIBUTE、ATT_SVC_DEVICE_INFO、ATT_SVC_HID等。
具体定义如下:

/// Common 16-bit Universal Unique Identifier
enum {
    ATT_INVALID_UUID = 0,
    /*----------------- SERVICES ---------------------*/
    /// Generic Access Profile
    ATT_SVC_GENERIC_ACCESS                      = 0x1800,
    /// Attribute Profile
    ATT_SVC_GENERIC_ATTRIBUTE,
    ...
    /// Device Information Service
    ATT_SVC_DEVICE_INFO                         = 0x180A,
    ...
    /// Battery Service
    ATT_SVC_BATTERY_SERVICE,
    /// Blood Pressure Service
    ATT_SVC_BLOOD_PRESSURE                      = 0x1810,
    /// Alert Notification Service
    ATT_SVC_ALERT_NTF                           = 0x1811,
    /// HID Service
    ATT_SVC_HID                                 = 0x1812,
    ...
}

example

[BAS_IDX_BATT_LVL_CHAR]

关于BAS_IDX_BATT_LVL_CHAR成员,它的value比较特殊,是att_char_desc结构体变量强转为(uint8_t *)。该变量定义如下:

/// Battery Level characteristic
const struct att_char_desc bas_batt_level_char = ATT_CHAR(ATT_CHAR_PROP_RD, 0, ATT_CHAR_BATTERY_LEVEL);

struct att_char_desc定义如下:

/// Characteristic Value Descriptor
struct att_char_desc
{
    /// properties
    uint8_t prop;//属性
    /// attribute handle
    uint8_t attr_hdl[ATT_HANDLE_LEN];//句柄索引
    /// attribute type
    uint8_t attr_type[ATT_UUID_16_LEN];//UUID值
};

定义bas_batt_level_char变量时,使用ATT_CHAR宏函数填充结构体,原型如下

/// macro to fill an attribute characteristic
#define ATT_CHAR(prop, handle, type) {(prop),                                           \
                                     {(uint8_t)((handle)), (uint8_t)((handle) >> 8)},  \
                                     {(uint8_t)((type)), (uint8_t)((type) >> 8)}       };

[BAS_IDX_BATT_LVL_VAL]、[BAS_IDX_BATT_LVL_NTF_CFG]、[BAS_IDX_BATT_LVL_PRES_FMT]

这个三个变量都没填充value值

小结

成员定义描述
[BAS_IDX_SVC]{ATT_DECL_PRIMARY_SERVICE,PERM(RD, ENABLE),sizeof(bas_svc),sizeof(bas_svc),(uint8_t *)&bas_svc}Battery Service Declaration
[BAS_IDX_BATT_LVL_CHAR]{ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(bas_batt_level_char),sizeof(bas_batt_level_char), (uint8_t *)&bas_batt_level_char}Battery Level Characteristic Declaration
[BAS_IDX_BATT_LVL_VAL]{ATT_CHAR_BATTERY_LEVEL, PERM(RD, ENABLE), sizeof(uint8_t),0, NULL}Battery Level Characteristic Value
[BAS_IDX_BATT_LVL_NTF_CFG]{ATT_DESC_CLIENT_CHAR_CFG,PERM(RD, ENABLE)|PERM(WR, ENABLE),sizeof(uint16_t),0, NULL}Battery Level Characteristic - Client Characteristic Configuration Descriptor
[BAS_IDX_BATT_LVL_PRES_FMT]{ATT_DESC_CHAR_PRES_FORMAT, PERM(RD, ENABLE), sizeof(struct prf_char_pres_fmt),0, NULL}Battery Level Characteristic - Characteristic Presentation Format Descriptor

Database类型总结

UUID类型
ATT_DECL_PRIMARY_SERVICEDECLARATIONS0x2800
ATT_DECL_CHARACTERISTICDECLARATIONS0x2803
ATT_CHAR_BATTERY_LEVELCHARACTERISTICS0x2A19
ATT_DESC_CLIENT_CHAR_CFGDESCRIPTORS0x2902
ATT_DESC_CHAR_PRES_FORMATDESCRIPTORS0x2904
DA1458x软件平台开发手册 DA1458x software platform Reference 3.2如何使用此文档 本文档的重点是作为参考,即开发人员不需要通读整个文档;读者的关键是熟悉本文中描述的概念,以便在开发过程中能够使用软件开发人员的指南,以获得所需的结果。 嵌入式,是新的和/或芯片对话框的da1458x系统软件开发平台(SOC)建议审查的内容,然后通过阅读从3.1节到4.8节,然后11节熟悉开发环境的支持。然后建议阅读和使用文档[ 15 ]。如果有人需要更好的理解,并且想深入研究某个特定的主题,他/她可以回到这个文档中,在这个引用中涉及这个主题的特定章节。为了更深入的分析,这个参考文件指向附录或其他文档中更深入的技术说明。 更详细地叙述具体的主题。 这个参考文档不打算提供对蓝牙低能耗的透彻理解,它既不包括内部数据的组织方式,也不涉及蓝牙设备如何相互通信以及设计支持的设计和应用时可能需要的关键设计决策和权衡。 它打算但是提供给软件开发商足够的理解对话的da1458x平台高级API的方法为BLE及其外围设备以及信心如何使发展更快、更好的应用程序时,使用da1458x SoC。蓝牙低能耗技术(2010)是蓝牙专用兴趣小组(SIG)发布的蓝牙4版核心规范的一部分。从4版本开始,蓝牙标准支持两种不同的无线技术系统:蓝牙低能量和基本利率(BR),通常被称为基本速率/增强数据率(BR / EDR)。 在蓝牙低功耗设计的早期阶段,SIG致力于以最小的功耗开发低复杂度的无线标准,并提供低带宽。 优化,从而使低成本应用。在这种情况下,蓝牙低能量被设计用来每次传输非常小的数据包,而消耗的功率明显少于 类似的BR / EDR设备。此外,它的设计还支持高效率的实现,具有严格的能源和硅预算,促进应用程序使用一个单一的硬币电池延长了一段时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值