BLE协议概览

发布时间 2023-10-24 00:08:51作者: caesura_k

1 bluetooth 蓝牙协议

  什么是蓝牙呢?

  蓝牙是频率为2.4GHz的特高频无线通讯标准;按协议制定的时间,可以将其分为两种类型的蓝牙协议;

  1.1 BR/EDR: base rate/enhanced data rate传统蓝牙:使用蓝牙3.0标准协议;以点对点方式创建一对一通信;

  1.2 BLE: bluetooth low energy 低功耗蓝牙 :              使用蓝牙4.0标准协议;以广播(一对多)和网格(多对多)等通信;兼容蓝牙3.0协议;

2 蓝牙协议栈架构

  

  2.1 controller层 : 由芯片厂编写的硬件层,包括射频电路,将HCI数据按空中包的格式调制解调的链路层,以及规范通信的hci接口;

  2.2 host层:      由各公司编写的协议层,主要是修改gatt;平常说的写蓝牙协议写的就是gatt的profile协议;

  2.3 application层:由各公司编写的的应用代码层,每个代码功能都可视为profile;蓝牙联盟也定义了相关的标准profiles,一般不用;

3 ( C/S client server )架构

  c/s架构通信的双方总是由client客户端的主机发起,server服务端的从机响应;c/s架构就是后续gatt使用的request/respond架构;

  3.1 client客户端: 使用数据服务的设备,即主机设备;

  3.2 server服务端:提供数据服务的设备,即从机设备;

            数据服务:即service服务;

            service服务:包含多个characteristic特征值;

4 ATT attribute

  attribute将一串数据段的数据功能定义如下,attribute数据段就是后续提供给gatt使用的服务数据;

  4.1 attribute 定义

  

    attribute handle:   代码中定义了characteristic之后,蓝牙底层会生成对应的attribute handle;

               所以这个attribute handle不是characteristic特征值;作用是区分attribute指令;

    attribute type:     uuid;标明att指令的类型:write,read,notify,indicate;

    attribute value:    服务数据,可不就是实际使用的数据么;

    attribute permissions:主要有四种属性,open,no access,authentication,signed;

    4.1.1 ATT attribute 指令

      ATT指令是由attribute构成的协议数据单元PDU(protocol data uint);也不知道是不是就是attribute的格式,先放着;

      attribute指令可分为四类指令,分别是write, read, notify, indicate 类型的指令;其中write,notify为request/ack模式;

      所有的attribute指令在发送出去之后,会一直等待直到收到回复的ack包,直到超时或断开ble;杜绝了空中丢包的可能性;

      attribute指令可以选择request/ack的模式,也可以选择request/respond的模式;

      ?? 这里的attribute指令就是profile实际发送的格式的att指令咯 ?

    4.1.2 ATT attribute 指令集

      由att指令构成的指令集;这个应该不是下面的那个attribute table,先放着;

  4.2 attribute 结构体

//gatt.h
//brief GATT attribute definition.
typedef struct
{
    uint16_t    flags;              /**< Attribute flags @ref GATT_ATTRIBUTE_FLAG 属性表索引号*/
    uint8_t     type_value[2 + 14]; /**< 16 bit UUID + included value or 128 bit UUID 特征值*/
    uint16_t    value_len;          /**< Length of value */
    void        *p_value_context;   /**< Pointer to value if @ref ATTRIB_FLAG_VALUE_INCL and @ref ATTRIB_FLAG_VALUE_APPL not set 服务数据*/
    uint32_t    permissions;        /**< Attribute permission @ref GATT_ATTRIBUTE_PERMISSIONS 权限*/
} T_ATTRIB_APPL;

  4.3 attribute table

    这个attribute table 是用上面的那个flags作为index,然后type_value就是characteristic uuid;

//wristband_private_service.c
const T_ATTRIB_APPL bwps_service_tbl[] =
{
    // Primary Service 0;
    {
        (ATTRIB_FLAG_VOID | ATTRIB_FLAG_LE),        /* wFlags     */   
        {
            LO_WORD(GATT_UUID_PRIMARY_SERVICE),
            HI_WORD(GATT_UUID_PRIMARY_SERVICE),
        },
        UUID_16BIT_SIZE,
        (void *)GATT_UUID16_BWPS,
        GATT_PERM_READ                              /* wPermissions  */
    },
    // Characteristic 1;
    {
        ATTRIB_FLAG_VALUE_INCL,                     /* wFlags */        
        {   /* bTypeValue */
            LO_WORD(GATT_UUID_CHARACTERISTIC),
            HI_WORD(GATT_UUID_CHARACTERISTIC),
            GATT_CHAR_PROP_WRITE|GATT_CHAR_PROP_WRITE_NO_RSP,            /* characteristic properties */
            /* characteristic UUID not needed here, is UUID of next attrib. */
        },
        1,                                          /* bValueLen */
        NULL,
        GATT_PERM_READ                              /* wPermissions */
    },
    //...
}

5 profile 

  蓝牙规范冗余繁杂,所以蓝牙设备通常只实现所需协议;这部分协议好比蓝牙规范的剪影,所以称为profile; 

  profile是一种从机使用的协议;

  profile使用的数据来自attribute指令,但不确定是否就是attribute的格式,应该不是;

  每个profile中包含多个service服务功能;比如上行、下行、电量信息、系统信息;

  每个service服务中包含多个characteristic特征值;比如write(下行),notify(上行),indicate(上行);

    1.3.1 write特征值:具有该特征值的从机可以被写入;

    1.3.2 read特征值:具有该特征值的从机可以被读取;

    1.3.3 notify特征值:具有该特征值的从机可以主动发送信息给主机;

    1.3.4 indicate特征值:

 

6 GATT  

7 常见service

  7.1 NUS Nordic UART Service服务

    包含两个characteristic,Tx和Rx;每个条目都是一个service  

  7.2 GAP Generic Access服务 

    不同于profile里的GAP子协议;这个GAP是一个常见的服务;uuid1800;

    包含device name;appearance;PPCP;CAR等characteristic;

  7.3 GATT Generic attribute服务

    不同于profile里的GATT 协议;这个GATT 是一个常见的服务;uuid1801;

    包含service change等characteristic;

  7.4 CCCD 这东西是service么?什么descriptor啥子哟,是一条attribute指令;

    CCCD使能:server允许发送notify或indicate类型的characteristic给client;

    CCCD禁能:server禁止发送notify或indicate类型的characteristic给client;

    所以如果蓝牙有notify或者indicate特征值的功能,那么他就应该添加CCCD attribute;

3 蓝牙协议 通讯结构

 

  3.2 GAP generic access profile 通用连接协议

    当从机还未建立连接的时候,通过GAP协议单向向外广播,该协议通常由芯片产商写好;

    从机需要不断向外广播数据,让主机可以发现从机;广播数据最长可以包含31bytes;

    从机会定义一个广播间隔,广播间隔越长越省电,同时也不容易被扫描到;

  3.3 GATT generic attribute profile 通用属性协议

    当从机和主机建立一对一连接,通过GATT协议进行通信;

    GATT协议使用service和characteristic进行通信的协议;大概就是常说的ATT(attribute protocol)AT指令协议;

    GATT连接属于一对一连接,从机和主机建立连接之后,就会停止向外广播使得对其他设备不可见;当设备断开后设备又开始广播;

  1.4 UUID: universally unique identifier 通用唯一标识码

    UUID用16进制表示为32位,2进制表示为128位;日常的数据表示是进制换算的,数据存储是8位存储不要混淆;

    蓝牙技术联盟定义基本的UUID标识码如右:0000xxxx-0000-1000-8000-00805F9B34FB;

    蓝牙技术联盟定义基本的UUID标识码中xxxx为属性的uuid;使用uuid标识service的characteristic属性;

    蓝牙技术联盟定义基本的UUID标识码只是官方提供的,但实际上多数公司都会重新定义自己的UUID做私有协议;

    蓝牙广播的中uuid的格式可分为三种,如右:xxxx,0000xxxx,0000xxxx-0000-1000-8000-00805F9B34FB; 

    通过不同的uuid来区分不同的service功能; 

4 GATT结构

  1.3 profile 协议

 

  因此一个characteristic包含三种类型的数据条目(attribute):特征值数据类型的意思应该

  characteristic声明条目(declaration attribute),

  characteristic值条目(value attribute)

  以及characteristic描述符条目(descriptor attribute)(一个characteristic可以有多个描述符条目) 

 

  不管是characteristic declaration,characteristic value还是characteristic descriptor,实现的时候,都是一条数据条目,即attribute。

 

  

 

    

 

 不写了不写了,先放着改天再整理;

 

接下来我们应该讲gatt协议了;但是在此之前我们还得了解一下gatt借鉴的的c/s架构是什么、了解一下gatt用到的attribute是怎么定义的;

这个广播数据为什么有62个这么多,不是广播uuid呀,广播格式又是怎么样的呢?

蓝牙协议框架  https://zhuanlan.zhihu.com/p/76690551

链路层            https://zhuanlan.zhihu.com/p/585244357

 

低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读 - iini - 博客园 (cnblogs.com) 这个老哥讲的非常好;

链路层与空中包 详解BLE空口包格式—兼BLE Link layer协议解析 - iini - 博客园 (cnblogs.com)