蓝牙协议栈----GATT层__CC2640R2F
1.GATT层介绍
通用属性配置文件(GATT),用来进行两个连接设备的数据通信,其中数据以特征值的方式传输与存储。
GATT 层区分为 Server 和 Client 。客户端读取和写入存储在服务端的特征值
Server:(从机)该设备包含由 GATT 客户端读取或写入的 characteristic。
Client:(主机)从 GATT 服务器读取或写入数据的蓝牙设备。

2.GATT层的构成概念
GATT层由Profile 、Service(服务) 、Characteristics(特征) 、Attributes(属性)构成,其关系为:
一个Profile包含多个Service 或 许多Profile实现一个Service ;
一个Service包含多个Characteristics ;
一个Characteristics包含多个Attributes;

3.特征的组成
典型特征由以下属性组成。
- Characteristic Value 特征值:特征的数据值
- Characteristic Declaration 特征声明:存储特征值的属性(Handle,UUID),位置和特征值类型的描述
- Client Characteristic Configuration 客户端特征配置: GATT服务器特征通知notify还是指示indicate
- Characteristic User Description 特征用户描述:描述特征的 ASCII 可读字符串 .
每个属性(Attribute)包含 Handle(句柄)、Type(UUID)、Permissions(权限)三个属性
Handle:属性的标识
Type(UUID):用以区分属性类型
Permissions(权限):
0x02:允许读取特征值
0x04:允许写入特征值(无响应)
0x08:允许写入特征值(带响应)
0x10:允许通知特征值(无确认)
0x20:允许通知特征值(带确认)
0x0A:允许特征读取(0x02)和写入(0x08)。
4.特征分析
以CC2640R2_LAUNCHXL\ble5stack\simple_peripheral 项目为例
4.1所有服务属性表
一共四个服务
// Initialize GATT attributes
//服务添加到GATT服务器
GGS_AddService(GATT_ALL_SERVICES); // GAP GATT Service GAP服务
GATTServApp_AddService(GATT_ALL_SERVICES); // GATT Service GATT服务,提供在设备上注册GATT服务
DevInfo_AddService(); // Device Information Service 设备信息服务
SimpleProfile_AddService(GATT_ALL_SERVICES); // Simple GATT Profile Simple GATT服务
所有服务的属性表

Type(UUID):
0x2800代表是服务声明–蓝牙定义
0x2803代表是特征声明–蓝牙定义
0x2901代表是特征用户描述–蓝牙定义
0x2902代表是客户端特征配置–蓝牙定义
4.2Simple GATT特征分析

主从机进行消息传输时,就是依靠UUID找到对应的Handle
UUID为0x2800代表是服务声明的,其Value是自己定义的,可以用来发现指定的服务
定义的特征值UUID用以查找特定的特征值
// Simple Profile Service UUID
#define SIMPLEPROFILE_SERV_UUID 0xFFF0
// Key Pressed UUID
#define SIMPLEPROFILE_CHAR1_UUID 0xFFF1
#define SIMPLEPROFILE_CHAR2_UUID 0xFFF2
#define SIMPLEPROFILE_CHAR3_UUID 0xFFF3
#define SIMPLEPROFILE_CHAR4_UUID 0xFFF4
#define SIMPLEPROFILE_CHAR5_UUID 0xFFF5
UUID为0x2803的特征声明,其value值包含特征值的的Permissions、Handle、UUID。
因为Handle是由协议栈分配的连续的,所以获取其中一个的Handle就能知道其它的
req.startHandle = svcStartHdl;
req.endHandle = svcEndHdl;
req.type.len = ATT_BT_UUID_SIZE;
req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);
//根据服务句柄范围和特征UUID,客户端发现服务器上的服务特征
VOID GATT_DiscCharsByUUID(pMsg->connHandle, &req, selfEntity);
主机获取从机的Handle
connList[connIndex].charHandle
= BUILD_UINT16(pMsg->msg.readByTypeRsp.pDataList[3],
pMsg->msg.readByTypeRsp.pDataList[4]);
4.3Simple GATT特征
- SIMPLEPROFILE_CHAR1:可以从 GATT 客户端设备读取或写入的 1 字节值
- SIMPLEPROFILE_CHAR2:可以从 GATT 客户端设备读取但不能写入的 1 字节值
- SIMPLEPROFILE_CHAR3:可以从 GATT 客户端设备写入但不能读取的 1 字节值
- SIMPLEPROFILE_CHAR4:不能从 GATT 客户端设备直接读取或写入的 1 字节值(该值是通知属性)
- SIMPLEPROFILE_CHAR5:可从 GATT 客户端设备读取(但不写入)的 5 字节值
// Simple Profile Characteristic 1 Properties
static uint8 simpleProfileChar1Props = GATT_PROP_READ | GATT_PROP_WRITE;
// Characteristic 1 Value
static uint8 simpleProfileChar1 = 0;
// Simple Profile Characteristic 1 User Description
static uint8 simpleProfileChar1UserDesp[17] = "Characteristic 1";
// Simple Profile Characteristic 5 Properties
static uint8 simpleProfileChar5Props = GATT_PROP_READ;
// Characteristic 5 Value
static uint8 simpleProfileChar5[SIMPLEPROFILE_CHAR5_LEN] = { 0, 0, 0, 0, 0 };
// Simple Profile Characteristic 5 User Description
static uint8 simpleProfileChar5UserDesp[17] = "Characteristic 5";
本文详细介绍了CC2640R2F蓝牙设备中的GATT层结构,包括Server和Client角色,以及服务、特征、Characteristics和Attributes等概念。通过实例分析SimpleGATT服务中的特征和属性,展示了如何通过UUID和Handle进行数据通信。
379

被折叠的 条评论
为什么被折叠?



