本文基于高通平台QCC5121
1.BLE GATT SERVICE 结构
GATT的服务(service)是为了实现设备的某些功能或特征,是一系列数据和行为的集合。如下图所示,一个服务通常由特征(characteristic)或其他服务的引用组成,每一个特征都包含一个值和关于这个值的信息。在这里实现一个服务,即指定该服务的相关参数,在工程中添加相关变量和函数以处理信息。
2. 实现环境
芯片:QCC5121
调试工具:TRB2000,
库:ADK6.3
3.添加服务思路
由于高通提供了gatt service的注册工具,方便我们使用,所以我们首先根据规则注册一个服务到database中;之后在appGattInit初始化的时候,调用本服务的初始化函数;最后根据设计的服务的各功能实现其对应的句柄,实现各功能,最后指向其库函数,完成相应的动作。
4. 具体实现
4.1 添加gatt_server_database
在工程编译之前,编译器首先会调用gattdbgen.exe来生成gatt database,这是为了方便用户无需手动添加service的相关特性到工程中,并自动分配service编号,方便管理。这里用户只需新建一个.dbi文件,并将该文件包含在av_headset_db.db文件,gattdbgen.exe会根据其内容其生成.h和.c文件,添加到工程里。
测试时,我们建立两个特征,一个read特征,包含了read和notify的属性,另一个write特征,包含write属性。由于服务和特征均需要UUID,为避免重复,这里从0xEEE0开始指定UUID,新建一个gatt_sean_server_uuids.h,写入以下内容:
#ifndef __SEAN_UUIDS_H__
#define __SEAN_UUIDS_H__
#define UUID_SEAN_SERVICE 0xEEE0
#define UUID_SEAN_READ 0xEEE1
#define UUID_SEAN_WRITE 0xEEE2
#endif /* __SEAN_UUIDS_H__ */
这里我们新建一个gatt_sean_server_db.dbi, 打开后写以下内容:
#ifndef __GATT_SEAN_SERVER_DB_DBI__
#define __GATT_SEAN_SERVER_DB_DBI__
#include "gatt_sean_server_uuids.h"
primary_service {
uuid : UUID_SEAN_SERVICE,
name : "SEAN_SERVICE",
characteristic {
uuid : UUID_SEAN_READ,
name : "SEAN_READ",
flags : [ FLAG_IRQ , FLAG_DYNLEN ],
properties : [ read , notify ],
value : 0x0,
client_config {
flags : [ FLAG_IRQ , FLAG_DYNLEN ],
name : "SEAN_NOTIFICATION"
}
},
characteristic {
uuid : UUID_SEAN_WRITE,
name : "SEAN_WRITE",
flags : [ FLAG_IRQ , FLAG_DYNLEN ],
properties : [ write ],
value : 0x0
}
},
#endif /* __GATT_SEAN_SERVER_DB_DBI__ */
这里flags用到了”FLAG_IRQ”和“FLAG_DYNLEN”,其含义如图 4‑1所示。
保存后关闭,在av_headset_db.db中添加
#include "gatt_sean_server_db.dbi"
即可,之后工程重新编译,会发现在av_headset_db.h中多出了这一段,这些宏在注册gatt服务时会用到。
#define HANDLE_SEAN_SERVICE (0x0019)
#define HANDLE_SEAN_SERVICE_END (0x001e)
#define HANDLE_SEAN_READ (0x001b)
#define HANDLE_SEAN_NOTIFICATION (0x001c)
#define HANDLE_SEAN_WRITE (0x001e)
注意这里primary_service使用到了JSON格式,其中的语法要严格遵循,否则会在漫长的编译过程后会迎来报错。
工程重新编译后,本应当自动生