文章轉載自:http://www.sunyouqun.com/2017/04/page/3/
鏈路層LL(Link Layer)是協議棧中最重要的一層。
鏈路層的核心是狀態機,包含廣播、掃描、發起和連接等幾種狀態,圍繞這幾種狀態,BLE設備可以執行廣播和連接等操作,鏈路層定義了在各種狀態下的數據包格式、時序規范和接口協議。
對於廣播行為,鏈路層根據其可連接性,可掃描性,定向性三個維度定義了多種不同類型廣播事件,相應的掃描行為和連接行為根據廣播包的類型區分處理。連接過程涉及復雜的時序過程,利用連接參數可以配置連接過程時序。
廣播、掃描和連接各自具有白名單過濾機制,可以針對指定地址的設備進行操作。鏈路層提供了一些列控制規程,比如加密連接和數據長度更新等,上層協議可以利用這些規程控制鏈路層。
此外,鏈路層利用私有地址實現了隱私特性。
1. 狀態機
鏈路層設計了五種工作狀態,涵蓋了鏈路層的全部操作狀態:
狀態 | 描述 |
---|---|
Standby | 系統不做任何廣播和掃描動作,可以維持低功耗。 |
Advertising | 系統對外發出廣播數據和掃描響應數據。掃描響應數據也是一種廣播數據,由掃描設備發出掃描請求,廣播包設備返回掃描響應數據。 |
Scanning | 監聽外部的廣播數據。掃描狀態並不能直接進入連接狀態。 |
Initiating | 監聽外部的廣播數據。它可以發起連接請求,然后進入狀態。 |
Connection | 兩個設備建立連接,進行通信。 |
這五種狀態共同組成一個狀態機,它們相互轉換關系如下:
觀察上圖,掃描態無法直接進入連接態,從待機狀態進入連接狀態通常發生在連接已經建立的情況。
如果設備從發起態進入連接態稱為主角色(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 | 37、38、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 |
傳統的廣播事件
廣播事件是指完成一次廣播數據的發送。
一次廣播事件中,設備依次在37、38、39三個信道上傳輸相同的廣播數據,並監聽掃描請求和連接請求。收到請求時如果掃描過濾策略或連接策略允許,則做相應的響應,否則關閉本次廣播事件或跳到下一個主要廣播信道繼續廣播。如下圖所示:
兩個相鄰的廣播事件之間的時間差稱為廣播間隔。廣播間隔是一個整數乘以0.625ms,有效范圍是20ms至10485.759375s。
兩個相鄰廣播之間會加入一個0-10ms的隨機時延,稱為advDelay。下圖為三次廣播事件,依次發生在37、38、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中的設備地址字段可以使用該私有地址。
如果廣播設備收到了使用了可解析私有地址的掃描設備或發起設備的請求,則需要解析該地址。
如果發起設備收到了使用了可解析私有地址的廣播設備的廣播數據,則需要解析該地址。
(完)