BLE連接建立與斷開


​本文涉及如下問題:

  • 如何建立連接

  • 如何提高傳輸速率

  • 異常時如何快速斷開連接

  • 如何跳頻

  • 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(若有)的長度。

 

更多更新關注公眾號

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM