前言:
基於傳統點對點的架構,想要把家庭電腦和鍵盤、鼠標、耳機、麥克風、以及移動電話等等連接起來,可能還要考慮增加USB插口。
有沒有一種通用的不需要用戶干預的簡便方法把各種電子設備連接在一起,而又不至於被線纜淹沒呢?在WiFi之外,大家已經比較熟悉的“藍牙”正是這樣一種連接技術,它被設計為面向個人和家庭的無線式自動連接,其三大核心特點便是無線、低成本和自動化。
圖1 藍牙的無線連接模式
可是“藍牙”是怎么實現的上述所說的“連接”的呢?
下面我們從無線通信開始講解,然后講解藍牙通信協議棧,最后講解藍牙低功耗中的廣播通信。相信讀完下面的介紹,便能理解藍牙設備間是怎么實現通信的。
一、無線通信
1.1 無線通信原理
在發射端,發射機將已調制的高頻震盪電流通過 “饋電設備” 輸入發射天線,發射天線將高頻電流轉變為 無線電波—自由電磁波 向周圍空間輻射。
在接收端通過接收天線將無線電波轉化成高頻電流,再經過饋電設備傳輸到接收機。
圖2 無線信號生成及傳輸過程
自由電磁波:是由同向且相互垂直的電場與磁場在空間中衍生發射的震盪粒子波,是以波動的形式傳播的電磁場(電磁場是有內在聯系、相互依存的電場和磁場的統一體的總稱。隨時間變化的電場產生磁場,隨時間變化的磁場產生電場,兩者互為因果,形成電磁場。電磁場可由變速運動的帶電粒子引起,也可由強弱變化的電流引起,不論原因如何,電磁場總是以光 速向四周傳播,形成電磁波)
饋電設備:被控制裝置向控制點送電。
饋電設備可根據高頻震盪電流的頻率和形式 的不同,直接傳輸電流波或者電磁波。
電信號在接收端又是怎么轉化成數字信號,供上層處理的呢?
這就是模數轉換(AD),模擬信號是 有強弱變化的 電流, 智能終端里存儲不了這種信號。所以要把這種電流的強弱變化通過另一種方式表達。於是就有了AD。它把電流強弱的變化翻譯成了二進制代碼存儲在智能終端,也就是數字信號。
同樣的,可以通過數模轉換(DA)把數字信號轉化成模擬電信號,再由天線把電流轉化成無線電磁波進行發送。
1.2 電磁波譜
圖3 電磁波譜
無線頻譜僅僅是所有電磁波譜的一個子集,例如,我們將頻率為428570Ghz的電磁波識別為紅色,本文中重點介紹的藍牙頻段范圍是2.400-2.4835 GHz。
下表是 無線電 頻率頻段划分:
圖4 無線電頻率頻段划分
人耳能夠聽見的音頻信號的頻率范圍大約是20Hz-2OkHz。
1.3 無線通信協議
無線通信協議是為了完成了通信實體之間的通信而做的一些規則和約定的集合。因為沒有實體,不是很好理解,可以類比下交通運輸,路需要多寬,限速多少,道路標示怎么畫,路兩側怎么防護,紅綠燈的規則等等,都可以認為是"交通協議",通信協議與其類似。
二、藍牙通信協議
通俗的講,藍牙協議棧上層封裝下層傳輸過來的數據並提供接口供上層調用,上層只需使用下層提供的接口,不需要關心下層的具體實現細節。兩個藍牙設備之間每層使用相同的協議進行封裝/解封裝,最終在藍牙app層只關心的是傳輸數據中的有效信息,並不關心如CRC校驗信息等。
藍牙無線通信遵循IEEE的802.15標准,IEEE 802.15具有短距離、低功耗、低成本、小型網絡及適用於個人操作空間的特點。由於藍牙屬於無線通信,則其通信介質是一定頻率范圍下的頻帶資源(Frequency Band),藍牙的市場定位是個體和民用,因此使用免費的ISM頻段(頻率范圍是2.400-2.4835 GHz)。(ISM:Industrial Scientific Medical,是由ITU,國際通信聯盟無線電通信局定義的)
下面重點講解藍牙通信協議棧。協議棧如下圖:
圖5 藍牙協議棧
藍牙協議分為四個層次:物理層(Physical Layer)、邏輯層(Logical Layer)、L2CAP Layer和應用層(APP Layer)。
物理層,負責提供數據傳輸的物理通道(通常稱為信道)。通常情況下,一個通信系統中存在幾種不同類型的信道,如控制信道、數據信道、語音信道等等。
邏輯層,在物理層的基礎上,提供兩個或多個設備之間, 和物理無關的邏輯傳輸通道(也稱作邏輯鏈路)。
L2CAP層,L2CAP是邏輯鏈路控制和適配協議(Logical Link Control and Adaptation Protocol)的縮寫,負責管理邏輯層提供的邏輯鏈路。基於該協議,不同Application可共享同一個邏輯鏈路。類似TCP/IP中端口(port)的概念。
APP層,理解藍牙協議中的應用層,基於L2CAP提供的channel,實現各種各樣的應用功能。Profile是藍牙協議的特有概念,為了實現不同平台下的不同設備的互聯互通,藍牙協議不止規定了核心規范(稱作Bluetooth core),也為各種不同的應用場景,定義了各種Application規范,這些應用層規范稱作藍牙profile。
在以上四個層次的基礎上,藍牙協議又將物理層和邏輯層划分了子層,分別是Physical Channel/Physical Links和Logical Transports/Logical Links,這一划分,相當使人崩潰,要多花費大量的腦細胞去理解它們,具體請參考下面的分析。
2.1 物理層
物理層負責提供數據傳輸的物理信道,又分為Physical Channel和Physical Links。
Physical Layer還需要定義RF(指物理信道)收發雙方的一些特性,包括:
RF發射相關的特性(Transmitter Characteristics),包括發射功率(Transmission power、調制方式(Modulation),高斯頻移鍵控(Gaussian Frequency Shift Keying ,GFSK)、Spurious Emissions、Radio Frequency Tolerance等等。
RF接收相關的特性(Receiver Characteristics),包括接收靈敏度等。
2.1.2 Physical Channel(物理信道)
分傳統的藍牙技術(BR)和 低功耗藍牙技術(BLE)分別介紹Physical Channel
傳統藍牙技術BR這樣定義信道:
1)ISM頻帶被分成79份,每一份帶寬1MHz,稱作RF Channel。在0 channel和78 channel之外設立guard band(保護帶寬,Lower Guard Band為2MHz,Upper Guard Band為3.5MHz)。
2)采用跳頻技術(hopping),也就是說,某一個物理信道,並不是固定的占用79個channel中的某一個,而是以一定的規律在跳動(該規律在技術上叫做"偽隨機碼",就是"假"的隨機碼)。因此藍牙的物理信道,也可以稱作跳頻信道(hopping channel)。
3)BR技術定義了5種物理信道(跳頻信道),BR Basic Piconet Physical Channel、BR Adapted Piconet Physical Channel、BR Page Scan Physical Channel、BR Inquiry Scan Physical Channel和BR Synchronization Scan Channel。
4)BR Page Scan Physical Channel用於藍牙設備的發現操作(discovery),即我們常用的搜索其它藍牙設備(discover)以及被其它藍牙設備搜索(discoverable)。
5)BR Inquiry Scan Physical Channel用於藍牙設備的連接操作(connect),即我們常用的連接其它藍牙設備(connect)以及被其它藍牙設備連接(connectable)。
6)BR Basic Piconet Physical Channel和BR Adapted Piconet Physical Channel主要用在處於連接狀態的藍牙設備之間的通信。它們的區別是,BR Adapted Piconet Physical Channel使用較少的RF跳頻點。BR Basic Piconet Physical Channel使用全部79個跳頻點,而BR Adapted Piconet Physical Channel是根據當前的信道情況使用79個跳頻點中的子集,但是跳頻數目也不能少於20個。這個主要是因為藍牙使用ISM頻段,當藍牙和WIFI共存的時候,部分跳頻點被WIFI設備占用而使得藍牙設備在這些跳頻點上的通信總是失敗,因此,需要避過那些WIFI設備占用的頻點。
7)BR Synchronization Scan Channel可用於無連接的廣播通信,后續文章會詳細介紹。
8)同一時刻,BT 設備只能在其中一個物理信道上通信,為了支持多個並行的操作,藍牙系統采用時分方式,即不同的時間點采用不同的信道。
BLE低功耗藍牙技術這樣定義信道:
1)ISM內整個頻帶分為40份,每份的帶寬為2MHz。在0 channel和39 channel之外設立guard band(保護帶寬,Lower Guard Band為2MHz,Upper Guard Band為3.5MHz)。
2)LE技術定義了2種物理信道,LE Piconet channel和LE Advertisement Broadcast Channel。
3)LE Piconet Channel用在處於連接狀態的藍牙設備之間的通信,和BR一樣,采用調頻技術。和BR不一樣的地方是,只會在40個頻率channel中的37個上面跳頻。
4)LE Advertisement Broadcast Channel用於在設備間進行無連接的廣播通信,這些廣播通信可用於藍牙的設備的發現、連接(和BR/EDR類似)操作,也可用於無連接的數據傳輸。
5)和BR一樣,同一時刻,BT 設備只能在其中一個物理信道上通信,為了支持多個並行的操作,藍牙系統采用時分方式,即不同的時間點采用不同的信道。
AMP是為高速數據傳輸設計的技術,也是傳統藍牙技術的一種,其物理層規范直接采用802.11(WIFI)的PHY規范,主要有如下特點:AMP物理信道只有一種,即AMP Physical Channel,主要用於已連接設備之間的數據通信,和BR技術中的BR Adapted Piconet Physical Channel位於一個級別,可以互相切換使用。
2.1.2 Physical Links
物理鏈路層,是對Physical Channel物理信道(主要是BR技術中的Basic Piconet Physical Channel和Adapted Piconet Physical Channel)的進一步封裝。
2.2 邏輯層
邏輯層的主要功能,是在已連接(LE Advertisement Broadcast可以看做一類特殊的連接)的藍牙設備之間,基於物理鏈路,建立邏輯信道。所謂的邏輯信道,和城市道路上的車道類似:
一條城市道路可以看做一個物理鏈路(我們只考慮一個方向即可),該物理鏈路根據行車用途,可以划分為多個邏輯信道,如直行車道、右轉車道、左轉車道、掉頭車道、快速車道、慢速車道等等。
和車道類似,藍牙邏輯信道的划分依據是傳輸類型,主要包括下面3類(即Logical Link):
1)用於管理底層物理鏈路的控制類傳輸。
2)傳輸用戶數據的用戶類傳輸,包括。
3)其它比較特殊的傳輸類型。
由於Physical Channel是不可靠的,任何數據傳輸都可能由於干擾等問題而損毀、丟失,這對有些應用來說,是接受不了的。因此Link Layer提供了校驗、重傳等機制,確保數據傳輸的可靠性;Link Layer還提供數據過濾機制,主要針對廣播通道,因為隨着通信設備的增多,空中的廣播數據將會呈幾何級的增長,為了避免資源的浪費(特別是BLE Host),有必要在Link Layer過濾掉一些數據包,例如根據藍牙地址,過濾掉不是給自己的packet。
2.3 L2CAP Channels
L2CAP是Logical Link Control and Adaptation Protocol(邏輯鏈路控制和適配協議)的縮寫,它介於應用程序和Link Layer層之間的協議:
對下,它在用戶類Logical Link的基礎上,抽象出和具體技術無關的數據傳輸通道(包括單播和廣播兩類),至此用戶就不再需要關心繁雜的藍牙技術細節。
對上,它以L2CAP channel endpoints的概念(類似TCP/IP中的端口),為具體的應用程序(profile)提供獨立的數據傳輸通道(指的是邏輯通道)。
它提供的功能主要包括:通道的多路復用,對上層應用數據的分割和重組,生成協議數據單元(PDUs),以滿足用戶數據傳輸對延時的要求,並便於后續的重傳、流控等機制的實現。
2.4 Profiles
profile是藍牙Application的代指,也可以翻譯為服務,為了實現不同平台下的不同設備的互聯互通,藍牙協議為各種可能的、有通用意義的應用場景,都制定的了規范,如SPP、HSP、HFP、FTP、IPv6/6LoWPAN等等。
Profiles基於L2CAP提供的L2CAP channel endpoints實現,在它們對應的層次上進行數據通信,以完成所需功能。
三、低功耗藍牙BLE廣播通信原理
傳統藍牙BR雖然在協議底層有提及多播和廣播的概念,但在上層的應用場景中,更側重於點對點的通信,幾乎不存在廣播相應的應用。而低功耗藍牙BLE相比傳統藍牙,最大的突破就是加大了對廣播通信(Advertising)的支持和利用。
3.1 BLE廣播通信使用場景
1)單一方向的、無連接的數據通信,數據發送方在廣播信道上廣播,接收方掃描、接收數據。
2)連接的建立。
3.2 協議層次
BLE廣播通信相關的協議層次:
GAP --> HCI --> Link Layer
LinkLayer(LL) 位於最底層,負責廣播通信有關功能的定義和實現,包括物理通道的選擇、相關的鏈路狀態的定義、PDU的定義、設備過濾(Device Filtering)機制的實現等。
HCI負責將LL提供的所有功能,以Command/Event的形式抽象出來,供上層使用。
GAP負責從應用程序的角度,抽象並封裝LL提供的功能,以便讓應用以比較傻瓜的方式進行廣播通信。
3.3 Link Layer
3.3.1 狀態定義
從LL層看,參與廣播通信的BLE設備,可有三種狀態:
Advertising,數據發送方,周期性的發送廣播數據;
Scanning,數據接收方,掃描、接收廣播數據;
Initiating,連接發起方,掃描帶有“可連接”標志的廣播數據,一旦發現,則發起連接請求(都是由Link Layer自動完成,不需要上層軟件參與)。
3.3.2 PDU
處於不同狀態的BLE設備可以發送不同類型的PDU數據。
PDU格式:(具體每個字段的意義如圖所標)
圖6 pdu格式
PDU類型:
圖7 PDU類型
舉例:
1)如果只需要定時傳輸一些簡單的數據(如某一個溫度節點的溫度信息),后續不需要建立連接,則可以使用ADV_NONCONN_IND。廣播者只需要周期性的廣播該類型的PDU即可,接收者按照自己的策略掃描、接收,二者不需要任何額外的數據交互。
2)如果除了廣播數據之外,還有一些額外的數據需要傳輸,由於種種原因,如廣播數據的長度限制、私密要求等,可以使用ADV_SCAN_IND。廣播者在周期性廣播的同時,會監聽SCAN_REQ請求。接收者在接收到廣播數據之后,可以通過SCAN_REQ PDU,請求更多的數據。
3)如果后續需要建立點對點的連接,則可使用ADV_IND。廣播者在周期性廣播的同時,會監聽CONNECT_REQ請求。接收者在接收到廣播數據之后,可以通過CONNECT_REQ PDU,請求建立連接。
4)通過ADV_IND/CONNECT_REQ的組合建立連接,花費的時間比較長。如果雙方不關心廣播數據,而只是想快速建立連接,恰好如果連接發起者又知道對方(廣播者)的藍牙地址(如通過掃碼的方式獲取),則可以通過ADV_DIRECT_IND/CONNECT_REQ的方式。
3.3.3 Advertising狀態
BLE使用40個RF Channel(前文有述)中的3個作為廣播信道,信道頻段信息等如下:
圖8 廣播信道
BLE設備處於Advertising狀態的目的,就是要廣播數據。並且,根據應用場景的不同,可在3個channel上廣播4種類型的數據。
BLE協議對廣播通信的期望,是非常明確的,不在乎速率、只在乎功耗。對於連接來說,如果事先不知道連接發起者的設備地址,則最快的連接速度可能是20ms。如果事先知道地址,則可能在3.75ms內建立連接。由此可以看出,BLE的連接建立時間,比傳統藍牙少了很多,這也是BLE設備之間不需要保持連接的原因。
3.3.4 Scanning狀態
scanWindow指示一次掃描的時間,scanInterval指示兩次掃描之間的間隔。如果這兩個參數的值相同,表示連續不停地掃描。Scanning的掃描就是由 scanWindow和scanInterval兩個參數決定的。
BLE協議規定,scanWindow和scanInterval最大不能超過10.24s,並且scanWindow不能大於scanInterval。
Passive Scanning和Active Scanning
Passive Scanning稱作消極的掃描,是因為這種掃描模式下,BLE設備只聽不問,也就是說,只接收ADV_DIRECT_IND、ADV_IND、ADV_SCAN_IND、ADV_NONCONN_IND等類型的PDU,並不發送SCAN_REQ。而Active Scanning,不只認真聽講,還勤於發問(SCAN_REQ),並接收后續的 SCAN_RSP。
這兩種Scanning的最終結果,就是把接收到的數據(包括Advertiser地址、Advertiser數據等),反饋給上層。
3.3.5 Initiating狀態
Initiating狀態和Scanning狀態類似,只不過它的關注點不一樣:它不關心廣播數據,只關心ADV_DIRECT_IND和ADV_IND兩類消息,並在符合條件的時候,發出CONNECT_REQ,請求建立連接。
3.3.6 設備過濾機制
如果多個BLE設備同時發廣播,Scanner怎么過濾自己不想要的廣播,這時候設備過濾機制的白名單就上場了。LL層的白名單針對PDU三種類型(Advertising, Scanning, Initiating)分別有一個白名單,這個白名單可以設置。
3.4 HCI
HCI層將Link Layer層提供的功能封裝成Command和Event。
3.4.1 HCI Command/Event模式
HCI Command格式:(參考“BLUETOOTH SPECIFICATION Version 4.2 [Vol 2, Part E]”)
其中OCF和OGF組成16bit的操作碼,Parameter Total Length,指示該Command所有參數長度,Parameter1、Parameter2、等等,16 bits的參數,由具體的Command決定。
HCI Event格式:
3.4.2 廣播通信相關的HCI Command
BLE相關的HCI Comman使用的HCI Command的OGF都是0x08。
Advertising狀態有關的命令
1)HCI_LE_Set_Advertising_Parameters
設置廣播參數,包括Advertising Interval、Advertising Type、本機的地址類型、對端設備的地址類型和地址、所使用的物理Channel的map、Advertising白名單等。
2)HCI_LE_Set_Advertising_Data
設置廣播數據,OCF為0x0008,Command參數的格式如下:
例如,
下划線依次代表OGF、OCF、Advertising Data Length、Advertising Data。
3)HCI_LE_Set_Scan_Response_Data
設置Scan請求時的應答數據,OCF為0x0009,格式和HCI_LE_Set_Advertising_Data一樣。
4)HCI_LE_Set_Advertise_Enable
控制Advertising的使能與否,ICF為0x000a,命令參數包括一個8 bits的“Advertising Enable”,如下:
hcitool -i hci0 cmd 0x08 0x000A 01
Scanning狀態有關的命令
1)HCI_LE_Set_Scan_Parameters
設置scan參數,包括Scan Type、Scan Interval、Scan Window、本機的地址類型、Scanning白名單等。
2)HCI_LE_Set_Scan_Enable
Scan動作的開關,其數據格式和HCI_LE_Set_Advertise_Enable一致。
Initiating狀態有關的命令
1)HCI_LE_Create_Connection
建立連接,可指定Sca Interval、Scan Window、Initiator Filter Policy、Peer Address Type、Peer Address、Own Address Type等Initiating有關的參數,也可以指定連接相關的參數。
2)HCI_LE_Create_Connection_Cancel
取消連接。
白名單有關的命令
包括:
HCI_LE_Read_White_List_Size,獲取BLE Controller的白名單大小;
HCI_LE_Clear_White_List,清空白名單;
HCI_LE_Add_Device_To_White_List,將設備添加到白名單;
HCI_LE_Remove_Device_From_White_List,將設備從白名單移除;
3.5 GAP
3.5.1 GAP定義
對於廣播通信,GAP主要的工作是Link Layer的“協議語言”,如Advertising、Scanning、Initiating等,轉換為更為直觀的“人類語言”以及定義掃描數據和廣播數據的統一規范。
GAP層把Link Layer層的狀態進行了又一次抽象,分別如下:
1)廣播模式以及解析過程。GAP為該模式下的設備定義了兩個角色(GAP role):Broadcaster(具有“Broadcast mode”能力)和Observer(具有“observation procedure”能力。
2)發現模式以及對應的發現過程。GAP為該模式下的設備定義了兩個角色:Peripheral(被發現的設備)和Central(主動發現別人的設備)。不同的設備可以選擇具有以下能力:
Non-Discoverable mode,不可被發現,設備不會廣播任何數據;Limited Discoverable mode,可被發現(有限的),指設備只會在有限的一段時間內,廣播數據;General Discoverable mode,可被發現(通用的);Limited Discovery procedure ,可執行有限的發現操作,可發現處於“Limited Discoverable mode”的設備;General Discovery procedure ,可執行通用的發現操作,可發現處於“Limited Discoverable mode”和“General Discoverable mode”的設備;Name Discovery procedure,可進行Name的發現操作。如果通過Scanning操作沒有得到廣播設備的名稱,使用該過程,可以在建立連接之后,再獲取對方的名字。
3)連接模式以及對應的連接過程。所有四種角色的設備,Peripheral、Central、Broadcaster和Observer都可能涉及連接模式。
設備可以選擇連接有關的模式:
Non-connectable mode,不可被連接的模式;Directed connectable mode,可被指定的設備連接;Undirected connectable mode,可被連接(不指定設備);Auto connection establishment procedure,可自動連接模式;General connection establishment procedure,通用的連接過程等。
3.5.2 廣播數據格式
BLE協議31個bytes的廣播數據和掃描應答數據的格式如下:
圖9 廣播數據和掃描應答數據的格式
廣播數據/掃描應答數據一個個的AD Structure組成,未滿31bytes的數據由0填充;每個ADStructure有1byte的長度信息(Data的長度),和剩余的Data組成。
Data由AD Type和AD Data組成。其中AD Type可以指定Service UUID,設備支持哪些profile;Local Name,設備的名稱; Flags,設備的GAP發現連接能力等。結合上面的例子,再分析下:
02 01 06,是一個AD Structure:Data的長度是02;Data是01 06;AD Type是01(Flags);AD Data是06,表明支持General Discoverable Mode可被發現、不支持BR。
03 03 aa fe,是一個AD Structure:Data的長度是03;Data是03 aa fe;AD Type是03(16 bits的Service UUID);AD Data是aa fe,是Eddystone profile的Service UUID。
17 16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00,是一個AD Structure:Data的長度是17(23bytes);Data是16 aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00;AD Type是16(Service Data);AD Data是aa fe 00 -10 00 01 02 03 04 05 06 07 08 09 0a 0b 0e 0f 00 00 00 00,是Eddystone profile具體的Service Data。
總結
讀罷全文,如果還有“似懂非懂、欲說還休”的感覺,太正常了,畢竟藍牙協議是一個歷史悠久又比較龐大的協議,本文當一個學習筆記吧,以后遇到相關的問題,來這篇文章查查應該就可以了。
參考文檔:
https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile
CSS(Core Specification Supplement)
https://github.com/google/eddystone/blob/master/protocol-specification.md
IPSP SPEC, 1.0, https://www.bluetooth.org/docman/handlers/DownloadDoc.ashx?doc_id=296307
LE_PSM_IPSP, https://www.bluetooth.com/specifications/assigned-numbers/logical-link-control
http://embedded-computing.com/articles/bluetooth-smart-and-zigbee-if-you-cant-beat-them-join-them/
https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx