前言:这篇文章用来记录AC692x_SDK工具中make_gatt_services工具的使用以及后续同步到代码中的步骤。
低功耗蓝牙使用了一种截然不同的方法来明确设备对自身的行为定义,它采用了纯粹的“客户端——服务器”结构,针对不同的用例对服务器和客户端的行为单独进行描述。在le_server_module.h
中定义了规范数组profile_datda
,它包含了定义的特征的UUID和句柄:
const uint8_t profile_data[] =
{
//
//
// 0x0001 PRIMARY_SERVICE 1800
//
//
0x0a, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28, 0x00, 0x18,
/* CHARACTERISTIC, 2A00, READ | DYNAMIC, */
// 0x0002 CHARACTERISTIC 2A00 READ | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28, 0x02, 0x03, 0x00, 0x00, 0x2a,
// 0x0003 VALUE 2A00 READ | DYNAMIC
0x08, 0x00, 0x02, 0x01, 0x03, 0x00, 0x00, 0x2a,
//
//
// 0x0004 PRIMARY_SERVICE 2B00
//
//
0x0a, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28, 0x00, 0x2b,
/* CHARACTERISTIC, 2B10, NOTIFY | READ | DYNAMIC, */
// 0x0005 CHARACTERISTIC 2B10 NOTIFY | READ | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28, 0x12, 0x06, 0x00, 0x10, 0x2b,
// 0x0006 VALUE 2B10 NOTIFY | READ | DYNAMIC
0x08, 0x00, 0x12, 0x01, 0x06, 0x00, 0x10, 0x2b,
// 0x0007 CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x07, 0x00, 0x02, 0x29, 0x00, 0x00,
/* CHARACTERISTIC, 2B11, WRITE_WITHOUT_RESPONSE | DYNAMIC, */
// 0x0008 CHARACTERISTIC 2B11 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28, 0x04, 0x09, 0x00, 0x11, 0x2b,
// 0x0009 VALUE 2B11 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x08, 0x00, 0x04, 0x01, 0x09, 0x00, 0x11, 0x2b,
// END
0x00, 0x00,
};
在BLE协议栈初始化之初,会将profile规范和ATT的读写回调一起初始化,这样每次调用读写回调函数时,服务端(server)都会根据预先定义的profile规范来读写数据,为客户端(client)提供了统一标准。
ble_att_server_setup_init(profile_data, att_read_callback, att_write_callback);
AC692xSDK提供的make_gatt_services工具只有两个文件。需注意,这两个文件必须在同一级目录下才可使用。
以下是该文件夹下的gatt_profile.cfg内容:
PRIMARY_SERVICE, 0x1800
CHARACTERISTIC, 2A00, READ | DYNAMIC,
PRIMARY_SERVICE, FFF0
CHARACTERISTIC, FFF1, READ | NOTIFY | DYNAMIC,
CHARACTERISTIC, FFF2, WRITE | DYNAMIC,
CHARACTERISTIC, FFF3, WRITE | DYNAMIC,
该文件第1行定义了一个服务,第2行的特征从属于该服务。为0x1800的UUID是蓝牙官网规定的Generic Access服务,是连接必有的服务,无需改动。
该文件的第3行是自定义服务,4~6行是从属于该服务的特质。可以模仿给出的样例修改,UUID可以根据需要自行修改。在修改描述符时,需注意,若描述符中有READ、WRITE、WRITE_WITHOUT_REPONSE时,则必须在描述符后添加DYNAMIC。
完成该文件填写后,双击同文件夹下的gatt_inc_generator.exe工具,生成gatt_profile_cfg.h
按照上述配置内容生成的gatt_profile_cfg.h文件内容如下:
//
// gatt profile include file, generated by jieli gatt_inc_generator.exe
//
const uint8_t profile_data[] =
{
//
//
// 0x0001 PRIMARY_SERVICE 0x1800
//
//
0x0a, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x28, 0x00, 0x18,
/* CHARACTERISTIC, 2A00, READ | DYNAMIC, */
// 0x0002 CHARACTERISTIC 2A00 READ | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x28, 0x02, 0x03, 0x00, 0x00, 0x2a,
// 0x0003 VALUE 2A00 READ | DYNAMIC
0x08, 0x00, 0x02, 0x01, 0x03, 0x00, 0x00, 0x2a,
//
//
// 0x0004 PRIMARY_SERVICE FFF0
//
//
0x0a, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x28, 0xf0, 0xff,
/* CHARACTERISTIC, FFF1, READ | NOTIFY | DYNAMIC, */
// 0x0005 CHARACTERISTIC FFF1 READ | NOTIFY | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x28, 0x12, 0x06, 0x00, 0xf1, 0xff,
// 0x0006 VALUE FFF1 READ | NOTIFY | DYNAMIC
0x08, 0x00, 0x12, 0x01, 0x06, 0x00, 0xf1, 0xff,
// 0x0007 CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x07, 0x00, 0x02, 0x29, 0x00, 0x00,
/* CHARACTERISTIC, FFF2, WRITE | DYNAMIC, */
// 0x0008 CHARACTERISTIC FFF2 WRITE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x28, 0x08, 0x09, 0x00, 0xf2, 0xff,
// 0x0009 VALUE FFF2 WRITE | DYNAMIC
0x08, 0x00, 0x08, 0x01, 0x09, 0x00, 0xf2, 0xff,
/* CHARACTERISTIC, FFF3, WRITE | DYNAMIC, */
// 0x000a CHARACTERISTIC FFF3 WRITE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x03, 0x28, 0x08, 0x0b, 0x00, 0xf3, 0xff,
// 0x000b VALUE FFF3 WRITE | DYNAMIC
0x08, 0x00, 0x08, 0x01, 0x0b, 0x00, 0xf3, 0xff,
// END
0x00, 0x00,
};
//
// characteristics <--> handles
//
#define ATT_CHARACTERISTIC_2A00_01_VALUE_HANDLE 0x0003
#define ATT_CHARACTERISTIC_FFF1_01_VALUE_HANDLE 0x0006
#define ATT_CHARACTERISTIC_FFF1_01_CLIENT_CONFIGURATION_HANDLE 0x0007
#define ATT_CHARACTERISTIC_FFF2_01_VALUE_HANDLE 0x0009
#define ATT_CHARACTERISTIC_FFF3_01_VALUE_HANDLE 0x000b
将其内容复制粘贴,找到le_server_module.h中的之前的profile_data[]内容和句柄宏定义进行替换。
像上述的的特征句柄,以宏定义的方式出现,在le_server_module.c中各种回调函数中出现,若与之前的句柄不同,要记得及时修改在各个函数中的定义。
如果您觉得有帮助,请给我一个赞。
您的鼓励是我前进的动力(๑‾ ꇴ ‾๑)。