1.背景知识

  1. BR/EDR、LE

    • BR/EDR:经典蓝牙,蓝牙的基本速率/增强数据速率

    • LE:低功耗蓝牙

    • 两者都支持的属于双模设备

  2. 蓝牙MAC地址

    1. 硬件地址,用于区分蓝牙设备,使用6个字节

    2. 地址类型分为

  3. 公共地址
    IEEE中注册的全局固定地址,有唯一对应的蓝牙设备,该地址收费。
    随机静态地址/随机私有地址(可自己搜索)

  4. MTU(最大传输单元)
    一次传输所能传输的SDU (服务数据单元, Service Data Unit)长度, MTU是L2CAP层中的概念,完 整的一个L2CAP基本帧长度为ATT_MTU+4。


    实际MTU值为客户端MTU和服务器端MTU之间协商的值。

  5. RSSI(接收信号强度指示)

  6. FCS(帧校验序列)

2.蓝牙协议

2.1 PHT物理层

共有40个信道(每个信道2MHz)。37,38,39为固定广播通道

2.2 LL链路层

  1. 就绪态

  2. 广播态:会在三个信道中传输。广播间隔(20ms~10.24s),随即延迟消除时钟漂移。

  3. 扫描态:接收广播报文。扫描窗口(2.5ms~10.24s),扫描间隔(2.5ms~10.24s)

  4. 发起态:能发送则连接成功,连接失败进入就绪态

  5. 连接态:主机(发起态加入连接态)/从机(广播态进入连接态),从机如果有数据发送需要在150+-2.5us内ASK。连接间隔(7.5~4000ms,N*1.25),从机潜伏期(0~min(连接超时时间/连接间隔-1500)),连接监管超时(100ms~32s,N*10ms)

数据包和PDU(协议数据单元)都是以小端模式存放。

2.3 链路层报文结构

  1. 常规广播

    • ADV_IND:非定向可连接广播事件,可扫描

    • ADV_DIRECT_IND:定向可连接广播事件,不可扫描
      完整广播事件必须每3.75ms重复一次,定向广播不能持续1.28s以上时间

    • ADV_NONCONN_IND:非定向可连接广播事件,不可扫描

    • ADV_SCAN_IND:可扫描广播事件,不可连接

  2. 扩展广播

  3. 扫描PDU

    • SCAN_REQ:主动扫描请求

    • SCAN_RSP:主动扫描响应

  4. 连接PDU
    可用的数据通道载荷长度最大为251字节。当MTU大于此值时,在L2CAP层数据将被多次发送

2.4 GAP Role任务

  • 广播者:只广播无法被连接

  • 旁观者:只扫描无法建立连接

  • 外围设别(从机):可广播可连接

  • 中心设备(主机):可扫描广播可建立单/多个连接

专业术语

  • 配对:密钥交互的过程

  • 加密:配对后数据被加密或者重新加密

  • 验证:使用支持MITM保护机制的配对方式。

  • 绑定:是指将加密密钥存储在SNV (Simple Non-Volatile,简单非易失性存储器)中, 用于下一个加密序列。

  • 授权:是指除身份验证外的应用程序级密钥交换。

  • 带外:是指通过无线之外的方式交换密钥,例如串口或NFC, OOB提供了MITM 保护机制。

  • 中间人保护:是指MITM在配对过程中提供身份验证,这有助于防止恶意攻击者在密钥交换期间冒充配对设备。

  • 中间人攻击:是指攻击者在两个连接设备之间扮演成中间人,窃听和篡改设备的发送信息。

  • 直接连接:是指无认证的配对方式,密钥的交换没有MITM保护, TK (TK, Temporary Key,短期密钥)值为0。

  • 输入密码:通过6位TK进行配对.

typedef union
{
    gapEventHdr_t gap;                     //!< gap事件消息及状态.
    gapDeviceInitDoneEvent_t initDone;     //!< GAP初始化完成.
    gapDeviceInfoEvent_t deviceInfo;       //!< 发现设备信息事件结构.
    gapDirectDeviceInfoEvent_t deviceDirectInfo; //!< 发现直接设备信息事件结构.
    gapAdvDataUpdateEvent_t dataUpdate; //!< 广播数据更新已完成.
    gapPeriodicAdvDeviceInfoEvent_t devicePeriodicInfo; //!< 发现周期性设备信息事件结构.
    gapExtAdvDeviceInfoEvent_t deviceExtAdvInfo; //!< 发现扩展广播设备信息事件结构.
    gapDevDiscEvent_t discCmpl;            //!< 发现完成事件结构.
    gapSyncEstablishedEvent_t syncEstEvt;  //!< 同步建立事情结构.
    gapSyncLostEvent_t syncLostEvt;        //!< 同步丢失事情结构.
    gapScanReqReseiveEvent_t scanReqEvt;   //!< 扫描请求接受事情结构.

    gapEstLinkReqEvent_t linkCmpl;         //!< 连接完成事情结构.
    gapLinkUpdateEvent_t linkUpdate;       //!< 连接更新事情结构.
    gapTerminateLinkEvent_t linkTerminate; //!< 连接终止事情结构.
    gapPhyUpdateEvent_t linkPhyUpdate;     //!< 连接物理层更新事情结构.
} gapRoleEvent_t;

2.5 GAP绑定管理

要注意的是配对并不一定需要绑定,如果不绑定,则每次连接都需要重新交换短期密钥(STK, Short Term Key)。而绑定之后,会对长期密钥(LTK, Long-Term Key)、身份解析密钥(IRK, Identity Resolving Key)和连接签名解析密钥(CSRK, Connection Signature Resolving Key)或者它们的组合进行交换并被 存储到SNV中,那么下一次该设备连接就无需再次输入密钥。一般在芯片的Flash区划出一块区域作为SNV 区,在CH592F中如下所示:

#ifndef BLE_SNV_ADDR
#define BLE_SNV_ADDR    0x77E00-0x070000
#endif

2.6 属性构成

GATT客户端:接收数据的设备;GATT服务器:提供数据的设备

  1. 属性句柄:用于标识属性的编号,范围:0x0001~0xFFFF

  2. 属性类型:蓝牙UUID,用于标识蓝牙服务以及通信特征访问。BLE中--服务类UUID(0x1800-0x26FF)/表示计量(0x2700-0x27FF)/区分属性类型(0x2800-0x28FF)/特性描述(0x2900-0x29FF)/区分特性类型(0x2A0-0x7FF)

  3. 属性值:0-512字节的数据

  4. 属性许可:访问许可,加密许可,身份验证许可,授权许可

2.7 GATT服务器

  1. 服务

  2. 服务声明

  3. 包含定义

  4. 特性/特征声明:特性性质,特性值句柄,特性UUID

  5. 特性值声明

  6. 特性描述符声明:CCCD(用于设置通知或指示)

2.8 ATT协议

  1. PDU格式

  2. PDU类型:用于发现、读写、通知和指示属性

  3. 错误响应

  4. 协议:通知无响应,指示需要客户端确认

2.9 GATT规程和ATT协议映射

发现规程、客户端发起规程和服务器发起规程

2.10 GATT服务器中的GAT服务

  1. 设备名称:设备名称字符串

  2. 外观:描述这是什么类型的设备

  3. 首选连接参数:连接间隔、潜伏期、监管超时

2.11 GATT服务

2.12 广播数据类型定义和格式