寫在前面:本文參考了 BLE4.0 低功耗藍牙 協議 總結 ,對其進行了縮減,整理出了個人能理解的感覺比較基本的內容,有問題請隨時跟我溝通 個人QQ:993650814.
1、射頻信道:
頻率分佈圖:
即最小頻率是2402MHz,最大頻率是2480MHz.一共有40個信道,信道的寬度是2MHz,其中37個信道爲自適應調頻數據通道,用來兩個鏈接的設備進行數據通信,3個固定通道37、38、39信道爲廣播信道用來廣播數據。
三個廣播信道分佈在SIM頻段的不同區域,如果他們集中在某個頻段的話,有可能這個頻段深度衰落導致廣播無法進行,所以廣播信道之間至少差24MHz,數據信道在廣播信道之間排布,間隔2Mhz。數據信道編號0~36,廣播信道編號37~39.
自適應調頻:在傳輸數據過程中,並不能保證每個信道都是好的信道,自適應調頻能夠將已知的壞信道映射到已知的好信道上來,防止傳輸干擾。
2、發射功率
2.4GHz頻道對無需授權的的設備有發射功率的限制,BLE 4.0限制如下:
最低發射功率爲-20dBm即10uW,最大發射功率10dBm,10000uW。
3、bit數據流格式
協議中PDU都是以Little Endian Format(小端模式)存放的,即內存中的高地址對應高字節,低地址對應低字節,數據傳輸時最低字節的最低bit最先發送的空中,例如 發送0xD即(0b)1101,則先發送1,接着0,然後1,最後1.
然而,數據包中的CRC和MIC( Message Integrity Check 信息完整性檢查)不是以小端模式存放,並以小端模式發送數據的,而是最先發送的高字節,例如CRC =0x123456,則發送順序爲0x12、0x34、0x56
4、LL鏈路層數據包結構分析
4.1前導碼Preamble:
前導碼爲1Byte,要麼01010101b,要麼10101010b,如果可接入地址Access Address最低位爲1時,前導碼爲01010101b,如果Access Address最低位爲0時,前導碼爲10101010b,目的是爲了保證報文的前9bit都是0和1的交替位(理解這句話一定要站在小端模式場景下)。
4.2接入地址 Accress Address:
接入地址4Bytes,分爲廣播接入地址和數據接入地址。
廣播接入地址:固定爲 0x8e89bed6,發送到空中的格式:
數據接入地址:數據通道接入地址是一個隨機數,由主機產生,但滿足如下條件:
(1)、不是廣播通道接入地址;
(2)、不能超過連續的6個0或者1;
(3)、4個Bytes必須互不相等;
(4)、不能超過24bit的翻轉,即不能010101010101010101010101;
(5)、地址的最高 6bits 至少有兩次的翻轉
4.3 廣播通道下的PDU
報文類型(最低4bit):共有7種廣播報文類型,如下:
ADV_IND——通用廣播
ADV_DIRECT_IND——定向連接廣播
ADV_NONCONN_IND——不可連接廣播
ADV_SCAN_IND——可掃描廣播
SCAN_REQ——主動掃描請求
SCAN_RSP——主動掃描應答
CONNECT_REQ——連接請求
發送地址(TXADDR)和接收地址(RXADDR),用來說明設備的地址類型,爲1時表示Random Addr(隨機地址),爲0時表示Public Addr(公共地址)。
淨荷長度6bit:用來表示淨荷數據的長度,LL PDU的最大長度爲37Bytes。
RFU:保留將來用的意思,Reserve for future
廣播通道下PDU的數據淨荷(PayLoad)的格式
4.4 數據通道下的PDU
注意:這裏的數據淨荷爲什麼是216bits也就是27Bytes了,即使加上4Bytes的MIC也只有31Bytes另外6Bytes去哪了?實際上BLE4.0協議規範就是這麼規定的,這6Bytes在廣播通道下作爲藍牙地址,在數據通道中只有27Bytes。在我的另一篇博客中也有講到這裏 ,可參考如下鏈接
Nordic Ble 4.0爲什麼上層應用每次最多能透傳20Bytes的有效數據
5、非連接狀態:就緒態、廣播態、掃描狀態、發起狀態
就緒態是默認的狀態,直接略過。
5.1 廣播態:
5.1.1廣播通道選擇:在廣播態下,LL層通過廣播信道發送PDU,廣播事件分爲 四中:
非定向可連接事件(ADV_IND)
定向可連接事件(ADV_DIRECT_IND)
非定向不可連接事件(ADV_NONCONN_IND)
非定向掃描事件(ADV_DISCOVER_IND/ADV_SCAN_IND)
廣播事件來了之後,PDU依次從37.38.39三個信道傳輸數據
5.1.2 廣播間隔: 所有的非定向廣播事件,兩個連續廣播事件之間的時間就是廣播間隔。
advInterval:0.625ms的倍數,在20ms~10.24s之間。advDelay 是個隨機數在0~10ms之間,由於設備之間的時鐘會有不同程度的漂移,advDelay不但能消除設備之間時間的漂移,還能避免同一信道及時間節點上的衝突。
5.1.3 非定向可連接廣播事件(ADV_IND)
鏈路層通過廣播信道發送(ADV_IND PDU)通用廣播報文,這個報文發出之後可以接受由掃描者發送的(SCAN_REQ PDU)掃描請求或者由發起者發送的(CONNECT_REQ PDU)連接請求。廣播者接受之後,需要在同一信道上進行掃描着或者廣播者的應答。 如果接受到的SCAN_REQ PDU通過了濾波,那麼廣播者需要在接受通道上發送SCAN_RSP PDU掃描應答報文。 如果 接收到CONN_REQ,那麼久進入連接態了。
5.1.4 定向可連接廣播事件(ADV_DIRECT_IND)
這個廣播的目的是爲了快速連接,這種報文包含了兩個地址:廣播者地址和發起者地址。發起者收到發送給自己的廣播報文之後,可以快速發起連接請求事件,從而進入連接態。
5.1.5 非定向不可連接事件(ADV_NOCONN_IND)
只有自己廣播,不允許連接。
5.2 掃描態
掃描窗口:是鏈路層監聽廣播數據通道的持續的時間。
掃描間隔:是連續兩個掃描窗口開始的時間之差。
5.3 發起態
發起態進入連接之後成爲主機設備。
5.4 連接態
進入連接態後,兩個設備就擔任了不同的角色。 發送CONNECT REQ的設備成爲主機,接受CONNEXT REQ的設備成爲從機。
5.4.1 連接事件
跟廣播事件一樣,每隔一段時間的連接事件都會由主機通過數據信道發送給從機一個數據包,這時候如果從機有數據要回應給主機,就會在150±2us內給主機一個應答。也就是說每個連接事件,都會至少包含主機發送給從機的一個數據包,從機可以不發送給主機。
連接事件的時間由兩個參數決定:connect event interval (connInterval 連接間隔)和slave latency(connSlaveLatency 從機潛伏 週期)。解釋一下從機潛伏週期:這是一個次數而不是時間,例如connSlaveLatency=5,則連續5個連接事件,從機可以不發數據給主機,主機也不會認爲此時斷連。
錨點(anchor point):連接事件開始的時間叫做錨點,主機在錨點開始連接事件,從機在錨點開始進入偵聽狀態。
5.4.2 監管超時
在連接狀態下,長時間的沒有連接事件或者長時間主機給從機發送數據,從機沒有迴應,這時候可以認爲連接已經出了問題,這個時間就叫做連接監管超時(connect supervision timeout connSupervisionTimeout)。這個事件一定要大於(connInterval)*(1+connSlaveLatency),並且得是10ms的倍數,並且在100ms~30s之間。