在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深入淺出解析低功耗藍牙協議棧

jf_14701710 ? 來源:jf_14701710 ? 作者:jf_14701710 ? 2025-04-09 14:49 ? 次閱讀

Bluetooth LE協議棧為什么要分層?怎么理解Bluetooth LE“連接”?如果Bluetooth LE協議只有ATT層沒有GATT層會發生什么?

一、協議棧框架

一般而言,我們把某個協議的實現代碼稱為協議棧(protocol stack),Bluetooth LE協議棧就是實現低功耗藍牙協議的代碼,理解和掌握Bluetooth LE協議是實現Bluetooth LE協議棧的前提。在深入Bluetooth LE協議棧各個組成部分之前,我們先看一下Bluetooth LE協議棧整體架構。

wKgZPGf2GIyAPI_pAADGpv58Kys92.jpeg

如上圖所述,要實現一個Bluetooth LE應用,首先需要一個支持Bluetooth LE射頻的芯片,然后還需要提供一個與此芯片配套的Bluetooth LE協議棧,最后在協議棧上開發自己的應用。可以看出Bluetooth LE協議棧是連接芯片和應用的橋梁,是實現整個Bluetooth LE應用的關鍵。那Bluetooth LE協議棧具體包含哪些功能呢?簡單來說,Bluetooth LE協議棧主要用來對你的應用數據進行層層封包,以生成一個滿足Bluetooth LE協議的空中數據包,也就是說,把應用數據包裹在一系列的幀頭(header)和幀尾(tail)中。具體來說,Bluetooth LE協議棧主要由如下幾部分組成:

PHY層(Physical layer物理層)。PHY層用來指定Bluetooth LE所用的無線頻段,調制解調方式和方法等。PHY層做得好不好,直接決定整個Bluetooth LE芯片的功耗,靈敏度以及selectivity等射頻指標。

LL層(Link Layer鏈路層)。LL層是整個Bluetooth LE協議棧的核心,也是Bluetooth LE協議棧的難點和重點。像Nordic的Bluetooth LE協議棧能同時支持20個link(連接),就是LL層的功勞。LL層要做的事情非常多,比如具體選擇哪個射頻通道進行通信,怎么識別空中數據包,具體在哪個時間點把數據包發送出去,怎么保證數據的完整性,ACK如何接收,如何進行重傳,以及如何對鏈路進行管理和控制等等。LL層只負責把數據發出去或者收回來,對數據進行怎樣的解析則交給上面的GAP或者GATT。

HCI(Host controller interface)。HCI是可選的(具體請參考文章: 三種藍牙架構實現方案(藍牙協議棧方案)),HCI主要用于2顆芯片實現Bluetooth LE協議棧的場合,用來規范兩者之間的通信協議和通信命令等。

GAP層(Generic access profile)。GAP是對LL層payload(有效數據包)如何進行解析的兩種方式中的一種,而且是最簡單的那一種。GAP簡單的對LL payload進行一些規范和定義,因此GAP能實現的功能極其有限。GAP目前主要用來進行廣播,掃描和發起連接等。

L2CAP層(Logic link control and adaptation protocol)。L2CAP對LL進行了一次簡單封裝,LL只關心傳輸的數據本身,L2CAP就要區分是加密通道還是普通通道,同時還要對連接間隔進行管理。

SMP(Secure manager protocol)。SMP用來管理Bluetooth LE連接的加密和安全的,如何保證連接的安全性,同時不影響用戶的體驗,這些都是SMP要考慮的工作。

ATT(Attribute protocol)。簡單來說,ATT層用來定義用戶命令及命令操作的數據,比如讀取某個數據或者寫某個數據。Bluetooth LE協議棧中,開發者接觸最多的就是ATT。Bluetooth LE引入了attribute概念,用來描述一條一條的數據。Attribute除了定義數據,同時定義該數據可以使用的ATT命令,因此這一層被稱為ATT層。

GATT(Generic attribute profile )。GATT用來規范attribute中的數據內容,并運用group(分組)的概念對attribute進行分類管理。沒有GATT,Bluetooth LE協議棧也能跑,但互聯互通就會出問題,也正是因為有了GATT和各種各樣的應用profile,Bluetooth LE擺脫了ZigBee等無線協議的兼容性困境,成了出貨量最大的2.4G無線通信產品。

我相信很多人看了上面的介紹,還是不懂Bluetooth LE協議棧的工作原理,以及每一層具體干什么的,為什么要這么分層。下面我以如何發送一個數據包為例來講解Bluetooth LE協議棧各層是如何緊密配合,以完成發送任務的。

二、如何通過無線發送一個數據包

假設有設備A和設備B,設備A要把自己目前的電量狀態83%(十六進制表示為0x53)發給設備B,該怎么做呢?作為一個開發者,他希望越簡單越好,對他而言,他希望調用一個簡單的API就能完成這件事,比如send(0x53),實際上我們的Bluetooth LE協議棧就是這樣設計的,開發者只需調用send(0x53)就可以把數據發送出去了,其余的事情Bluetooth LE協議棧幫你搞定。很多人會想,Bluetooth LE協議棧是不是直接在物理層就把0x53發出去,就如下圖所示:

wKgZO2f2GIyAIzxkAAARxQFP1Lc80.jpeg

這種方式初看起來挺美的,但由于很多細節沒有考慮到,實際是不可行的。首先,它沒有考慮用哪一個射頻信道來進行傳輸,在不更改API的情況下,我們只能對協議棧進行分層,為此引入LL層,開發者還是調用send(0x53),send(0x53)再調用send_LL(0x53,2402M)(注:2402M為信道頻率)。

這里還有一個問題,設備B怎么知道這個數據包是發給自己的還是其他人的,為此Bluetooth LE引入access address概念,用來指明接收者身份,其中,0x8E89BED6這個access address比較特殊,它表示要發給周邊所有設備,即廣播。如果你要一對一的進行通信(Bluetooth LE協議將其稱為連接),即設備A的數據包只能設備B接收,同樣設備B的數據包只能設備A接收,那么就必須生成一個獨特的隨機access address以標識設備A和設備B兩者之間的連接。

廣播方式

我們先來看一下簡單的廣播情況,這種情況下,我們把設備A叫advertiser(廣播者),設備B叫scanner或者observer(掃描者)。廣播狀態下設備A的LL層API將變成send_LL(0x53,2402M, 0x8E89BED6)。由于設備B可以同時接收到很多設備的廣播,因此數據包還必須包含設備A的device address(0xE1022AAB753B)以確認該廣播包來自設備A,為此send_LL參數需要變成(0x53,2402M, 0x8E89BED6, 0xE1022AAB753B)。LL層還要檢查數據的完整性,即數據在傳輸過程中有沒有發生竄改,為此引入CRC24對數據包進行檢驗 (假設為0xB2C78E) 。同時為了調制解調電路工作更高效,每一個數據包的最前面會加上1個字節的preamble(前導幀),preamble一般為0x55或者0xAA。這樣,整個空中包就變成(注:空中包用小端模式表示!):

wKgZPGf2GI2AO9KSAAAugD6FXvs93.jpeg

上面這個數據包還有如下問題:

沒有對數據包進行分類組織,設備B無法找到自己想要的數據0x53。為此我們需要在access address之后加入兩個字段:LL header和長度字節。LL header用來表示數據包的LL類型,長度字節用來指明payload的長度

設備B什么時候開啟射頻窗口以接收空中數據包?如上圖case1所示,當設備A的數據包在空中傳輸的時候,設備B把接收窗口關閉,此時通信將失敗;同樣對case2來說,當設備A沒有在空中發送數據包時,設備B把接收窗口打開,此時通信也將失敗。只有case3的情況,通信才能成功,即設備A的數據包在空中傳輸時,設備B正好打開射頻接收窗口,此時通信才能成功,換句話說,LL層還必須定義通信時序。

當設備B拿到數據0x53后,該如何解析這個數據呢?它到底表示濕度還是電量,還是別的意思?這個就是GAP層要做的工作,GAP層引入了LTV(Length-Type-Value)結構來定義數據,比如020105,02-長度,01-類型(強制字段,表示廣播flag,廣播包必須包含該字段),05-值。由于廣播包最大只能為31個字節,它能定義的數據類型極其有限,像這里說的電量,GAP就沒有定義,因此要通過廣播方式把電量數據發出去,只能使用供應商自定義數據類型0xFF,即04FF590053,其中04表示長度,FF表示數據類型(自定義數據),0x0059是供應商ID(自定義數據中的強制字段),0x53就是我們的數據(設備雙方約定0x53就是表示電量,而不是其他意思)。

最終空中傳輸的數據包將變成:

AAD6BE898E600E3B75AB2A02E102010504FF5900538EC7B2

AA – 前導幀(preamble)

D6BE898E – 訪問地址(access address)

60 – LL幀頭字段(LL header)

0E – 有效數據包長度(payload length)

3B75AB2A02E1 – 廣播者設備地址(advertiser address)

02010504FF590053 – 廣播數據

8EC7B2 – CRC24值

wKgZO2f2GI6ABgmfAAAfugdTqYg14.jpeg

有了PHY,LL和GAP,就可以發送廣播包了,但廣播包攜帶的信息極其有限,而且還有如下幾大限制:

無法進行一對一雙向通信 (廣播是一對多通信,而且是單方向的通信)

由于不支持組包和拆包,因此無法傳輸大數據

通信不可靠及效率低下。廣播信道不能太多,否則將導致掃描端效率低下。為此,Bluetooth LE只使用37(2402MHz) /38(2426MHz) /39(2480MHz)三個信道進行廣播和掃描,因此廣播不支持跳頻。由于廣播是一對多的,所以廣播也無法支持ACK。這些都使廣播通信變得不可靠。

掃描端功耗高。由于掃描端不知道設備端何時廣播,也不知道設備端選用哪個頻道進行廣播,掃描端只能拉長掃描窗口時間,并同時對37/38/39三個通道進行掃描,這樣功耗就會比較高。

而連接則可以很好解決上述問題,下面我們就來看看連接是如何將0x53發送出去的。

連接方式

到底什么叫連接(connection)?像有線UART,很容易理解,就是用線(Rx和Tx等)把設備A和設備B相連,即為連接。用“線”把兩個設備相連,實際是讓2個設備有共同的通信媒介,并讓兩者時鐘同步起來。

藍牙連接何嘗不是這個道理,所謂設備A和設備B建立藍牙連接,就是指設備A和設備B兩者一對一“同步”成功,其具體包含以下幾方面:

設備A和設備B對接下來要使用的物理信道達成一致

設備A和設備B雙方建立一個共同的時間錨點,也就是說,把雙方的時間原點變成同一個點

設備A和設備B兩者時鐘同步成功,即雙方都知道對方什么時候發送數據包什么時候接收數據包

連接成功后,設備A和設備B通信流程如下所示:

wKgZPGf2GI6AA3LwAAArnOKLgk433.jpeg

如上圖所示,一旦設備A和設備B連接成功(此種情況下,我們把設備A稱為Master或者Central,把設備B稱為Slave或者Peripheral),設備A將周期性以CI(connection interval)為間隔向設備B發送數據包,而設備B也周期性地以CI為間隔打開射頻接收窗口以接收設備A的數據包。同時按照藍牙spec要求,設備B收到設備A數據包150us后,設備B切換到發送狀態,把自己的數據發給設備A;設備A則切換到接收狀態,接收設備B發過來的數據。由此可見,連接狀態下,設備A和設備B的射頻發送和接收窗口都是周期性地有計劃地開和關,而且開的時間非常短,從而大大降低系統功耗并大大提高系統效率。

現在我們看看連接狀態下是如何把數據0x53發送出去的,從中大家可以體會到藍牙協議棧分層的妙處。

對開發者來說,很簡單,他只需要調用send(0x53)

GATT層定義數據的類型和分組,方便起見,我們用0x0013表示電量這種數據類型,這樣GATT層把數據打包成130053(小端模式!)

ATT層用來選擇具體的通信命令,比如讀/寫/notify/indicate等,這里選擇notify命令0x1B,這樣數據包變成了:1B130053

L2CAP用來指定connection interval(連接間隔),比如每10ms同步一次(CI不體現在數據包中),同時指定邏輯通道編號0004(表示ATT命令),最后把ATT數據長度0x0004加在包頭,這樣數據就變為:040004001B130053

LL層要做的工作很多,首先LL層需要指定用哪個物理信道進行傳輸(物理信道不體現在數據包中),然后再給此連接分配一個Access address(0x50655DAB)以標識此連接只為設備A和設備B直連服務,然后加上LL header和payload length字段,LL header標識此packet為數據packet,而不是control packet等,payload length為整個L2CAP字段的長度,最后加上CRC24字段,以保證整個packet的數據完整性,所以數據包最后變成:

AAAB5D65501E08040004001B130053D550F6

AA – 前導幀(preamble)

0x50655DAB – 訪問地址(access address)

1E – LL幀頭字段(LL header)

08 – 有效數據包長度(payload length)

04000400 – ATT數據長度,以及L2CAP通道編號

1B – notify command

0x0013 – 電量數據handle

0x53 – 真正要發送的電量數據

0xF650D5 – CRC24值

雖然開發者只調用了 send(0x53),但由于低功耗藍牙協議棧層層打包,最后空中實際傳輸的數據將變成下圖所示的模樣,這就既滿足了低功耗藍牙通信的需求,又讓用戶API變得簡單,可謂一箭雙雕!

wKgZO2f2GI-AaEHFAAAgJ0OOSvk62.jpeg

上面只是對Bluetooth LE協議棧實現原理做了一個簡單概述,即便如此,由于都是關于Bluetooth LE協議棧底層的東西,很多開發者還是會覺得比較枯燥和晦澀,而且對很多開發者來說,他們也不關心Bluetooth LE協議棧是如何實現的,他們更關心的是Bluetooth LE協議棧的使用,即怎么開發一個Bluetooth LE應用。Bluetooth LE應用是實打實的東西,不能像上面講述協議棧一樣泛泛而談,必須結合具體的藍牙芯片和藍牙協議棧來講解,為此后面將以Nordic芯片及協議棧作為范例,來具體講解如何開發Bluetooth LE應用,以及如何通過代碼去理解Bluetooth LE協議中定義的一些概念和術語。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 協議棧
    +關注

    關注

    2

    文章

    145

    瀏覽量

    34036
  • 低功耗藍牙
    +關注

    關注

    1

    文章

    244

    瀏覽量

    21887
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    深入淺出AVR(傻孩子)

    本帖最后由 eehome 于 2013-1-5 09:56 編輯 深入淺出AVR(傻孩子)
    發表于 06-29 15:43

    深入淺出AVR

    深入淺出AVR,一本書。
    發表于 07-15 12:02

    深入淺出玩轉FPGA

    深入淺出玩轉FPGA
    發表于 07-21 09:21

    深入淺出ARM7

    深入淺出ARM7
    發表于 08-18 10:12

    HDMI技術深入淺出

    HDMI技術深入淺出
    發表于 08-19 10:52

    深入淺出Android

    深入淺出Android
    發表于 08-20 10:14

    深入淺出Android

    深入淺出Android
    發表于 04-26 10:48

    深入淺出安防視頻監控系統

    深入淺出安防視頻監控系統深入淺出安防視頻監控系統
    發表于 05-22 19:28

    深入淺出AVR

    深入淺出AVR
    發表于 08-23 10:10

    深入淺出數據分析

    深入淺出數據分析,有需要的朋友下來看看。
    發表于 01-15 14:22 ?0次下載

    深入淺出談多層面板布線技巧

    深入淺出談多層面板布線技巧
    發表于 12-13 22:20 ?0次下載

    深入淺出Android—Android開發經典教材

    深入淺出Android—Android開發經典教材
    發表于 10-24 08:52 ?15次下載
    <b class='flag-5'>深入淺出</b>Android—Android開發經典教材

    深入淺出數字信號處理

    深入淺出數字信號處理
    發表于 12-07 20:14 ?623次閱讀

    深入淺出學習250個通信原理資源下載

    深入淺出學習250個通信原理資源下載
    發表于 04-12 09:16 ?29次下載

    深入淺出學習低功耗藍牙協議

    深入淺出學習低功耗藍牙協議
    發表于 06-23 10:35 ?59次下載
    主站蜘蛛池模板: 欧美黄色片在线播放 | 国产在线观看午夜不卡 | 一区二区三区电影 | 国产精品李雅在线观看 | 操久久 | 人人添 | 国产一级又色又爽又黄大片 | 手机看日韩毛片福利盒子 | 日本人zzzwww| 日本zzzwww大片免费 | 中文字幕11页 | 伊人久久大香线蕉综合7 | 免费成人黄色网址 | 女人张开腿 让男人桶视频 女人张开腿等男人桶免费视频 | 麻生希痴汉电车avop130 | 久久99精品国产麻豆宅宅 | 亚洲欧美强伦一区二区另类 | 黄色三级在线看 | 91麻豆麻豆 | 女人被男人免费播放网站 | 亚洲免费影视 | 男人的天堂视频在线 | 农村妇女野外一级毛片 | 国产成人夜间影院在线观看 | 色多多入口 | 2021最新久久久视精品爱 | 午夜剧j| 在线网站你懂得 | 亚洲久优优色优在线播放 | 你懂的视频在线观看资源 | 亚洲你xx我xx网站 | 大量喷潮free | 91av视频免费在线观看 | 在线观看www妖精免费福利视频 | 日韩在线一区二区 | 一级做a爱免费观看视频 | 在线最新版www资源网 | 欧美片欧美日韩国产综合片 | 四虎永久免费在线观看 | 四虎电影免费观看网站 | 天天躁日日躁狠狠躁一级毛片 |