藍牙
藍牙的波段為2400-2483.5MHz(包括防護頻帶)。這是全球范圍內無需取得執照(但定不是無管制的)的工業、科學和醫療用(ISM)波段的2.4GHz短距離無線電頻段。
藍牙使用跳頻技術,講傳輸的數據分割成數據包,通過79個指定的藍牙頻道分別傳輸數據包。每個頻道的頻寬為1MHz。藍牙4.0使用2 MHz間距,可容納40個頻道。第一個頻道始于 2402 MHz,每 1MHz一個頻道,至2480MHz 。有了適配跳頻(AFH)功能,通常每秒跳1600次。
通訊連接
藍牙主設備最多可與一個微微網(一個采用藍牙技術的臨時計算機網絡)中的七個設備通訊,當然并不是所有設備都能夠達到這一最大量。設備之間可通過協議轉換角色,從設備也可以轉換為主設備(比如,一個頭戴式耳機如果向手機發起連接請求,它作為連接的發送者,自然是主設備,但是隨后也許會作為從設備運行。)
藍牙核心規格提供兩個或以上的微微網連接以形成分布式網絡,讓特定的設備在這些薇薇網中自動同時的分別扮演主和從的角色。
數據傳輸可隨時在主設備和其他設備之間進行(應用極少的廣播模式除外)。主設備可選擇要訪問的蔥設備;典型的情況是,它可以在設備之間以輪替的方式快速轉換。因為是主設備來選擇要訪問的從設備,理論上從設備就要在接收槽內待命,主設備的負擔要比從設備少一些。主設備可以于七個從設備相連接,但是從設備卻很難于一個以上的主設備相連。規格對于散射網中的行為要求是模糊的。
藍牙是一個標準的無限通訊協議,基于設備低成本的收發器芯片,傳輸距離近、低功耗。由于設備使用無線電(廣播)通訊系統,他們并非以實際可見的線相連,然而準光學無線路徑則必須是可行的。射程范圍取決于功率和類別,但是有效射程范圍在實際應用中會各有差異。
有效射程因傳輸條件,材料覆蓋、生產樣本的變化、天線配置和電池狀態有關。多數藍牙應用是為室內環境而設計的,由于墻的衰弱和信號反射造成的信號衰落會使得射程遠小于藍牙產品規定的射程范圍。多數藍牙應用是由電池供電的2類設備,無論對方設備是1類或2類,射程差異均不明顯,因為射程范圍通常取決于低功率的設備。在某些情況下,當2類設備連接到一個敏感度和發射功率都高于典型的2類設備的1類接收器上時,數據鏈的有效射程可被延長,然而多數情況下,1類設備于2類設備的美感度是相近的。
兩個敏感度和發射功率都較高的1類設備相連接,射程可遠高于一般水平的100m ,取決于應用所需要的吞吐量。有些設備在開放的環境中的射程能夠高達1km 甚至更遠。
藍牙配置文件
要使用藍牙無線技術,設備必須能夠解譯某些藍牙配置文件,藍牙配置文件定義了可能的應用,并規定了藍牙設備之間通信的一般行為。這些配置文件包括對通信參數和控制的最初設定。配置文件能夠節約在雙向鏈路起效之前重新發送參數的時間。廣泛的藍牙配置文件描述很多不同類型的應用或設備用例。
BLE協議層
-
物理層(PHY)
- 運行在 2.4GHz ISM band
- GFSK 調制方式(高斯頻移鍵控) -40 頻道 2MHz 的通道間隙
*3 個固定的廣播通道 *37 個自適應自動調頻數據通道
LL層、RF控制層
控制芯片工作在 standby(準備)、advertising(廣播)、scanning
(監聽/掃描),initiating(發起連接)、connected(已連接)這五個狀態中的一種。五 種狀態的切換描述為:advertising(廣播)不需要連接就可以發送數據(告訴所有人, 我來了),scanning(監聽/掃描)來自廣播的數據,initiator(發起人)將攜帶 connection request(連接請求)來相應廣播者,如果 advertiser(廣播者)同意該請求,那么廣播 這和發起者都會進入已連接狀態,發起連接的設備變為 master(主機),接收連接請求 的設備變為 slave(從機)。HCI層 通信層
向 host 和 controller 提供一個標準化的接口。該層可以由軟件 api 實現或 者使用硬件接口 uart、spi、usb 來控制。L2CAP
相當于快遞,將數據打包,可以讓客戶點對點的通信。SM層
安全服務層,提供配對和密鑰的分發,實現安全連接和數據交換。ATT層
允許設備向另外一個設備展示一塊特定的數據,稱之為“屬性”,在 ATT 環境中,
展示“屬性”的設備稱為服務器,與之配對的設備稱為客戶端。
鏈路層狀態(主機和從 機)與設備的 ATT 角色是相互獨立的,也就是說,主機設備可以是 ATT 服務器,也可以 是 ATT 客戶端。從機也一樣。GATT層
從名字就能看出,GATT 是在 ATT 上面的一層結構,定義了使用 ATT 的服務框架, GATT 規定了配置文件(鼎鼎有名的 profile)的結構,在 BLE 中,所有被 profile 或者服 務用到的數據塊都稱為“特性,characteristic”兩個建立連接的設備之間的所有數據通 信都是通過 GATT 子程序處理,應用程序和 profile 直接使用 GATT 層,在后面具體的代 碼中,我們會經常見到 GATT。
藍牙4.0
藍牙4.0是2012年最新藍牙版本,是3.0的升級版本;較3.0版本更省電、成本低、3毫秒低延遲、超長有效連接距離、AES-128加密等;通常用在藍牙耳機、藍牙音箱等設備上。
藍牙中心模式流程
- 建立中心角色
- 掃描外設(discover)
- 連接外設(connect)
- 掃描外設中的服務和特征(discover)
- 獲得外設的services服務
- 獲取外設的Characteristics,獲取Characteristics的值,獲取Characteristics的Descriptor和Descriptor的值
- 與外設做數據交互(explore and interact)
- 訂閱Characteristic的通知
- 斷開鏈接(disconnect)
藍牙外設模式流程
- 啟動一個Peripheral管理對象
- 本地Peripheral設置服務、特性、描述、權限等等
- Peripheral發送廣告
- 設置處理訂閱、取消訂閱、讀characteristic(特性)、寫characteristic的委托方法
藍牙設備狀態
- 待機狀態(Standby):設備沒有傳輸和發送數據,并且沒有連接到任何設備
- 廣播狀態(Advertiser):周期性廣播狀態
- 掃描狀態(Scanner):主動尋找在廣播的設備
- 發起鏈接狀態(Initiator):主動向掃描設備發起連接
- 主設備(Master):作為主設備連接到其他設備
- 從設備(Slave):作為從設備連接到其他設備
藍牙設備的物種工作狀態
- 準備 standby
- 廣播 advertising
- 監聽掃描 scanning
- 發起連接 initiating
- 已連接 connected
名詞解釋
GAAT
現在低功耗藍牙(BLE)連接都是建立在 GATT (Generic Attribute Profile) 協議之上。GATT 是一個在藍牙連接之上的發送和接收很短的數據段的通用規范,這些很短的數據段被稱為屬性(Attribute)。
藍牙SIG規定了許多低功耗設備的配置文件。配置文件是設備如何在特定的應用程序中工作的規格說明。注意一個設備可以實現多個配置文件。例如,一個設備可能包括心率監測儀和電量檢測。Characteristic 特性
一個characteristic包括一個單一變量和0-n個用來描述characteristic變量的descriptor,characteristic可以被認為是一個類型,類 似于類。Descriptor
Descriptor用來描述characteristic變量的屬性。例如,一個descriptor可以規定一個可讀的描述,或者一個characteristic變量可接受的范圍,或者一個characteristic變量特定的測量單位。Service
service是characteristic的集合。例如,你可能有一個叫“Heart Rate Monitor(心率監測儀)”的service,它包括了很多characteristics,如“heart rate measurement(心率測量)”等
GAP
詳細介紹 GATT 之前,需要了解 GAP(Generic Access Profile),它在用來控制設備連接和廣播。GAP 使你的設備被其他設備可見,并決定了你的設備是否可以或者怎樣與合同設備進行交互。例如 Beacon 設備就只是向外廣播,不支持連接,小米手環就等設備就可以與中心設備連接。
-
設備角色
GAP給設備定義了若干角色,其中主要就是外圍設備(Peripheral)和中心設備(Central)- 外圍設備:一般就是非常小活著簡單的低功耗設備,用來提供數據,并連接到一個更加相對強大的中心設備,例如小米手環。
- 中心設備:中心設備想對比較強大,用來連接其他外圍設備,例如手機。
廣播數據
在 GAP 中外圍設備通過兩種方式向外廣播數據: Advertising Data Payload(廣播數據)和 Scan Response Data Payload(掃描回復),每種數據最長可以包含 31 byte。這里廣播數據是必需的,因為外設必需不停的向外廣播,讓中心設備知道它的存在。掃描回復是可選的,中心設備可以向外設請求掃描回復,這里包含一些設備額外的信息,例如設備的名字。連接間隔
在兩個BLE設備的連接中使用調頻機制,兩個設備使用特定的信道收發 數據,然后過一段時間后再使用新的信道。(鏈路層處理信道切換),兩設備在信道切換 后收發數據稱之為連接事件,即使沒有應用數據的收發,兩個設備任然會通過交換鏈路 層數據來維持連接,連接間隔就是兩個連接時間之間的時間間隔,連接間隔以 1.25ms 為單位,連接間隔的值為 6(7.5ms)~3200(4s)。
不同的應用可以要求不同的時間間隔,長的時間間隔的優勢是顯著的節省功耗,因 為設備可以在連接事件之間有較長時間的休眠,壞處是當設備有應用數據需要發送時, 必須要等到下一個連接事件。短的時間間隔優勢是兩設備連接頻發,可以更快的收發數 據,不利之處是設備因連接時間的到來而頻繁的喚醒,會有較多的功耗。-
廣播流程
外圍設備會設定一個廣播間隔,每個廣播間隔中,它會重新發送自己的廣播數據。廣播間隔越長,越省電,同時也不太容易掃描到。
大部分情況下,外設通過廣播自己來讓中心設備發現自己,并建立 GATT 連接,從而進行更多的數據交換。也有些情況是不需要連接的,只要外設廣播自己的數據即可。用這種方式主要目的是讓外圍設備,把自己的信息發送給多個中心設備。因為基于 GATT 連接的方式的,只能是一個外設連接一個中心設備。 使用廣播這種方式最典型的應用就是蘋果的 iBeacon。廣播工作模式下的網絡拓撲圖如下:
GATT
它定義了兩個BLE設備通過較多 Service 和Characteristic 的東西進行通信。GATT 使用了ATT協議 ,ATT 協議把 Service 和Characteristic 以及對應的數據保存在一個查找表中,使用16bit ID 作為每一項的索引。
一旦兩個設備建立起了連接,GATT 就開始起作用了,這也意味著,你必須完成前邊的 GAP 協議 GATT連接,必須先經過 GAP 協議
注意 GATT 連接是獨占的。也就是一個BLE外設同時智能被一個中心設備連接。一旦外設被連接,它就會馬上停止廣播,這樣它就對其他設備不可見了。當設備斷開,它又開始廣播。中心設備和外設需要雙向通信的話,唯一的方法就是建立GATT連接 。
一旦建立起了連接,通信就是雙向的了,對比前面的 GAP 廣播的網絡拓撲,GAP 通信是單向的。如果你要讓兩個設備外設能通信,就只能通過中心設備中轉。
GATT 通信事務
GATT通信的雙方是C/S關系。外設作為GATT 服務端 (Server),它維持了ATT查找表以及 service 和characteristic 的定義。
中心設備是GATT 客戶端(Client),它向Server 發起請求。
注意:需要注意的是,所有的通信事件,都是由客戶端(主設備)發起,并且接收服務端(從設備)的相應。
一旦連接建立,外設將會給中心設備建議一個連接間隔,這樣,中心設備就會在每個連接間隔嘗試去重新連接,檢查是否有新的數據。但是,這個間隔只是一個建議,你在中心設備可能并不會嚴格按照這個間隔來執行。例如你的中心設備正在忙于連接其他的外設,活著中心設備資源太忙。
下圖展示一個外設(GATT 服務端)和中心設備(GATT 客戶端)之間的數據交換流程,可以看到的是,每次都是主設備發起請求:
GATT結構
BLE
Profile
Profile 可以理解為一種規范,一個標準的通信協議,Profile 存在于從機中。藍牙組
織規定了一些列的標準 Profile,例如 HID OVER GATT、防丟器、心率計等。每個 Profile 中會包含多個 Service,每個 Service 代表從機的一種能力。Service
Service 可以理解為一個服務,在 ble 從機中,通過有多個服務,例如電量信息服務、系 統信息服務等,每個 Service 里又包含多個 Characteristic 特征值。每個具體的 Characteristic 特征值,才是 ble 通信的主體。比如當前的電量是 80%,所以會通過電量 的 characteristic 特征值存在從機的 profile 里,這樣主機就可以通過這個 characteristic, 來讀取 80%這個數據Characteristic
Characteristic 特征值,BLE 主從機的通信均是通過 Characteristic 來實現,可以理解為一 個標簽,通過這個標簽可以獲取或者寫入想要的內容。UUID
UUID,統一識別碼,我們剛才提到的 Service 和 Characteristic,都需要一個唯一的 UUID 來標識。
每個從機都會有一個叫做 profile 的東西存在,不管是上面的自定義的 simpleProfile,還是標準的防丟器 Profile,他們都是由一些列 Service 組成,然后每個 Service 又包含了多個 Characteristic,主機和從機之間的通信,均是通過 Characteristic 來實現。
數據發送
在BLE 協議棧中進行數據傳遞氛圍兩個方面,一個是GATT的client主動向service發送數據,另一個是GAAT的service主動向client發送數據 。簡化為從主機向從機發送數據,從機向主機發送發送數據。
- 主機向從機發送數據
發送可以調用 GATT_WriteCharValue 函數實現,該函教會調用協議棧里面與硬件相
關的函數最終將數據通過天線發送出去,這里面涉及對射頻模塊的操作,例如:打開發 射機,調整發射機的發送功率等內容,這些部分協議棧已經實現了,用戶不需要自己寫 代碼去實現,只需要掌握 GATT_WriteCharValue 函數的使用方法即可。需要發送的數據 填充到 value 中,然后數據長度填充到 len 中。如下圖。
- 從機向主機發送數據
從機向主機發送數據,需要調用 GATT_Notification 函數實現,上面的主從機沒用使
用到該函數。開發串口透傳等項目時,就需要在從機中主動向主機發送數據,需要該函 數來實現。下面的代碼是來自我們的串口透傳中。需要填充的和 GATT_WriteCharValue 類似,value 和 len。
數據接收
數據接收和數據發送一樣,同樣分為兩個方面。
從機接收主機發來的數據和主機接收來自從機的數據
- 從機接收主機發送來的數據
當從機接收到主機發來的數據后,從機會產生一個 GATT Profile Callback 調用,我們 在這個 callback 中接收主機發送的數據。這個 callback 在從機初始化時向 Profile 注冊。
主機通過 BLE 提供的數據發送接口發送數據 后,從機的協議棧收到數據后,做相應處理,取得自己需要的數據即可,其他工作,都 由 BLE 協議棧自動完成了。
掃描回應
當主機掃描從機時,如果從機正在廣播,將被掃描到,并且可以看到從機的設備名,發射功率等信息,而這些信息并為出現在剛才的廣播數據中,這是為什么呢。
當從機接到主機發來的掃描請求時,會有一個掃描回應 Scan Response ,在這個 response 中,攜帶了從機設備名,發送功率等信息 。
一個按鍵服務的底層實現
首先注冊按鍵服務程序
向一個全局變量中賦值自己的任務 ID,從代碼中可以看出,只能第一個調用改函數 的任務才能成功注冊到按鍵服務。