五、GATT定義了若干在GATT服務器和客戶端之間的通信的子過程:
六,、藍牙4.0BLE協(xié)議棧分層思想的優(yōu)點
一,、藍牙4.0BLE介紹
藍牙4.0支持的角色有:
廣播者(BroadCaster)——廣告發(fā)送者,不是可連接的設備
觀察者(Observer)——掃描廣告,,不能夠啟動連接
外圍設備(Peripheral)——廣告發(fā)送者,,是可連接的設備,在單一鏈路層連接時作為一個從機
中央設備(Center)——掃描廣告啟動連接,,在單一或者多鏈路層連接時作為主機,,支持三個同時連接
廣播者跟觀察者配對使用不能建立連接。應用:溫度傳感器跟溫度顯示器,。
中央設備跟外圍設備可以進行連接,、配對、數(shù)據(jù)通信,。應用:手表跟手機,。
BLE連接的過程:
1、外圍設備發(fā)送具體的廣告數(shù)據(jù)讓任何中央設備知道他是一個可連接的設備,,廣告內容包含設備地址,,還可以包含一些額外的額數(shù)據(jù),比如設備名稱,、服務ID等,。
2、中央設備(Center)接收到廣告后發(fā)送一個搜索請求給外圍設備(Peripheral),,外圍設備(Peripheral)返回掃描響應給中央設備(Center),。這樣中央設備就知道這是一個可連接的設備。
3,、中央設備可以發(fā)送一個建立連接的請求給外圍設備,。進行配對連接,必要時進行綁定操作(連接可以被從機或者主機任一方終止),。
配對(Pairing):建立連接,,配對完成后可以進行數(shù)據(jù)通信。
綁定(Banding): 將配對信息記錄下來,,如設備地址,,這樣下次連接時就不需要再次配對的過程(快速連接)。
藍牙低功耗:
低耗能藍牙技只用 3 個 信道做廣播信道,,允許毫秒級快速建立連接,,效率遠高于傳統(tǒng)藍牙的 32 個信道方式,。
少的數(shù)據(jù)頻道和寬頻道間隔:傳統(tǒng)藍牙有 79 個數(shù)據(jù)信道,頻道間隔 是 1MHz,;低耗能藍牙有 40 個數(shù)據(jù)信道,,頻 道間隔是 2MHz。
傳統(tǒng)藍牙的工作峰值電流一般是 35mA,,睡眠狀態(tài)電流是 0.01mA,。
而低耗能藍牙的工作峰值電流是小于 15mA,睡眠狀態(tài)電流是 0.004mA
還可以軟件設置以下三個參數(shù)來降低功耗,。
連接間隔:當設備建立連接時,,即使沒有數(shù)據(jù)的收發(fā),兩設備仍然會通過交換鏈路層數(shù)據(jù)來維持連接,,連接間隔就是兩個連接事件之間的時間間隔,。設置范圍(7.5ms - 4s)。
從機延遲: 從機可以跳過若干連接事件繼續(xù)休眠節(jié)省功耗,。
管理超時:兩個成功連接事件之間最大的允許間隔,。如果超出這個時間就認為設備斷開連接。設置范圍(100ms--32s)
二,、藍牙4.0BLE協(xié)議與協(xié)議棧的關系
協(xié)議定義的是一系列的通信標準,通信雙方需要共同按照這一標準進行正常的數(shù)據(jù)收發(fā),。
協(xié)議棧是協(xié)議的具體實現(xiàn)形式,,通俗的理解為用代碼實現(xiàn)的函數(shù)庫,以便于開發(fā)人員調用,。
藍牙4.0BLE協(xié)議棧就是將各個層定義的協(xié)議都集合在一起,,以函數(shù)的形式實現(xiàn),并提供一些應用層API,,供用戶調用,。
注意:雖然協(xié)議是統(tǒng)一的,但是協(xié)議的具體實現(xiàn)形式是變化的,,即不同廠商提供的協(xié)議棧是有區(qū)別的,,例如:函數(shù)名稱和參數(shù)列表可能有區(qū)別,選擇協(xié)議棧以后,,需要學習具體的例子,,查看廠商提供的Demo演示程序、說明文檔(通常,,實現(xiàn)協(xié)議棧的廠商會提供一些API手冊供用戶查詢)來學習各個函數(shù)的使用方式,,進而快速地使用協(xié)議棧進行應用程序的開發(fā)工作。
三,、如何使用藍牙4.0BLE協(xié)議棧
既然藍牙4.0BLE協(xié)議棧已經(jīng)實現(xiàn)了藍牙4.0BLE協(xié)議,,那么用戶就可以使用協(xié)議棧提供的API進行應用程序的開發(fā),,在開發(fā)過程中不必過多的關注藍牙4.0BLE協(xié)議的具體實現(xiàn)細節(jié),只需要關注一個核心的問題:應用程序數(shù)據(jù)從哪里來到哪里去,。
至于調用協(xié)議棧中函數(shù)后,,如何初始化應用進行數(shù)據(jù)發(fā)送等工作,藍牙4.0BLE協(xié)議棧已經(jīng)完成了所需要的初始化,。
如果開發(fā)過程中確實需要或者是想要了解藍牙4.0BLE協(xié)議,,可以查看SIG提供的標準協(xié)議規(guī)范。
四,、深入理解藍牙4.0BLE協(xié)議棧
協(xié)議棧概述
我們以TI的CC254X系列BLE芯片為例來深入了解下藍牙4.0BLE協(xié)議棧,。TI的藍牙4.0BLE協(xié)議棧包含兩部分:主機和控制器。主機和控制器的分離要追溯到藍牙BR/EDR設備時期,,控制器和主機通常會分開實現(xiàn),。
協(xié)議棧的實現(xiàn)方式采用分層的思想,控制器部分包括:物理層,、鏈路層,、主機控制接口層;主機部分包括:邏輯鏈路控制及自適應協(xié)議層,、安全管理層,、屬性協(xié)議層、通用訪問配置文件層,、通用屬性配置文件層,;上層可以調用下層提供的函數(shù)來實現(xiàn)需要的功能。
協(xié)議?;A
藍牙4.0BLE協(xié)議棧的結構圖如下:
詳細介紹如下:
1.物理層(Physical Layer,,簡寫 PHY):
是1Mbps自適應跳頻的GFSK射頻,工作于免許可證的2.4GHz ISM(工業(yè),、科學與醫(yī)療)頻段,。
2.鏈路層(Link Layer,簡寫 LL):
用于控制設備的射頻狀態(tài),,設備將處于五種狀態(tài)之一:等待,、廣告、掃描,、初始化,、連接。廣播設備不需要建立連接就可以發(fā)送數(shù)據(jù),,而掃描設備接收廣播設備發(fā)送的數(shù)據(jù),;發(fā)起連接的設備通過發(fā)送連接請求來回應廣播設備,如果廣播設備接受連接請求,,那么廣播設備與發(fā)起連接的設備將會進入連接狀態(tài),。發(fā)起連接的設備稱為主機,,接受連接請求的設備稱為從機。
3.主機控制接口層(Host Controller Interface,,簡寫 HCI):
為主機和控制器之間提供標準通信接口,。這一層可以是軟件或者硬件接口,如UART,、SPI,、USB等。
4.邏輯鏈路控制及自適應協(xié)議層(Logical Link Control and AdaptaTIon Protocol,,簡寫 L2CAP):
為上層提供數(shù)據(jù)封裝服務,,允許邏輯上的點對點數(shù)據(jù)通信。
5.安全管理層(Security Manager,,簡寫 SM):
定義了配對和秘鑰分配方式,,并為協(xié)議棧其他層與另一個設備之間的安全連接和數(shù)據(jù)交換提供服務。
6.屬性協(xié)議層(Attribute protocol,,簡寫 ATT):
允許設備向另外一個設備展示一塊特定的數(shù)據(jù),,稱之為“屬性”。在ATT環(huán)境中,,展示“屬性”的設備稱為服務器,,與之配對的設備稱為客戶端。鏈路層狀態(tài)(主機和從機)與設備的ATT角色是相互獨立的,。例如:主機設備既可以是ATT服務器,,也可以是ATT客戶端;從機設備既可以是ATT服務器,,也可以是ATT客戶端。
7.通用屬性配置文件層(Generic Attribute profile,,簡寫 GATT):
定義了使用ATT的服務框架,。GATT規(guī)定配置文件(profile)的結構。在BLE中,,所有被profile或者服務用到的數(shù)據(jù)塊稱為“特性”,,兩個建立連接的設備之間的所有數(shù)據(jù)通信都是通過GATT子程序處理。GATT層用于已連接的藍牙設備之間的數(shù)據(jù)通信,,應用程序和profile直接使用GATT層,。
當兩個設備建立連接之后,它們就處于下面兩種角色之一:
GATT服務器:為GATT客戶端提供數(shù)據(jù)服務的設備,。
GATT客戶端:從GATT服務器讀寫應用數(shù)據(jù)的設備,。
注意:GATT角色中的客戶端和服務器的概念與鏈路層的主機和從機的概念完全獨立,與GAP層角色中的外設和集中器的概念也是完全獨立,。 主機既可以是GATT客戶端也可以是GATT服務器,;從機既可以是GATT客戶端也可以是GATT服務器,。
一個GATT服務器中可包含一個或多個GATT服務,GATT服務是完成特定功能的一系列數(shù)據(jù)的集合,。每一個應用工程大致包含下列三種服務:
(1)強制的GAP服務,。這一服務包含了設備和訪問信息。例如,,設備,、設備供應商和產品標示。它是協(xié)議棧的一部分,,是BLE規(guī)范對每一個BLE設備的強制要求,。這部分沒有提供源代碼,而是直接編譯到協(xié)議棧庫文件中了,。
(2)強制的GATT服務,。這一服務包含了GATT服務器的信息,是協(xié)議棧的一部分,,同樣也是BLE規(guī)范對每一個BLE設備的要求,。這部分同樣沒有提供源代碼而是直接編譯到協(xié)議棧庫文件中了。
(3)自定義服務,。這部分服務包含應用數(shù)據(jù)的信息,,與應用數(shù)據(jù)的傳遞密切相關,我們可以按照特定的格式編寫自己的GATT服務,。
“特性”(CharacterisTIc)是服務用到的值,,以及其內容和配置信息。GATT定義了在BLE連接中發(fā)現(xiàn),、讀取和寫入屬性的子過程,。GATT服務器上的特性值及其內容和配置信息(稱為描述符)存儲于屬性表中。屬性表是一個數(shù)據(jù)庫,,包含了成為屬性的小塊數(shù)據(jù),,除了值本身,每個屬性都包含下列屬性:
(1)句柄:屬性在表中的地址,,每個屬性有唯一的句柄,。
(2)類型:表示數(shù)據(jù)代表的事物,通常是藍牙技術聯(lián)盟規(guī)定或用戶自定義的UUID(Universally Unique Identifier),。
(3)權限:規(guī)定了GATT客戶端設備對屬性的訪問權限,,包括是否能訪問和怎樣訪問。
五,、GATT定義了若干在GATT服務器和客戶端之間的通信的子過程:
(1)讀特性值:客戶端設備請求讀取句柄處的特性值,,服務器將此值回應給客戶端(假定屬性有讀權限)。
(2)使用特性的UUID讀:客戶端請求讀基于一個特定類型的所有特性值,,服務器將所有與指定類型匹配的特性的句柄和值回應給客戶端設備(假設屬性有讀權限),。
(3)讀多個特性值:客戶端一次請求中讀取幾個句柄的特性值,,服務器將這些特性值回應給客戶端(假設屬性有讀權限),客戶端需要知道如何解析這些不同的特性值數(shù)據(jù),。
(4)讀特性描述符:客戶端請求讀特定句柄處的特性描述符,,服務器將特性描述符的值回應給客戶端設備(假設屬性有讀權限)。
(5)使用UUID發(fā)現(xiàn)特性:客戶端通過發(fā)送“特性”的類型(UUID)來請求發(fā)現(xiàn)這個“特性”的句柄,。服務器將這個”特性”的聲明回應給客戶端設備,,其中包括特性值的句柄以及“特性”的權限。
(6)寫特性值:客戶端設備請求向服務器特定的句柄處寫入特性值,,服務器將數(shù)據(jù)是否寫入成功的信息反饋給客戶端(假設特性有寫權限,,另外有一種特殊的寫類型是不需要服務器來反饋是否寫入成功的信息的,使用的時候根據(jù)具體應用來具體分析使用),。
(7)寫特性描述符:客戶端設備請求向服務器特定的句柄處寫入特性描述符,,服務器將特性描述符是否寫入成功的信息反饋給客戶端(假設特性描述有寫權限)。
(8)特性值通知:服務器將一個特性值通知給客戶端,,客戶端設備不需要向服務器請求這個數(shù)據(jù),,客戶端收到這個數(shù)據(jù)時,不需要屬性協(xié)議層確認特性值是否被成功接收,。
(9)特性值指示:服務器將一個特性值指示給客戶端,,客戶端設備同樣不需要向服務器請求這個數(shù)據(jù),但是跟通知不一樣的是,,客戶端收到這個數(shù)據(jù)之后,,屬性協(xié)議層必須確認特性值被成功接收。
通知與指示功能的流程如下:
何時發(fā)送通知或指示的條件可以在配置文件中設置,,也可以通過應用來設置,。要想使能通知和指示功能,需要分別在相應的句柄特性描述符寫入“0x0001”和“0x0002”,,如下表所示:
每個Profile初始化其相應的服務并內在的通過設備的GATT服務器來注冊服務,。GATT服務器將整個服務加到屬性表中,并為每個屬性分配唯一句柄,。GATT屬性表中有一些特殊的屬性類型,,其值由藍牙技術聯(lián)盟定義:
(1)GATT_PRIMARY_SERVICE_UUID:表示新服務的起始和提供的服務類型,。
(2)GATT_CHARACTER_UUID:稱為“特性聲明”,,緊隨其后的是GATT特性值。
(3)GATT_CLIENT_CHAR_CFG_UUID:這一屬性代表特性描述符,,它與屬性表中它前面最近的句柄處的特性值相關,,它允許GATT客戶端設備使能特性值通知或者指示。
(4)GATT_CHAR_USER_DESC_UUID:這一屬性代表描述符,,它與屬性表中它前面最近的句柄處的特性值相關,,包含一個ASCII字符串,,是對相關特性的描述。
8.通用訪問配置文件層(Generic Access Profile,,簡寫 GAP):
負責處理設備訪問模式和程序,,包括設備發(fā)現(xiàn)、建立連接,、終止連接,、初始化安全特性和設備配置。
GAP層總是作為下面四種角色之一:
(1)廣播者:不可連接的廣播設備,。
(2)觀察者:掃描設備,,但不發(fā)起建立連接。
(3)外部設備:可連接的廣播設備,,可以在單個鏈路層連接中作為從機,。
(4)集中器:掃描廣播設備并發(fā)起連接,可以在單個鏈路層連接中作為主機,。
外部設備廣播特定的數(shù)據(jù)使集中器知道它是一個可以連接的設備,。廣播內容包括設備地址以及一些額外的數(shù)據(jù),如設備名等,,當然也可以是自定義的數(shù)據(jù),,只要滿足廣播數(shù)據(jù)中廣告的格式即可。集中器收到廣播數(shù)據(jù)后向外部設備發(fā)送掃描請求,,然后外部設備將特定的數(shù)據(jù)回應給集中器,,稱為掃描回應。集中器收到掃描回應后便知道這是一個可以建立連接的外部設備,。這就是設備發(fā)現(xiàn)的全過程,。此時集中器可以向外部設備發(fā)起建立連接的請求。連接請求包括一些鏈接參數(shù),。
GAP層也處理BLE連接中安全特征的初始化,。只有在已認證的連接中特定的數(shù)據(jù)才能被讀寫,一旦連接建立,,兩個設備進行配對,,當配對完成后,形成加密鏈接的密鑰,。典型應用中外設請求集中器提供密鑰來完成配對工作,,密鑰可以是一個固定的值,如000000,,也可以隨機生成一個數(shù)據(jù)提供給使用者,,集中器設備發(fā)送正確的密鑰后,兩設備交換安全密鑰并加密認證鏈接。
在許多情況下,,同一對外設和集中器會不定時地連接和斷開,,BLE的安全機制中有一項特性允許兩個設備之間建立長期的安全密鑰信息,這種特性稱為綁定,,它允許兩設備重新連接時快速地完成加密認證,,而不需要每次連接時執(zhí)行配對的完整過程。
六,、藍牙4.0BLE協(xié)議棧分層思想的優(yōu)點
藍牙4.0BLE協(xié)議棧采用分層思路的最大優(yōu)點是:將服務,、接口和協(xié)議這三個概念明確的區(qū)分開來。服務說明某一層為上一層提供了一些什么樣的功能,;接口說明上一層如何使用下一層的服務,;而協(xié)議涉及到如何實現(xiàn)本層的服務。這樣,,各層之間就具有很強的獨立性,,當協(xié)議的一部分發(fā)送變化時,只需對與此相關的分層進行修改即可,,其他分層不需要改變,。