GATTServApp模块
GATT服务器应用程序(GATTServApp)存储和管理应用程序范围的属性表。各种配置文件使用此模块将其特性添加到属性表。蓝牙低功耗协议栈使用此模块来响应GATT客户端的发现请求。例如,GATT客户端可以发送Discover all Primary Characteristics消息。GATT服务器端的蓝牙低功耗协议栈接收到该消息,并使用GATTServApp查找并发送存储在属性表中的所有主要特性。这种类型的功能超出了本文档的范围,它们是在库代码中实现。可以从gattservapp_util.c
中定义配置文件以及BLE Stack API Reference
(GATTServApp部分)中描述的API来查看GATTServApp函数。这些功能包括查找特定属性和阅读或修改客户端特征配置。有关GATTServApp在应用程序中的功能的示例,请参见图46 .
下图示意了属性表的初始化,这幅图其实完全对应了GATT Services和Profile中的属性表。该流程图是程序上下文的具体实现过程。图中可以看出在程序中分别使用前面涉及的GGS_Addservice();GATTServApp_AddService();DevInfo_AddService();SimpleProfile_AddService();就这样一步一步在GATT Server中构建了属性表。
构建属性表
上电或重置时,应用程序使用GATTServApp来创建GATT表来添加服务。每个服务都包含具有UUID,值,权限以及读取和写入回调的属性列表。正如图46所示,所有的这些信息是通过GATTServApp传递到GATT和存储在堆栈中。
属性表初始化必须在应用程序初始化函数中出现,也就是simple_peripheral_init()。
//初始化GATT属性
GGS_AddService (GATT_ALL_SERVICES ); // GAP
GATTServApp_AddService (GATT_ALL_SERVICES ); // GATT属性
在属性表中实现配置文件
属性表的定义
GATT属性的每个服务或组必须定义一个固定大小的属性表,该表被传递到GATT中。simple_gatt_profile.c中的此表定义如下。
static gattAttribute_t simpleProfileAttrTbl [ SERVAPP_NUM_ATTR_SUPPORTED ]
此表中的每个属性都是以下类型。
typedef struct attAttribute_t
{
gattAttrType_t type; //!< 属性类型(2或16个八位字节UUID)
uint8 permissions; //!< 属性权限
uint16 handle; //!< 属性句柄-由属性服务器内部分配
uint8* const pValue; //!< 属性值 -属性值的最大长度为512 octets。
} gattAttribute_t;
- gattAttrType_t类型
type是与放置在表中的属性相关联的UUID。gattAttrType_t本身定义为:
typedef struct
{
uint8 len ; //!<UUID的长度(2或16)
const uint8 * uuid ; //!<指向UUID的指针
} gattAttrType_t ;
其中长度可以是ATT_BT_UUID_SIZE(2字节)或 ATT_UUID_SIZE(16字节)。*uuid是指向蓝牙SIG(定义在gatt_uuid.c中)或在配置文件中定义的自定义UUID保留的数字的指针。
-
uint8权限
强制GATT客户端设备如何以及如何访问该属性的值。可能的权限在gatt.h中定义如下:宏定义 16进制数