1.背景知识
BR/EDR、LE
BR/EDR:经典蓝牙,蓝牙的基本速率/增强数据速率
LE:低功耗蓝牙
两者都支持的属于双模设备
蓝牙MAC地址
硬件地址,用于区分蓝牙设备,使用6个字节
地址类型分为

公共地址
IEEE中注册的全局固定地址,有唯一对应的蓝牙设备,该地址收费。
随机静态地址/随机私有地址(可自己搜索)MTU(最大传输单元)
一次传输所能传输的SDU (服务数据单元, Service Data Unit)长度, MTU是L2CAP层中的概念,完 整的一个L2CAP基本帧长度为ATT_MTU+4。
实际MTU值为客户端MTU和服务器端MTU之间协商的值。RSSI(接收信号强度指示)
FCS(帧校验序列)
2.蓝牙协议

2.1 PHT物理层
共有40个信道(每个信道2MHz)。37,38,39为固定广播通道
2.2 LL链路层

就绪态
广播态:会在三个信道中传输。广播间隔(20ms~10.24s),随即延迟消除时钟漂移。
扫描态:接收广播报文。扫描窗口(2.5ms~10.24s),扫描间隔(2.5ms~10.24s)
发起态:能发送则连接成功,连接失败进入就绪态
连接态:主机(发起态加入连接态)/从机(广播态进入连接态),从机如果有数据发送需要在150+-2.5us内ASK。连接间隔(7.5~4000ms,N*1.25),从机潜伏期(0~min(连接超时时间/连接间隔-1500)),连接监管超时(100ms~32s,N*10ms)
数据包和PDU(协议数据单元)都是以小端模式存放。
2.3 链路层报文结构

常规广播
ADV_IND:非定向可连接广播事件,可扫描
ADV_DIRECT_IND:定向可连接广播事件,不可扫描
完整广播事件必须每3.75ms重复一次,定向广播不能持续1.28s以上时间ADV_NONCONN_IND:非定向可连接广播事件,不可扫描
ADV_SCAN_IND:可扫描广播事件,不可连接
扩展广播
扫描PDU
SCAN_REQ:主动扫描请求
SCAN_RSP:主动扫描响应
连接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
#endif2.6 属性构成
GATT客户端:接收数据的设备;GATT服务器:提供数据的设备

属性句柄:用于标识属性的编号,范围:0x0001~0xFFFF
属性类型:蓝牙UUID,用于标识蓝牙服务以及通信特征访问。BLE中--服务类UUID(0x1800-0x26FF)/表示计量(0x2700-0x27FF)/区分属性类型(0x2800-0x28FF)/特性描述(0x2900-0x29FF)/区分特性类型(0x2A0-0x7FF)
属性值:0-512字节的数据
属性许可:访问许可,加密许可,身份验证许可,授权许可
2.7 GATT服务器
服务
服务声明
包含定义
特性/特征声明:特性性质,特性值句柄,特性UUID

特性值声明
特性描述符声明:CCCD(用于设置通知或指示)
2.8 ATT协议
PDU格式
PDU类型:用于发现、读写、通知和指示属性
错误响应
协议:通知无响应,指示需要客户端确认
2.9 GATT规程和ATT协议映射
发现规程、客户端发起规程和服务器发起规程
2.10 GATT服务器中的GAT服务
设备名称:设备名称字符串
外观:描述这是什么类型的设备
首选连接参数:连接间隔、潜伏期、监管超时