6.BLE---数据传输
概述
Ble 數據傳輸分為兩種:
連接態數據傳輸
非連接態數據傳輸
連接態下的 BLE 終端分為 Master 和 Slave,它們之間的數據傳輸與非連接態時十分類似:
Connect Interval 中 Master 和 Slave 可做多次數據交互(上圖中只畫了一次)。
由 Master 先發, Slave 在收到數據 T_IFS
時間后進行響應。
Master 發送數據包的起始時刻必須在 Connect Interval 的起始位置。
Connect Interval 的長度 connInterval 由 Master 決定,必須為 1.25ms 的整數倍,范圍分別在 7.5ms~4000ms。
基 于 降 低 功 耗 的 考 慮 , Master 和 Slave 可 適 當 降 低 數 據 交 互 的 頻 率 , 即 在
connSlaveLatency 個 Connect Interval 中選擇特定一個做數據交互。參數 connSlaveLatency 由
Master發送個Slave。connSlaveLatency取值范圍0~((connSupervisionTimeout / (connInterval*2))
- 1)*1,并且小于 500,以保證不觸發 Master 和 Slave 長期沒有收到對方來包而判斷 connect
中斷。(參數介紹在第1章與第2章)
T_IFS概念:
數據交互過程中, BLE 終端總是交替發送數據包,數據包之間的時間間隔(本文中記
為 T_IFS),其基準值是 150us,考慮到數據包在空口上的傳輸時延以及 BLE 終端的處理時
間,協議允許該時間間隔有最大 2us 或 16us 的抖動。需要特別注意的是, BLE 協議不固定
一個數據包的傳輸時間,即任何 BLE 終端傳輸一個數據包的時間是可變的。
2.進入鏈接
2.1 情況1---Slave 收到 Master 發送的第一個 Packet
進入 connect 狀態后第一個 Connect Interval 的起始時刻由 Master 發送 CONNECT_REQ
后的第一個 Packet 確定,如下圖所示,其使用基于 Transmit Window 的機制。
CONNECT_REQ后的第一個 Packet,必須在第一個 Transmit Window 內。
Transmit Window 的長度transmitWindowSize 不 允 許 大 于 10ms 和 ( connInterval-1.25ms )。
其 起 始 位 置 距 離CONNECT_REQ 結束位置的距離為(1.25ms+transmitWindowOffset), transmitWindowOffset
是由 Master 確定的參數,取值必須為 1.25ms 的整數倍,范圍 0~connInterval。
當 Slave 收到該 Pakcet 之后,其默認該 Packet 的起始位置為首個 Connect Interval 的起
始位置,并以該時間點為基準計算其后的 Connect Interval 和 Connect Event 時間段
2.2 情況2---Slave 沒有收到 Master 發送的第一個 Packet
若 Slave 沒有收到 Master 發送的第一個 Packet,則其默認第一個 Connect Interval 的起
始位置為第一個 Transmit Window 的起始位置,并且在由此計算得到的第二個 Transmit
Window,并在其中接收 Master 發送的數據,如下圖所示,
此時Master可以通過沒有收到Slave反饋的數據包推斷出 Slave 沒有收到第一個 Packet。
然后預先配置的 transmitWindowSize 和 connInterval 等參數會保證 Master 發送的第二個Packet 時落在第二個 Transmit Window 中。
2.3 誤差考慮
考慮到 Master 和 Slave 的時鐘精度不同,以及無線信號在空口的傳輸時延, Slave 在計算 Transmit Window 時需要對其做適量的展寬, 如下式所示,
windowWidening = timeSinceLastAnchor*(masterSCA+slaveSCA)/10^6
windowWidening 表示展寬的時間寬度。
timeSinceLastAnchor 表示 Transmit Window起始時刻與上一次Slave收到的Master的Packet結束時刻的時間間隔。
masterSCA和slaveSCA分別表示 Master 和 Slave 的時鐘精度,單位為 ppm。
windowWidening 必須小于((connInterval/2)-T_IFS),若 Slave 計算得到的windowWidening 不滿足該條件,則判定該 connect 失效,即刻退出
實際上 Slave 需要在(2* windowWidening+transmitWindowSize)的時間間隔內監聽 Master 發送的 Packet,
3.維護鏈接
3.1 時鐘同步
Master 和 Slave 的時間同步基于 Master 發送的 Packet 中的 Preamble 進行。
連接存續期間, Slave 已經根據接收到的 Master 的 Packet 中的 Preamble 調整自身時鐘以保證 Master 同步。
即使 Packet 的 CRC 錯誤,只要 Preamble 被檢測到, Slave 也需要進行該調整。而對于頻率同步
3.2 參數更新
該流程用于 connect 的參數更新,由 Connection Parameter Request Procedure 觸發,Master 向 Slave 發送 LL_CONNECTION_UPDATE_REQ PDU, Slave 收到后根據其要求在特定時刻更新相應的 connect 參數。如下圖所示:
若 接 收 方 不 能 正 確 解 析 LL_CONNECTION_PARAM_REQ PDU , 則 回 復LL_UNKNOWN_RSP PDU;
若接收方不能支持 LL_CONNECTION_PARAM_REQ PDU 中的參數要求,則回復 LL_REJECT_IND_EXT PDU(Error Code 填寫為 0x20 和 0x1E,分別對應不能支持和參數非法兩種情況)。
若 Master 在觸發 Connection Parameter Request Procedure 或 Connection Update Procedure 時收到了 Slave 發送的 LL_CONNECTION_PARAM_REQ PDU,則回復 Error Code為 0x23 的 LL_REJECT_IND_EXT PDU;
若 Master 在觸發 Channel Map Update Procedure 時收到了 Slave 發送的 LL_CONNECTION_PARAM_REQ PDU,則回復 Error Code 為 0x2A 的LL_REJECT_IND_EXT PDU。否則,若接收方為 Slave,其回復 LL_CONECTION_PARAM_RSP PDU(其內容需要和LL_CONECTION_PARAM_REQ PDU 保 持 一 致 ), 然 后 等 待 MASTER 發 LL_CONNECTION_UPDATE_REQ PDU 觸發新的 CONNECTION 參數生效;若接收方為MASTER,則其直接發送 LL_CONNECTION_UPDATE_REQ PDU 觸發新CONNECTIO參數生效。
需 要 特 別 強 調 的 是 , 該 過 程 中 MASTER 和 SLAVE 都 可 以 發 送LL_CONNECTION_PARAM_REQ PDU 觸發 CONNECTION 參數更新,但只有 MASTER 才
能發送 LL_CONNECTION_UPDATE_REQ PDU 觸發新的 CONNECTION 參數生效。
新的 CONNECTION 參數生效時間由 LL_CONNECTION_UPDATE_REQ PDU 中的
Instant 字段確定,該字段指示了新參數生效的 connEventCount,如下圖所示,
connEventCount的含義:對于每個鏈路層連接,主設備和從設備都應具有16位連接事件計數器(connEventCounter),其中包含值connEventCount。 它應在連接主機發送的第一個連接事件上設置為零。 對于主設備發送的每個新連接事件,它應加1; connEventCounter將從0xFFFF溢出到0x0000。 此計數器用于同步鏈路層控制過程。(BLUETOOTH SPECIFICATION Version 4.2 [Vol 6, Part B])
若在接收到 LL_CONNECTION_UPDATE_REQ PDU 的 Connect Interval 里, SLAVE 發現 Instant<(connEventCount-6) 或 (Instant-connEventCount)mod65536>32766 , 則 判 斷 當 前CONNECTION 中斷,需立即進入 STANDBY 狀態。在新參數生效的第 connEventCount 個 Connect Interval 里, SLAVE 需要使用 Transmit Window 機制重新確定 Connect Interval 的起始時刻
若參數在connect下更新了, Master 和 Slave 需要像初始建立連接一樣,使用Transmit Window 的機制重新確定 connect interval 的起始時間點,如下圖所示:
connIntervalOLD和 connIntervalNEW分別表示更新前后的 connInterval。
為進一步降低 Slave 的功耗,協議在 Connection Parameter Request Procedure 中引入了Offset0~5 和 ReferenceConnEventCount 等字段指示新的 Connect Interval 的起始位置
3.3重傳機制
處于連接態的兩個 BLE 終端使用簡單的"停等"機制進行通信,如下圖所示,
每個 BLE 終端都維護兩個 1 bit 參數: transmitSeqNum 和 nextExpectedSeqNum,分別指示當前傳輸的數據包序號和下一個期待接收的數據包序號,它們與 Packet 中的 SN 和 NESN字段一起維護 Master 和 Slave 之間的重傳機制。 transmitSeqNum 和nextExpectedSeqNum 在 connect 建立時都初始化為 0。
發送數據包時,對于 SN 字段,若數據包為新傳,則設置為自身 transmitSeqNum 取值,否者與上一次傳輸一致;對于 NESN 字段,始終設置為自身 nextExpectedSeqNum 取值。
接收數據包時, transmitSeqNum 和 nextExpectedSeqNum 按照如下原則進行更新,若 SN 字 段 與 自 身 nextExpectedSeqNum 一 致 , 則 表 明 該 數 據 包 為 重 傳 ,nextExpectedSeqNum 不變;否者為新傳,并且需要將自身 nextExpectedSeqNum 取反。若 NESN 字段與自身 transmitSeqNum 一致,則表明接收到 NACK,即上一次自己
發送的數據包失敗,需要重發;否者表明收到 ACK,需要發送新的數據包,并且
將將自身 transmitSeqNum 取反。若接收到的數據包 CRC 錯誤,則不更新 transmitSeqNum 和 nextExpectedSeqNum,并重發上一次自己發送的數據包(判定收到了 NACK)
簡單總結:
Master只更新SN
Slave只更新NESN
當Slave收到一包,NESN == SN時,認為是新包;
當Master收到一包, NESN和SN不同,認為是新包;
當Slave收到一包,NESN != SN時,認為是重發包;
當Master收到一包, NESN和SN相同時,Master重傳上一包;
4.退出鏈接
4.1無數據關閉
MD 字段置 1,表示發送方還有數據需要傳輸,否者表示沒有數據傳輸。
在一個 Connect Interval 內,若 Master 和 Slave 都將 MD 字段置 0,則當前 Connect Interval 為最后一個 Connect Interval,它們將關閉此 Connect;否者 Master 和 Slave 在下一個 Connect Interval 繼續數據傳輸。
4.2 Termination Procedure 關閉
Master(或 Slave)發送 LL_TERMINATE_IND PDU 到 Slave(或 Master),同時啟動定 時器(Tterminate);
Slave(或 Master)收到后回復 ACK,同時關閉 connect;
收到 ACK 的 Master (或 Slave)則判定 connect 關閉。
若 Master(或 Slave)沒有收到 ACK,其在 Tterminate 超時后仍然判定 connect 關閉,不在 發送數據包。
若 Slave(或 Master)一直沒有收到 LL_TERMINATE_IND PDU,則可由于SUPERVISION TIMER 超時而關閉 connect。
4.3 SUPERVISION TIMER 超時關閉
具體介紹在第1章第5小節。
4.4 異常關閉
主要是信令流程中 Master 和 Slave 的信令交互出現了異常,它們都默認退出 connect。 除此之外,本章中提到的計算 windowWidening 超出范圍也會導致退出 connect。
總結
以上是生活随笔為你收集整理的6.BLE---数据传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux网络体系架构
- 下一篇: (转)swc使用