首页 > 代码库 > Bluetooth Low Energy链路层

Bluetooth Low Energy链路层

1. 介绍

1.1 链路状态机

链路层操作可以描述为链路状态机(The Link Layer State Machine)
链路状态机有如下五种状态
- Standby State:      准备,不传输或接受数据包- Advertising State:  广播, advertiser,发送advertising channel packets,接受来自scanner的响应- Scanning State:     监听/扫描, scanner,监听来自advertiser的advertising channel packets- Initiating State:   初始化, initiator, 监听来自特殊设备的advertising channel packets,并进行初始化连接- Connection State:   连接, 有两种角色: Master Role(从initiator进入)/Slave Role(从advertiser进入)

image

链路状态机只允许处于五种状态之一
链路层可以有多个链路状态机,但至少有一个支持Advertising/Scanning State

处于Master Role的设备可以和多个Slave Role分时通信
处于Slave Role的设备只能和处于Master Role的设备通信

下图展示了允许和禁止的链路状态机和角色的组合

image

1.2 比特序(Bit Ordering)

在链路层规范中规定Packet/PDU比特序为Little Endian format
LSB最先发送

1.3 设备地址(Device Address)

设备地址可以是公共地址或者随机地址,长度为48 bits

- 公共地址: 采用IEEE 802-2001 standard的48-bit universal LAN MAC addresses

image

- 随机地址: 详细要求可参考规范

image

1.4 物理信道(Physical Channel)

BLE RF信道被定义为两种: advertising and data

- advertising信道: 使用3个RF信道用来发现设备,初始化连接和广播数据- data信道:        则使用多达37个RF信道用于两个连接设备间通信

RF Channel和Advertising/Data channel Index对应关系如下图
image

2. BLE Packet

2.1 数据包格式

对于BLE链路层,advertising/data channel packet格式如下

image

数据包长度为80~376bits(10~47Byte)
- Preamble: 前导码,用于接收方同步频率等
    advertising channel packet - 10101010b
    data channel packet        - 10101010b(Access Address的LSB为0)或01010101b(Access Address的LSB为1)
- Access Address: 接入地址
    advertising channel packet - 0x8E89BED6
    data channel packet        - 每个链路层连接都有其唯一值,由initiator随机生成,相关限制可参看规范
- PDU: 协议数据单元,对于advertising和data channel packet,有各自的格式要求
- CRC: 由PDU计算得到

2.2 RFU

Reserved For Future Use,留待后用,设置为0,接收后被忽略

2.3 Advertising Channel PDU

PDU格式如下
image 
Header部分格式如下
image

- PDU Type: 定义PDU类型
image
- TxAdd/RxAdd: 由PDU类型决定,若未定义,则认为是RFU
- Length: 定义Payload的字节数(octets),有效范围是6~37Bytes
- Payload: 由PDU类型决定

在Adv PDUs中,AdvData/ScanRspData指来自Host的数据

2.3.1 Advertising PDUS

Advertising PDUS包含下面几种类型

- ADV_IND: 表明自己是可以被连接的
    Payload - AdvA(6 octets) + AdvData(0~31 octets)
        AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)

- ADV_DIRECT_IND: 向特定设备建立连接
    Payload - AdvA(6 octets) + InitA(6 octets)
        AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)
        InitA字段为initiator(接收方)的地址(RxAdd=0表示公共地址, Rxadd=1表示随机地址)

- ADV_NONCONN_IND: 用于广播信息
    Payload - AdvA(6 octets) + AdvData(0~31 octets)
        AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)

- ADV_SCAN_IND: scannable undirected advertising event
    Payload - AdvA(6 octets) + AdvData(0~31 octets)
        AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)

这些PUDs的数据流向为 advertiser->scanner/initiator

2.3.2 Scanning PDUS

Scanning PDUS包含下面几种类型

- SCAN_REQ: 数据流向为 scanner->advertiser
    Payload - ScanA(6 octets) + AdvA(6 octets)
        ScanA字段为scanner的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)
        AdvA字段为advertiser的地址(RxAdd=0表示公共地址, Rxadd=1表示随机地址)

- SCAN_RSP: 数据流向为 advertiser->scanner
    Payload - AdvA(6 octets) + ScanRspData(0~31 octets)
        AdvA字段为advertiser的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)

2.3.3 Initiating PDUS

Initiating PDUS包含下面的类型

- CONNECT_REQ: 数据流向为 initiator->advertiser
    Payload - InitA(6 octets) + AdvA(6 octets) + LLData(22 octets)
        InitA字段为scanner的地址(TxAdd=0表示公共地址, Txadd=1表示随机地址)
        AdvA字段为advertiser的地址(RxAdd=0表示公共地址, Rxadd=1表示随机地址)
        LLData字段如下,详细信息请参看规范
           image

2.4 Data Channel PDU

Data Channel PDU格式如下
image 

2.4.1 Header

Header部分格式及字段含义如下
DataHeader

2.4.2 Payload

Payload格式由LLID字段决定,有下面两种类型

- LL Data PDU: 用来发送L2CAP数据, LLID为01b/10b
- LL Control PDU: 用来控制链路层连接, 详细信息请参考规范
    Payload - Opcode(1 octet) + CtrData(0~22 octets)
      image

2.4.3 MIC

MIC(Message Integrity Check)

- 不存在的情况
   ~ 在非加密连接中
   ~ 加密连接, Payload为空
- 存在的情况
   ~ 加密连接, Payload不为空

3. Air Interface Protocol

参考BLE规范下面章节
Low Engrgy Controller volume
- Link Layer Specification 
    - AIR INTERFACE PROTOCOL

Bluetooth Low Energy链路层