蓝牙----蓝牙协议栈GATT层

蓝牙协议栈----GATT层__CC2640R2F

  • 1.GATT层介绍
  • 2.GATT层的构成概念
  • 3.特征的组成
  • 4.特征分析
    • 4.1所有服务属性表
    • 4.2Simple GATT特征分析
    • 4.3Simple GATT特征


1.GATT层介绍

通用属性配置文件(GATT),用来进行两个连接设备的数据通信,其中数据以特征值的方式传输与存储。

GATT 层区分为 Server 和 Client 。客户端读取和写入存储在服务端的特征值
Server:(从机)该设备包含由 GATT 客户端读取或写入的 characteristic。
Client:(主机)从 GATT 服务器读取或写入数据的蓝牙设备。


蓝牙----蓝牙协议栈GATT层_第1张图片

2.GATT层的构成概念

GATT层由Profile 、Service(服务) 、Characteristics(特征) 、Attributes(属性)构成,其关系为:

一个Profile包含多个Service 或 许多Profile实现一个Service ;
一个Service包含多个Characteristics ;
一个Characteristics包含多个Attributes;

蓝牙----蓝牙协议栈GATT层_第2张图片

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特征分析

蓝牙----蓝牙协议栈GATT层_第3张图片
主从机进行消息传输时,就是依靠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";

你可能感兴趣的:(蓝牙,蓝牙)