文章轉載自:http://www.sunyouqun.com/2017/04/page/3/html
鏈路層LL(Link Layer)是協議棧中最重要的一層。算法
鏈路層的核心是狀態機,包含廣播、掃描、發起和鏈接等幾種狀態,圍繞這幾種狀態,BLE設備能夠執行廣播和鏈接等操做,鏈路層定義了在各類狀態下的數據包格式、時序規範和接口協議。數據結構
對於廣播行爲,鏈路層根據其可鏈接性,可掃描性,定向性三個維度定義了多種不一樣類型廣播事件,相應的掃描行爲和鏈接行爲根據廣播包的類型區分處理。鏈接過程涉及複雜的時序過程,利用鏈接參數能夠配置鏈接過程時序。app
廣播、掃描和鏈接各自具備白名單過濾機制,能夠針對指定地址的設備進行操做。鏈路層提供了一些列控制規程,好比加密鏈接和數據長度更新等,上層協議能夠利用這些規程控制鏈路層。dom
此外,鏈路層利用私有地址實現了隱私特性。ide
1. 狀態機
鏈路層設計了五種工做狀態,涵蓋了鏈路層的所有操做狀態:網站
狀態 | 描述 |
---|---|
Standby | 系統不作任何廣播和掃描動做,能夠維持低功耗。 |
Advertising | 系統對外發出廣播數據和掃描響應數據。掃描響應數據也是一種廣播數據,由掃描設備發出掃描請求,廣播包設備返回掃描響應數據。 |
Scanning | 監聽外部的廣播數據。掃描狀態並不能直接進入鏈接狀態。 |
Initiating | 監聽外部的廣播數據。它能夠發起鏈接請求,而後進入狀態。 |
Connection | 兩個設備創建鏈接,進行通訊。 |
這五種狀態共同組成一個狀態機,它們相互轉換關係以下:ui
觀察上圖,掃描態沒法直接進入鏈接態,從待機狀態進入鏈接狀態一般發生在鏈接已經創建的狀況。編碼
若是設備從發起態進入鏈接態稱爲主角色(Master Role)或主設備,若是從廣播態進入鏈接態稱爲從角色(Slave Role)或從設備。主設備發起鏈接請求,而且會設定鏈接過程的時序參數,從設備接受主設備設定的參數進行通訊。加密
在一個時刻,狀態機只能處於一種狀態,而鏈路層能夠同時擁有多個狀態機。這就意味着BLE設備在一個狀態機中保持鏈接狀態的同時,另外一個狀態機保持廣播狀態,或者多個鏈路狀態機同時處於鏈接狀態,這是BLE設備實現多個鏈接的基礎。
如下爲同時創建多個鏈接的場景:
- 若是設備A已經跟設備B保持鏈接,那麼設備A能夠執行廣播或掃描操做。
- 若是設備A已經跟設備B保持鏈接,而且設備A是主設備,那麼設備A可以跟其餘從設備C再次創建鏈接。
- 若是設備A已經跟設備B保持鏈接,而且設備A是從設備,那麼設備A可以跟其餘主設備C再次創建鏈接。
- 若是設備A已經跟設備B保持鏈接,那麼不能實現設備A掃描,設備B廣播並再次創建鏈接。設備A與B之間只能維持一個鏈接狀態機。
2. 設備地址
設備地址表明了設備的惟一識別碼,它是設備間相互識別的依據,不一樣的設備必須具備不一樣的設備地址。
設備地址分爲多種類型,最簡單的是Public Address。這種地址固定不變,能夠根據設備地址跟蹤到該設備。
Public Address屬於一種48-bit的MA-L類型地址,它的結構爲:NN:NN:NN:NN:NN:NN。
其中前三個字節使用OUI(Organizationally Unique Identifier),後三字節自由分配。OUI表明了一個指定的組織機構識別碼,全球已經有許多科技公司申請了本身的OUI。開發者能夠從IEEE網站上下載已被分配的MA-L地址,也能夠從第三方網站查詢某個公司的OUI或某個OUI對應的公司。
與Public Address不一樣,Random Address採用一個隨機數做爲地址,Random Address分爲Static Address和Private Address兩類,Private Address又分爲Resolvable private address和Non-resolvable private address兩類。
它們的特色以下表所示:
地址類型 | 是否可變 | 更新觸發機制 | 做爲識別地址 | 描述 |
---|---|---|---|---|
1. Public Address | 固定 | 無 | Yes | 固定不變,須要避免地址衝突。 |
2. [Random Address] | ||||
2.1 Static Address | 隨機 | 設備從新上電 | Yes | 設備上電時產生新的隨機地址。 |
2.2 [Private Address] | ||||
2.2.1 Resolvable private address | 隨機 | 定時 | No | 過一段時間更新隨機地址,鏈路層推薦更新週期爲15分鐘。該地址能夠經過地址識別密鑰解析識別。 |
2.2.2 Non-resolvable private address | 隨機 | 定時 | No | 過一段時間更新隨機地址,鏈路層推薦更新週期爲15分鐘。該地址能夠不可被解析識別。 |
一個設備能夠具備多種類型的地址,可是必須擁有一個識別地址。Public Address和Static Address可做爲識別地址。因此若是設備採用Resolvable private address地址類型,必須同時具備一個Public Address或Static Address地址。
3. 物理信道
在物理層的介紹中,提到了BLE將2.4GHz頻段分紅了40個物理信道,相鄰信道頻率間隔爲2MHz。
這40個物理信道分紅如下幾類:
信道類型 | 信道號 | 描述 |
---|---|---|
Primary Advertising Channel | 3七、3八、39 | 發送傳統廣播和掃描請求 |
Secondary Advertising Channel | 0 – 36 | 發送擴展廣播 |
Periodic Advertising Channel | 0 – 36 | 發送週期廣播 |
Data Channel | 0 – 36 | 發送鏈接數據 |
4. 數據包結構
4.1 非編碼型物理層
非編碼型物理層對應的鏈路層數據包結構包含四個部分:前導碼,訪問地址,PDU和CRC。以下所示:
字段 | Preamble | Access Address | PDU | CRC |
---|---|---|---|---|
長度 | 1 or 2 octets | 4 octets | 2 – 257 octets | 3 octets |
傳輸時間(1M PHY/2M PHY) | 8 us/8 us | 32 us/16 us | 16 – 2056 us/8 – 1028 us | 24 us/12 us |
- 前導碼:前導碼內容爲重複的0/1或1/0序列,用於頻率同步、符號時序計算和自動增益控制。對於1M速率的物理層,其長度爲1字節;對於2M速率的物理層,其長度爲2字節。
- 訪問地址:用於區分不一樣的數據類型。對於主要廣播信道的數據包,其訪問地址是一個固定值,對於其餘信道的數據包,其訪問地址是一個隨機值。
- PDU:包含了有效數據。
- CRC:針對PDU部分進行校驗。假如PDU通過加密,則校驗加密後的PDU。
4.2 編碼型物理層
編碼型物理層對應的鏈路層數據包作了FEC編碼處理,增長了幾個字段,其結構以下:
字段 | Preamble | Access Address | CI | TERM1 | PDU | CRC | TERM2 |
---|---|---|---|---|---|---|---|
長度 | 10 octets | 4 octets | 2 bits | 3 bits | 2 – 257 octets | 3 octets | 3 bits |
傳輸時間(1M Coded PHY) | 80 us | 256 us | 16 us | 24 us | N×8×S us | 24×S us | 3×S us |
其中Access Address、CI和TERM1屬於FEC block 1,PDU、CRC和TERM2屬於FEC block 2。FEC block 1採用S=8編碼算法,FEC block 2根據CI字段值採用S=2或S=8編碼算法。
編碼型物理層的符號傳輸速率是1M Sym/s,當採用S=2編碼,數據傳輸速率爲500bit/s,當採用S=8編碼,數據傳輸速率爲125bit/s。
- 前導碼:前導碼內容爲重複的00111100序列,它不執行FEC編碼。
- 訪問地址:與上相同。
- CI:編碼指示器,若是CI=0,則FE block 2執行S=8編碼,若是CI=1,則FEC block 2執行S=2編碼。
- TERM1和TERM2:FEC算法終止符。
5 廣播信道PDU
廣播信道包括主要廣播信道和次要廣播信道,在這些信道中能夠傳輸廣播數據、掃描數據、發起鏈接數據和擴展廣播數據。
廣播信道中的傳輸的數據PDU結構以下:
字段 | Header | Payload |
---|---|---|
長度 | 2 octets | 1 – 255 octets |
其中Header字段的結構以下:
字段 | PDU Type | RFU | ChSel | TxAdd | RxAdd | Length |
---|---|---|---|---|---|---|
長度 | 4 bits | 1 bit | 1 bit | 1 bit | 1 bit | 8 bits |
- PDU Type:PDU數據的類型,具體而言就是不一樣的廣播數據。
- RFU:For Future Use,即暫時不用。
- ChSel:信道選擇。
- TxAdd:發送數據的設備地址類型,若是該位是0表示public address,1表示random address。
- RxAdd:接收數據的設備地址類型,若是該位是0表示public address,1表示random address。
- Length:Payload的長度。有效範圍爲1 – 255字節。
PDU Type的可選值以下表:
PDU Type bits | PDU類型 | 分類 |
---|---|---|
0000b | ADV_IND | 廣播PDU |
0001b | ADV_DIRECT_IND | 廣播PDU |
0010b | ADV_NONCONN_IND | 廣播PDU |
0011b | SCAN_REQ | 掃描PDU |
0011b | AUX_SCAN_REQ | 掃描PDU |
0100b | SCAN_RSP | 掃描PDU |
0101b | CONNECT_IND | 鏈接PDU |
0101b | AUX_CONNECT_REQ | 鏈接PDU |
0110b | ADV_SCAN_IND | 廣播PDU |
0111b | ADV_EXT_IND | 廣播PDU,擴展廣播PDU |
0111b | AUX_ADV_IND | 廣播PDU,擴展廣播PDU |
0111b | AUX_SCAN_RSP | 掃描PDU,擴展廣播PDU |
0111b | AUX_SYNC_IND | 廣播PDU,擴展廣播PDU |
0111b | AUX_CHAIN_IND | 廣播PDU,擴展廣播PDU |
1000b | AUX_CONNECT_RSP | 鏈接PDU,擴展廣播PDU |
5.1 廣播PDU
PDU類型 | Payload內容 | 適用的廣播事件 |
---|---|---|
ADV_IND | 廣播設備地址,廣播數據 | connectable and scannable undirected advertising event |
ADV_DIRECT_IND | 廣播設備地址,目標設備地址 | connectable directed advertising event |
ADV_NONCONN_IND | 廣播設備地址,廣播數據 | non-connectable and non-scannable undirected advertising event |
ADV_SCAN_IND | 廣播設備地址,廣播數據 | scannable undirected advertising event |
ADV_EXT_IND | 廣播設備地址,目標設備地址,ADI,Aux指針,發送功率等級 | 除了connectable and scannable undirected advertising event以外所有事件 |
AUX_ADV_IND | 廣播設備地址,目標設備地址,ADI,Aux指針,同步信息,發送功率等級,ACAD,廣播數據 | 除了connectable and scannable undirected advertising event以外所有事件 |
AUX_SYNC_IND | Aux指針,發送功率等級,ACAD,廣播數據 | periodic advertising event |
AUX_CHAIN_IND | ADI,Aux指針,發送功率等級,廣播數據 | 除了connectable and scannable undirected advertising event以外所有事件 |
其中,AUX縮寫表示輔助(Auxiliary),EXT縮寫表示擴展(Extend)。
5.2 掃描PDU
PDU類型 | Payload內容 |
---|---|
SCAN_REQ | 掃描設備地址,廣播設備地址 |
SCAN_RSP | 廣播設備地址,掃描響應數據 |
AUX_SCAN_REQ | 掃描設備地址,廣播設備地址 |
AUX_SCAN_RSP | 廣播設備地址,Aux指針,發送功率等級,ACAD,廣播數據 |
5.3 鏈接PDU
PDU類型 | Payload內容 |
---|---|
CONNECT_IND | 發起設備地址,廣播設備地址,LLData |
AUX_CONNECT_REQ | 發起設備地址,廣播設備地址,LLData |
AUX_CONNECT_RSP | 廣播設備地址,目標設備地址 |
其中LLData包含了創建鏈接須要用到的參數信息,以下:
字段 | AA | CRCInit | WinSize | WinOffset | Interval | Latency | Timeout | ChM | Hop | SCA |
---|---|---|---|---|---|---|---|---|---|---|
長度 | 4 octets | 3 octets | 1 octet | 2 octets | 2 octets | 2 octets | 2 octets | 5 octets | 5 bits | 3 bits |
- AA:鏈路層的訪問地址。
- CRCInit:校驗運算的初值,由鏈路層隨機生成。
- WinSize:創建鏈接時的鏈接窗口。
- WinOffset:創建鏈接時的鏈接窗口偏移量。
- Interval:鏈接間隔。
- Latency:從設備的握手潛伏期。
- Timeout:從設備斷開的超時時間。
- ChM:信道佔用圖。該參數共40bit,第1位表示信道0,第2位表示信道1,以此類推。前37個比特位表明37個數據信道,若是對應的信道曾經被使用過,則設置1,不然設置0。
- Hop:跳頻算法的增量,它的範圍是5-16。
- SCA:睡眠時鐘精度(Sleep Clock Accuracy)。SCA的取值與睡眠時鐘精度的關係以下表:
SCA 睡眠時鐘精度 0 250ppm – 500ppm 1 150ppm – 250ppm 2 100ppm – 150ppm 3 75ppm – 100ppm 4 50ppm – 75ppm 5 30ppm – 50ppm 6 20ppm – 30ppm 7 0 – 20ppm
5.4 擴展廣播PDU
擴展廣播是BLE 5新增的廣播類型,這裏將他們單獨提取出來以下:
- ADV_EXT_IND
- AUX_ADV_IND
- AUX_SCAN_RSP
- AUX_SYNC_IND
- AUX_CHAIN_IND
- AUX_CONNECT_RSP
這些PDU具備相同的數據結構:
字段 | Extended Header Length | AdvMode | Extended Header | AdvData |
---|---|---|---|---|
長度 | 6 bits | 2 bits | 0 – 63 octets | 0 – 254 octets |
- Extended Header Length:Extended Header字段的長度,它的有效範圍是0到63。
- AdvMode:廣播事件發生時該設備所處的模式,它與各類模式的對應關係以下:
AdvMode | 模式 |
---|---|
00b | Non-connectable + non-scannable |
01b | Connectable + non-scannable |
10b | Non-connectable + scannable |
- Extended Header:擴展協議頭,其結構以下:
字段 | Extended Header Flags | AdvA | TargetA | RFU | AdvData Info(ADI) | AuxPtr | SyncInfo | TxPower | ACAD |
---|---|---|---|---|---|---|---|---|---|
長度 | 1 octet | 6 octets | 6 octets | 1 octet | 2 octets | 3 octets | 18 octets | 1 octets | varies |
- 各字段含義:
- Extended Header Flags:擴展協議頭各個字段的開關標誌位。該字段有8個比特位,前7位分別對應AdvA、TargetA、RFU、ADI、AuxPtr、SyncInfo、TxPower,若是置1表示包含該字段,若是置0表示不包含。第8個比特位不與ACAD字段關聯,暫不使用。
- AdvA:廣播設備地址。
- TargetA:掃描設備或發起設備地址。
- ADI:廣播數據信息。該字段分兩部分:DID(Advertising Data ID)和SID(Advertising Set ID),若是一個廣播包由多個子包組成,那麼這些子包的SID相同,DID不一樣,若是DID也相同,則說明該包內容與前包內容同樣。
- AuxPtr:輔助廣播包的指針(Auxiliary Pointer)。它告訴鏈路層下一個輔助廣播包的信道號和時間偏移。
- SyncInfo:週期廣播包信息。‘
- TxPower:設備輸出功率。
- ACAD:額外的廣播數據(Additional Controller Advertising Data)。它能包含少許的廣播數據,能夠配合普通廣播包使用。
- AdvData:擴展廣播數據,單個PDU可達255字節。
6. 數據信道PDU
數據信道PDU結構以下:
字段 | Header | Payload | MIC(Optional) |
---|---|---|---|
長度 | 2 octets | 0 – 251 octets | 4 octets |
- Header:協議頭。其結構以下:
字段 | LLID | NESN | SN | MD | RFU | Length |
---|---|---|---|---|---|---|
長度 | 2 bits | 1 bit | 1 bit | 1 bit | 3 bits | 8 bits |
- 其字段含義以下:
- LLID:鏈路ID(Link Layer ID),用以區分該PDU是一個數據仍是控制命令。當LLID=11b,表示該PDU是一個控制命令。
- NESN:下一個指望的PDU序號(Next Expected Sequence Number)。
- SN:當前PDU序號(Sequence Number)。SN與NESN合做,能夠推測出該PDU是一個新數據,仍是對上一個老數據的重傳,從而實現流程控制。
- MD:數據未完(More Data),表示後續還有數據片斷。
- Length:Payload+MIC的總長度,有效範圍爲0-255字節。
- Payload:裝載L2CAP層數據包或鏈路層控制命令。對於數據包,最大Payload長度爲251字節。L2CAP數據可能被分段,若是當前Payload是L2CAP數據包的開頭或結尾片斷,則LLID=10b,不然LLID=01b。
- MIC:完整性檢測(Message Integrity Check)。用於確認加密的Payload是否完整有效。當Payload不加密或者Payload長度爲0時,MIC字段不存在。
若是傳輸鏈路層可控制命令,則將控制命令裝載在Payload字段中。
控制命令的結構以下:
Opcode | CtrData | |
---|---|---|
長度 | 1 octet | 0 – 26 octets |
- Opcode:操做碼,表明不一樣的控制命令。
- CtrData:控制參數。
鏈路層的全部控制命令以下:
Opcode | Control PDU Name | Opcode | Control PDU Name |
---|---|---|---|
0x00 | LL_CONNECTION_UDPATE_IND | 0x0D | LL_REJECT_IND |
0x01 | LL_CHANNEL_MAP_IND | 0x0E | LL_SLAVE_FEATURE_REQ |
0x02 | LL_TERMINATE_IND | 0x0F | LL_CONNECTION_PARAM_REQ |
0x03 | LL_ENC_REQ | 0x10 | LL_CONNECTION_PARAM_RSP |
0x04 | LL_ENC_RSP | 0x11 | LL_REJECT_EXT_IND |
0x05 | LL_START_ENC_REQ | 0x12 | LL_PING_REQ |
0x06 | LL_START_ENC_RSP | 0x13 | LL_PING_RSP |
0x07 | LL_UNKNOWN_RSP | 0x14 | LL_LENGTH_REQ |
0x08 | LL_FEATURE_REQ | 0x15 | LL_LENGTH_RSP |
0x09 | LL_FEATURE_RSP | 0x16 | LL_PHY_REQ |
0x0A | LL_PAUSE_ENC_REQ | 0x17 | LL_PHY_RSP |
0x0B | LL_PAUSE_ENC_RSP | 0x18 | LL_PHY_UPDATE_IND |
0x0C | LL_VERSION_IND | 0x19 | LL_MIN_USED_CHANNELS_IND |
上述26個控制命令,能夠分爲如下幾類:
- 加密:包括加密開始、暫停。
- 鏈接控制:包括鏈接參數更新,鏈接終止,PING。
- 信息交換:包括鏈路層功能交換,物理層信息交換,版本信息,信道圖信息。
- 擴展功能:物理層更新,包長度更新。
- 雜項:錯誤響應、命令拒絕。
7. 數據流
7.1 非編碼型物理層
對於非編碼型物理層,數據處理流程以下:
上面一行表示發送過程,數據流從左至右,BLE數據先進行加密,而後生成CRC校驗信息,再進行白化(Whiten),從天線發射出去。
下面一行表示接收過程,數據流從右至左,執行發送過程的逆過程。
白化過程對數據序列執行多項式變化,使連續的0或連續的1數字序列被打散。由於接收機長時間接收0或1會誤覺得信號發生了頻偏。
反白化則將白化數據還原成原始數據。因爲白化和反白化是公開可逆的,因此它們無需加密。
BLE數據接收時,再進入反白化以前,首先檢查訪問地址是否正確,檢測失敗的數據會被拋棄。CRC校驗失敗的數據也會被拋棄。
7.2 編碼型物理層
相對於非編碼型物理層,編碼型物理層多了編解碼過程,數據的處理流程以下:
編碼過程包含前向糾錯編碼(FEC)和模式映射(Pattern Mapper)兩個子過程。
前向編碼將原始數據作卷積處理,處理後1個比特原始數據變成2個比特。
模式映射對卷積結果進行展寬,展寬映射以下:
卷積結果 | 模式映射(S=2) | 模式映射(S=8) |
---|---|---|
0 | 0 | 0011 |
1 | 1 | 1100 |
最終,S=2狀況下1個比特變成了2個比特,S=8狀況下1個比特變爲8個比特。冗餘的比特能夠用來自矯正,從而減小重傳次數,間接的提高了接收靈敏度。
8. 空中接口協議
空中接口協議定義了鏈路層在各類狀態下的行爲和時序規範。
8.1 幀間隔
幀內間隔T_IFS(Inner Frame Space)
幀內間隔表示前一幀的末尾與下一幀的開頭之間的時間。
這個間隔時間爲固定150us,一般表示爲T_IFS = 150us。
最小輔助幀間隔T_MAFS(Min AUX Frame Space)
假如一個幀包含AuxPtr,最小輔助幀間隔表示該幀末尾與其輔助幀開頭之間的時間。
這個間隔時間爲固定300us,一般表示爲T_MAFS = 300us。
8.2 時鐘精度
鏈路層須要用到兩個時鐘精度參數,廣播事件和鏈接事件使用活動時鐘精度,其餘事件則使用睡眠時鐘精度。
活動時鐘精度爲±50ppm,睡眠時鐘精度爲±500ppm。
活動時鐘驅動的行爲事件,其時序偏差應小於±2us,睡眠時鐘驅動的行爲事件,其時序偏差應小於16us。
除此以外,BLE 5引入了一個距離延遲(Range Delay)的概念。
因爲BLE 5極大的擴展了通訊距離,假如兩個設備相距1km,那麼電磁波在空間傳輸,會產生一個時延,稱爲距離延遲。
電磁波速度爲光速,考慮通訊介質(空氣),作了一個保守估計1/c = 4ns。
因而能夠獲得:距離延遲T(range) ≈ 2Distance * 4ns。
(蛋疼)
8.3 設備過濾機制
鏈路層基於設備地址執行設備過濾機制,利用一個白名單,記錄設備的地址和地址類型。
廣播狀態、掃描狀態和發起狀態三種狀態下的過濾機制相互獨立,擁有各自的過濾策略,可是三種過濾機制共享一個白名單。
過濾機制 | 描述 |
---|---|
廣播過濾機制 | 根據白名單過濾掃描和鏈接請求 |
掃描過濾機制 | 根據白名單過濾廣播數據 |
鏈接過濾機制 | 根據白名單鏈接廣播設備 |
8.4 廣播事件
在廣播狀態下,鏈路層在廣播事件中發送廣播數據PDU,一個廣播事件中能夠發送多個廣播數據PDU。
BLE 5擴展了廣播能力,能夠按照新增的廣播功能對廣播事件進行分類,以下:
廣播事件 | 廣播信道 | 描述 |
---|---|---|
Advertising Event | 主要廣播信道 | 傳統的廣播事件 |
Extended Advertising Event | 次要廣播信道 | 擴展的廣播事件,使用帶AUX_ADV_IND |
Periodic Advertising Event | 次要廣播信道 | 週期的廣播事件,使用AUX_SYNC_IND |
傳統的廣播事件
廣播事件是指完成一次廣播數據的發送。
一次廣播事件中,設備依次在3七、3八、39三個信道上傳輸相同的廣播數據,並監聽掃描請求和鏈接請求。收到請求時若是掃描過濾策略或鏈接策略容許,則作相應的響應,不然關閉本次廣播事件或跳到下一個主要廣播信道繼續廣播。以下圖所示:
兩個相鄰的廣播事件之間的時間差稱爲廣播間隔。廣播間隔是一個整數乘以0.625ms,有效範圍是20ms至10485.759375s。
兩個相鄰廣播之間會加入一個0-10ms的隨機時延,稱爲advDelay。下圖爲三次廣播事件,依次發生在3七、3八、39廣播信道上:
實際上兩次廣播事件之間的時間略大於廣播間隔,T_advEvent = advInterval + advDelay。
擴展的廣播事件
擴展的廣播事件能夠經過多個輔助PDU來傳輸廣播數據,極大擴展了廣播數據的容量。
擴展廣播事件包含了一個傳統的廣播PDU,以及一些列輔助廣播PDU,以下圖所示:
週期的廣播事件
週期廣播,以一個恆定的鏈接間隔進行廣播,廣播一旦開始就不能更改廣播間隔。
週期廣播,使用AUX_SYNC_IND做爲廣播週期的標識,兩個相鄰的AUX_SYNC_IND PDU之間的事件間隔稱爲週期廣播事件的廣播間隔。以下所示:
廣播間隔是一個整數乘以1.25ms,有效範圍是7.5ms至81.91875s。
廣播事件類型
按照可否鏈接、可否接受主動掃描和是否認向三個維度能夠將廣播事件作以下分類:
廣播事件 | 可鏈接/可掃描/定向 | 可用PDU類型 | 廣播信道 |
---|---|---|---|
connectable and scannable undirected event | Y/Y/N | ADV_IND | 主要廣播信道 |
connectable undirected event | Y/N/N | ADV_EXT_IND | 次要廣播信道 |
connectable directed event | Y/N/Y | ADV_DIRECT_IND, ADV_EXT_IND | 主要廣播信道,次要廣播信道 |
non-connectable and non-scannable undirected event | N/N/N | ADV_NONCONN_IND, ADV_EXT_IND | 主要廣播信道,次要廣播信道 |
non-connectable and non-scannable directed event | N/N/Y | ADV_EXT_IND | 次要廣播信道 |
scannable undirected event | N/Y/N | ADV_SCAN_IND, ADV_EXT_IND | 主要廣播信道,次要廣播信道 |
scannable directed event | N/Y/Y | ADV_EXT_IND | 次要廣播信道 |
8.5 掃描事件
鏈路層在掃描狀態下在主要廣播信道監聽廣播數據。被動掃描不發任何數據,主動掃描發出掃描請求並監聽掃描響應。
掃描行爲的持續過程稱爲掃描窗口scanWindow,兩次掃描行爲之間的時間間隔成爲掃描間隔scanInterval,顯然掃描窗口不能大於掃描間隔,若是掃描窗口等於掃描間隔,鏈路層將持續掃描。
掃描間隔的最大值是40.96s。
假如廣播設備擴展廣播,鏈路層還需監聽次要廣播信道中的輔助廣播包。
鏈路層監聽到廣播數據,或接收到掃描響應數據,則向主機發出廣播報告(Advertising Report)。
8.6 鏈接事件
鏈路層屬於Master Role的設備稱爲主機(master),屬於Slave Role的設備稱爲從機(slave)。
一旦進入鏈接狀態,就視爲創建了鏈接。創建鏈接後,主機會發出一個數據並等待從機的響應,若是在6個鏈接間隔內都未等到從機的數據包,則視爲鏈接斷開。
在鏈接狀態下,兩端設備發送數據包的最小單元稱爲鏈接事件。鏈路層僅在鏈接事件中發送PDU數據,在一個鏈接事件內,能夠發出多個PDU,相鄰PDU之間至少保留T_IFS時間。
8.6.1 鏈接參數
鏈接事件的時序受兩個參數的影響:鏈接間隔和從機握手潛伏數。
兩個鏈接事件之間的事件間隔稱爲鏈接間隔。鏈接間隔是一個整數乘以1.25ms,有效範圍是7.5ms至4s。
從機無需監聽每一次主機的鏈接事件,忽略的事件總數稱爲從機握手潛伏數。主機設置一個監聽超時,當主機等待超時仍未得到從機的響應,則認爲鏈接斷開,並向主機報告。監聽超時是一個整數乘以10ms,有效範圍爲100ms至32s。
8.6.2 鏈接過程 – 主機端
主機在發出CONNECT_REQ以後,即進入鏈接狀態,而後等待一會時間,發送第一個數據包。
等待的時間主要是爲了留下空餘讓從機有充分時間喚醒和準備。
等待的時間包括三個參數:transmitWindowDelay,transmitWindowOffset和transmitWindowSize。其中第一個參數對於不一樣的物理層實現是一個固定值,後兩項則能夠經過主機進行設置。
主機鏈接過程的時序圖以下:
主機的一個數據包老是在發送窗口(Transmit Window)中發送,發送窗口的時序位置由以上三個參數共同肯定。
輔助廣播包引發的鏈接過程,與上圖基本一致。
8.6.3 鏈接過程 – 從機端
在創建鏈接時,從機端須要監聽主機端發出的第一包數據。假如從機錯過了傳輸窗口,則在下一個鏈接間隔中監聽主機第一包數據。以下圖所示:
輔助廣播包產生的鏈接過程,與上圖基本一致。
8.6.4 關閉鏈接事件
關閉鏈接事件並不是斷開鏈接,僅表示當次數據傳輸事件完畢。
當鏈接事件中僅有一個PDU須要發送,則發送完畢後便可關閉鏈接事件。
若是鏈接事件中有多個PDU須要發送,那麼將在PDU中設置MD(More Data)字段,在一個PDU發送完畢後持續發送,直到所有PDU發送完畢,再關閉鏈接事件。
每次主機發送一個PDU,從機都須要返回一個響應。假如從機沒有返回響應,則主機中斷髮送,關閉鏈接事件。若是PDU沒有發送完畢,從機沒有收到主機發送的數據包,則從機端關閉鏈接事件。若是PDU的CRC校驗失敗,則關閉鏈接事件。
8.6.5 窗口展寬
鏈接事件的時序由睡眠時鐘決定,而兩端設備的睡眠時鐘的精度均是±500ppm,所以從機爲了收到主機的PDU,須要提早一段時間喚醒以監聽主機的數據。
這段提早喚醒的監聽時間,稱爲「窗口展寬」。顯然提升睡眠精度將減小從機的窗口展寬時間。
windowWidening = (( masterSCA + slaveSCA ) / 1000000) * timeSinceLastAnchor
其中masterSCA表示主機的睡眠時鐘精度,slaveSCA表示從機的睡眠時鐘精度,timeSinceLastAnchor表示上一次
8.7 流程控制
數據信道PDU中有兩個參數能夠實現確認機制:SN,NESN。其中SN表示當前數據包的序號SeqNum,NESN表示下一個指望包的序號NextExpectedSeqNum。
SN和NESN字段長度均爲1比特,在鏈接事件開始時,兩者均設置爲0,以後在0與1之間變換。
設備接收數據包時,若是發現SN和NESN相同,代表該數據包爲新數據,則跳變NESN。若是發現SN和NESN不一樣,代表上次發送從機未收到,該數據位重發數據,則不跳變NESN。
設備發送數據包時,若是發現SN和NESN不一樣,代表上次數據被成功收到,則發送新的數據並跳變SN。若是發現SN和NESN相同,代表上次數據未被成功收到,則重發上次數據且不跳變SN。
概括數據接收和發送兩種狀況,以下圖所示:
數據信道PDU中還包括MD(More Data)字段,表示當前數據包後面是否還有更多數據包。
利用SN、NESN、MD三個字段,便可實現長包發送的流程控制。
8.8 PDU長度
鏈路層的鏈接狀態PDU長度範圍以下:
是否支持數據包擴展特性 | 是否支持編碼性物理層 | 最大長度(字節) | 最大傳輸時間(微秒) |
---|---|---|---|
N | N | 27 | 328 |
Y | N | 27-251 | 328-2120 |
N | Y | 27 | 328-2704 |
Y | Y | 27-251 | 328-17040 |
根據上表,對於不支持擴展數據包和非編碼型物理層的設備,鏈路層傳輸一個27字節PDU的時間爲328us。
8.9 特性支持
設備能夠選擇性支持鏈路層的功能特性,對於兩端設備均支持的功能特性,纔可使用。
鏈路層的功能特性列表以下,許多特性與鏈路層控制命令一致。
# | 特性 |
---|---|
0 | LE Encryption |
1 | Connection Parameters Request Procedure |
2 | Extended Reject Indication |
3 | Slave-initiated Features Exchange |
4 | LE Ping |
5 | LE Data Packet Length Extension |
6 | LL Privacy |
7 | Extended Scanner Filter Policies |
8 | LE 2M PHY |
9 | Stable Modulation Index – Transmitter |
10 | Stable Modulation Index – Receiver |
11 | LE Coded PHY |
12 | LE Extended Advertising |
13 | LE Periodic Advertising |
14 | Channel Selection Algorithm #2 |
15 | LE Power Class 1 |
16 | Minimum Number of Used Channels Procedure |
9. 鏈路層控制
鏈路層定義了控制鏈路的規程,利用這些規程,更新鏈路層的參數,以下表:
規程 | 描述 |
---|---|
Connection Update Procedure | 更新鏈接參數,僅在「鏈接參數請求」被拒絕的狀況下,才執行該規程 |
Channel Map Update Procedure | 更新信道映射圖,參與跳頻信道選擇 |
Encryption Procedure | 加密數據包 |
Feature Exchange Procedure | 交換所支持的特性 |
Version Exchange | 交換版本信息,包括鏈路層版本,公司ID等 |
Termination Procedure | 斷開鏈接規程 |
Connection Parameters Request Procedure | 更新鏈接參數請求規程 |
LE Ping Procedure | Ping規程 |
Data Length Update Procedure | 更新最大PDU長度規程 |
PHY Update Procedure | 物理層更新規程 |
Minimum Number Of Used Channels Procedure | 使用最少信道規程 |
鏈路層應該單線程操做規程,而且設置超時,若是同時進行兩個不兼容的規程,將致使斷開鏈接。
10. 隱私
鏈路層的隱私特性就是使用可解析的私有地址。
鏈路層維護一個計時器,當計時器觸發,則更新私有地址,若是鏈接斷開,也更新私有地址。協議棧推薦該計時器的週期爲15分鐘。
若是廣播設備使用了可解析的私有地址,則PDU中的廣播設備地址字段使用本地的IRK生成。
若是發起設備使用了可解析的私有地址,則PDU中的設備地址字段可使用該私有地址。
若是廣播設備收到了使用了可解析私有地址的掃描設備或發起設備的請求,則須要解析該地址。
若是發起設備收到了使用了可解析私有地址的廣播設備的廣播數據,則須要解析該地址。
(完)