BLE介绍

Posted by Vector Blog on November 16, 2015

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这种数据。