認識BLE 5協議棧 —— 鏈路層
轉自 http://www.sunyouqun.com/2017/04/understand-ble-5-stack-link-layer/
鏈路層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中的裝置地址欄位可以使用該私有地址。
如果廣播裝置收到了使用了可解析私有地址的掃描裝置或發起裝置的請求,則需要解析該地址。
如果發起裝置收到了使用了可解析私有地址的廣播裝置的廣播資料,則需要解析該地址。