1. 物理层
BLE(bluetooth low energy)同样运行在2.4G ISM 频段。总共分为40个频段如下图:
和 Basic Rate 一样 BLE 使用 GFSK 调制,最大传输速率为 1Mbps .
2. 链路层
2.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进入)
链路层可以有多个链路状态机,但至少有一个支持Advertising/Scanning State
2.2 比特序
Packet/Protocol DATA Unit 在链路层的比特顺序为小端序,LSB 会首先被发送
2.3 物理信道
如上所述,BLE在2.4G 分为40个 RF channel,这些信道分为两种: advertising 和 data
- advertising信道: 使用3个RF信道用来发现设备,初始化连接和广播数据
- data信道: 则使用多达37个RF信道用于两个连接设备间通信
3. BLE Packet
3.1 数据包格式
对于BLE链路层,advertising/data channel packet格式如下
PDU可以最大承载257byte ,在BT4.0 这个值最大为39
- 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计算得到
3.2 Advertising Channel PDU
PDU格式如下
Header格式如下
- PDU Type: 定义PDU类型
- TxAdd/RxAdd: 由PDU类型决定,若未定义,则认为是RFU(Reserved For Future Use)
- Length: 定义Payload的字节数(octets),有效范围是6~37Bytes
- Payload: 由PDU类型决定
3.2.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
3.2.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表示随机地址)
3.2.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表示随机地址)
3.3 Data Channel PDU
PDU格式如下图
Header格式如下
3.3.1 Payload
Payload格式由LLID字段决定,有下面两种类型:
- LL Data PDU: 用来发送L2CAP数据, LLID为01b/10b
- LL Control PDU: 用来控制链路层连接, 详细信息请参考规范
Payload - Opcode(1 octet) + CtrData(0~22 octets)
4. Bit Stream Processing
其中data whitening 是为了避免一长串的0或1 ,例如000000b 或 111111b这种数据。