本文涉及如下問題:
-
如何建立連接
-
如何提高傳輸速率
-
異常時如何快速斷開連接
-
如何跳頻
-
BLE data的PDU如何展開分析
初始化連接是在廣播通道上建立的,參考 BLE:廣播channel上的PDU分析,本文將重點介紹BLE連接
1. 連接建立
當設備收接收到可以連接的廣播(ADV_IND或者ADV_DIRECT_IND)后,則可以發起建立連接請求,連接請求數據包是通過發送CONNECT_REQ的PDU來實現的,CONNECT_REQ的PDU如下所示
2 連接參數
建立連接后,兩個設備會在相等的連接間隔之間交換數據,每一次的數據交換稱之為連接事件(connectionevent),數據的發送和接收都是通過連接事件完成的,在連接事件之外,BLE設備處於休眠狀態,因此進一步降低了功耗。
廣播的設備以一定的廣播間隔周期性的廣播數據,類似的,設備建立連接后,兩個設備會以相等的時間間隔交換數據,這個間隔成為連接間隔(Connectioninterval)。
LL Data中參數解釋:
1. AA:AccessAddress,鏈路層的接入地址,參考3.2中介紹;
2. CRCInit:初始化CRC的值;
3. 和發送數據窗口相關的參數:WinSize和WinOffset
4. 連接參數:
Interval:
-
Connection interval = sleep + connection event
- master和slaver數據交換的間隔,當沒有應用數據交互,兩個設備鏈路層仍會交換數據(空PDU)來維持連接,當有應用數據時,數據通過連接間隔中的連接事件發送和接收.
-
范圍是,連接間隔是1.25ms的整數倍,范圍是 6 -3200,即7.5ms– 4s
Latency:
-
即Slave latency,
-
master每個tx數據,slave接到后都要回復,否則連接可能會被認為斷開,Slave latency則定義了slave在沒有數據要發的情況下,可以跳過一定數目的連接事件(Connection events), 在這些連接事件中不必回復Master(主設備)的包(空包),而不會被認為連接斷開
-
取值范圍是 0 - ((connSupervisionTimeout /(connInterval*2)) - 1),並且要小於500;
timeout:
· 即Connection supervision timeout,
· 如果雙方設備在超過timeout時間后,沒有數據交互,則連接被認為已斷開。
· 常用於異常斷開流程,由於鏈路異常,BLE設備之間沒有了數據,則在timeout時間到后,連接被斷開,而不會一直保持,
· 10ms的整數倍,取值范圍是 10 – 3200,即100ms – 32s,並且要大於(1+ connSlaveLatency) * connInterval * 2
例如Slavelatency = 2的情況下,可以忽略master的兩個包,但第三個包則必須回應,否則,連接有可能被斷開
這三個參數都是由master在發起連接時設定的,在連接建立后,slave可以發起更新連接參數的請求。
這幾個參數是BLE連接中重要參數,直接決定了速率和異常情況的處理:
· Connection interval決定了傳輸速率,越小,發送數據越快,但功耗也會越大
· Slave Latency為0,數據發送速度回提高,增大,則會減小功耗
· Timeout:異常情況時能否盡快斷開。
對與IOS設備的BLE相連接時,對這幾個參數的設置有明確的要求:
https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf
3. 跳頻
在CONNECT_REQPDU包中,還有兩個重要的字段ChM和Hop。
• ChannelMap:指出了在連接中使用的數據通道
• HopIncrement::用於通道選擇算法的一個5-16的隨機值
那么BLE的跳頻就是根據這幾個參數協商出來的。
可以看到廣播數據在首先37/38/39通道上發送(由於sniffer只監聽37通道,其他通道上的數據沒有顯示),當連接建立后,master和slave分別經歷了0x0C,0x18,0x24,0x0B,0x17,0x23等幾個通道,並且后續數據交互扔在不斷切換通道,即跳頻。(參考Version 4.2 [Vol 6, Part B] 4.5.8)
在建立連接時,master會在連接的PDU里,指出哪些通道使用的通道,用於連接,哪些通道是不用於連接的通道,這就是channel map。
slave在接到這樣的數據包后,雙方根據channel selection algorithm(藍牙規范定義)計算出data channel,如下:
根據channelmap和hop的值,雙方就可以協商出數據通道,在后續通信中,雙方根據
channel = (curr_channel + hop) mod 37
繼續實現跳頻,可以看到當前hop是0x0D當前在0x1A通道上,則下一跳會到02通道上,再下一跳會跳到0x0F通道上。
Spec 5.0中增加了Channel Selection Algorithm #2通道選擇算法。
4. 數據通道PDU包頭(Header)
BLE的PDU分為兩類,廣播類型PDU和數據類型PDU,結構如下:
PDU的前兩個字節的是header,通過header的內容,就可展開PDU類型,分析具體的payload,
數據通道的PDU是BLE設備連接建立以后在數據通道上發送和接收到的包,該PDU包展開如下:
數據通道PDU包括了16bit的頭,一個變長的payload,以及一個可能的數據完整性檢驗碼MIC(MessageIntegrity Check),將header進一步展開如下:
各個字段的含義為:
當LLID= 0x3時,數據類型是控制類型的包,表示為LL_CONTROL
當LLID=0x1或者0x2時,表示是L2CAP類型的包(L2CAP又分為ATT包或者SMP包,這里不過多展開),
Length包括了Payload和MIC(若有)的長度。
更多更新關注公眾號