當前位置:編程學習大全網 - 編程語言 - 藍牙BLE協議棧基礎知識

藍牙BLE協議棧基礎知識

這次介紹壹下藍牙協議棧(BLE)的基礎知識,藍牙協議棧組成如下圖所示,首先我們說說GAP和GATT

GAP層是負責連接的,其中包含廣播、掃描、連接、斷開的過程和參數

1.1 角色

藍牙設備的角色主要有中心(Central)和外圍設備(Peripheral)兩種,中心設備向外圍設備發起連接。鏈路層的主機(Master)和從機(Slave)的概念跟中心和外圍的概念是對應的。

除了中心和外圍之外,還有Observer和Broadcaster角色,Observer壹直進行監聽,Broadcaster壹直進行發送,這兩種角色都只廣播,不能發起連接或者被連接,這裏就不詳細說了

1.2 廣播

建立連接之前,外圍設備每隔壹段時間發送壹個廣播包,讓正在掃描的設備知道這是壹個可以連接的設備,掃描設備才能對外圍設備開始連接,這個廣播包的時間間隔叫advertising interval,這個間隔可以在10ms到10.24s之間,間隔的長短會影響建立連接所花時間。

中心要收到廣播包之後才能發送連接請求,相應的,外圍設備在發送廣播包之後會等待連接請求。

藍牙廣播包最多可以包含31字節數據,包含設備名稱和壹些標誌。中心收到廣播包之後可以發送Scan Request以請求更多的廣播信息,外圍設備會回復壹個同樣是31個字節的Scan Response。

BLE有37個數據信道和3個廣播信道,廣播包,Scan Request,Scan Response使用廣播信道

1.3 掃描

掃描是指中心監聽廣播包並且發送Scan request。掃描中有兩個參數:Scan window(掃描窗口) 和Scan interval(掃描間隔)

1.4 發起連接

中心發起連接的過程類似於掃描的過程,中心收到廣播包之後會發送壹個連接請求給外圍設備

1.5 連接

中心和外圍設備連接上之後,中心會按照壹定的連接間隔(Connection interval)向外圍設備請求數據,這個間隔是由中心定的,在7.5ms到4s之間。

如果要提高吞吐量,可以在壹個連接間隔中傳輸多個數據包,每個包最多可以包含20字節數據。如果要省電,並且外圍設備並沒有什麽數據需要傳輸,可以跳過幾個連接間隔,這稱之為Slave latency。

如果外圍設備沒有在規定時間內響應中心的請求就會認為是連接中斷,稱之為Supervision Time-out(0.1s-32s),所以在使用Slave latency的時候要註意不要引起Supervision Time-out

這些參數是建立連接的時候中心確定的,如果建立連接之後外圍設備想要更改,可以向中心發送Connection parameter update request。

整個數據交換的過程會在不同的頻段中跳頻(除了廣播頻段),跳頻是自動完成的,不需要我們去管。

設備之間的數據傳輸是在GATT這層完成的

2.1 角色

除了GAP裏面的角色,BLE在GATT裏面也定義了兩個角色,分別是GATT Server 和GATT Client,壹般來說產生數據的設備是GATT Server,訪問數據的設備是GATT Client,壹個設備可以既是GATT Server也是GATT Client。這兩個角色跟GAP中的角色並沒有關系。

2.2 GATT結構

GATT Server通過屬性表(Attribute table)來組織數據,

2.2.1 Attribute

上圖中每壹行就是壹個屬性Attribute。

每個屬性具有壹個handle,壹個UUID,和壹個Value。

Handle是Attribute的壹個索引,每個Attribute的Handle都是唯壹的。

UUID(universal unique identifier)表示的是Attribute中數據的類型信息。UUID在壹個設備裏面不是唯壹的,可以有多個Attribute的UUID都壹樣

2.2.2 Characteristic

可以把Characteristic看作是上圖中幾行的集合(幾個Attribute的集合)

每個Characteristic至少有兩個Attribute,其中壹個是聲明,另壹個包含數據。前面說過,藍牙傳輸數據是通過GATT來傳的,更具體的來說,是通過壹個個Characteristic來傳的。

2.2.3 Descriptors 描述符

Characteristic除了包含聲明和數據之外,還可以有描述符(Descriptors,但不是必須有),Descriptors是用來進壹步描述Characteristic(但不提供數據)的Attribute,比如說用自然語言描述該Characteristic是用來幹什麽的。

有壹類特殊的描述符,叫CCCD(Client Characteristic Configuration Descriptor),支持Notify和Indicate的Characteristic 必須包含CCCD

2.2.4 Service

Service 是壹個或者多個Characteristic的邏輯組合

壹個GATT Service 通常包含了壹些相關的功能,舉例來說,壹個人機界面Service包含了各種人機交互輸入輸出的數據,而其中的每個Characteristic 是壹類信號或者設備

介紹幾個常見的Service。

GAP GATT Service:作為Central或者Peripheral的BLE設備都需要有這個Service。這個Service包含了如何發現和連接設備的信息

Generic Attribute Service: GATT Server都要有這個Service,這個Service包含了GATT Server的信息

2.2.5 Profile

壹個或者多個Service組合在壹起稱為Profile。Profile 是邏輯上的概念,自己並不具備單獨的Attribute。

2.3 標準和自定義的Service和Characteristic

藍牙聯盟定義了壹些標準的Profile, Service, Characteristic 和Attribute。由於Profile和Service是在具體應用中規定的,所以用戶可以進行自定義

2.4 UUID

圖2中每壹個Attribute都有UUID,UUID是壹個128位的數字,是用來描述Attribute的類型的

2.4.1 藍牙聯盟UUID

藍牙聯盟把UUID分為基礎UUID(base UUID)和16位UUID。

藍牙聯盟規定的UUID都具有同樣的base UUID:

0x0000xxxx-0000-1000-8000-00805F9B34FB

藍牙聯盟規定了壹些16位UUID,替換掉base UUID中的xxxx就組成壹個完整的128位UUID了。舉例來說,0x2A37是壹個16位Heart Rate Measurement Characteristic,那麽對應的128位的UUID就是:

0x00002A37-0000-1000-8000-00805F9B34FB。

由於所有藍牙聯盟的UUID都具有同樣的base UUID,所以用16位UUID就可以區分藍牙聯盟規定的Attribute了

但我們自定義的Attribute, Characteristic, Service,不能使用這個base UUID,因此也不能用16位UUID,只能使用制造商自定義的128位UUID。

2.5 空中接口操作和屬性

由於每個Attribute具有唯壹的Handle,所以幾乎所有的操作都是通過Handle去完成,Characteristic常用的屬性有:Write, Write without response, Read, Notify, Indicate。 Characteristic的屬性決定了我們可以如何使用它

Write, Write without response

這兩種屬性允許GATT Client 對Server的characteristic的值進行寫操作,兩者的區別是Write without response對寫操作不會有確認

Read

GATT Client可以讀Server的Characteristic的值。

Notify 和Indicate

這兩種屬性表示的是當GATT Server 中該Characteristic 的值發生變化的時候會通知Client。兩者的區別是Indicate 會進行確認但Notify不會

接下來舉例說明壹下前面介紹的概念

Thingy 的Services,作為Server需要有GAP Service和GATT Service,另外還有壹個標準的Battery Service,後面是幾個自定義的服務

詳細的看看GAP Service,這個服務的Handle是1到9,那麽把這些Characteristics和Attribute都打出來

可以看到這個Service的結構是這樣的

這是壹個標準的Service,使用標準Service/Characteristic的時候要符合藍牙SIG對這個Service/Characteristic的規定,我們可以到 藍牙SIG 看看是不是壹致

以上就是BLE的壹些基礎知識和示例

  • 上一篇:喪屍題材動漫妳知道哪些?
  • 下一篇:如何設計基於單片機的多功能8路搶答器
  • copyright 2024編程學習大全網