iOS - GATT Profile 简介
1、引言
現在低功耗藍牙(BLE)連接都是建立在 GATT (Generic Attribute Profile) 協議之上。GATT 是一個在藍牙連接之上的發送和接收很短的數據段的通用規范,這些很短的數據段被稱為屬性(Attribute)。
2、GAP
詳細介紹 GATT 之前,需要了解 GAP(Generic Access Profile),它用來控制設備連接和廣播。GAP 使你的設備被其他設備可見,并決定了你的設備是否可以或者怎樣與合同設備進行交互。例如 Beacon 設備就只是向外廣播,不支持連接,小米手環等設備就可以與中心設備連接。
2.1 設備角色
GAP 給設備定義了若干角色,其中主要的兩個是:外圍設備(Peripheral)和中心設備(Central)。
外圍設備:這一般就是非常小或者簡單的低功耗設備,用來提供數據,并連接到一個更加相對強大的中心設備。例如小米手環。
中心設備:中心設備相對比較強大,用來連接其他外圍設備。例如手機等。
2.2 廣播數據
在 GAP 中外圍設備通過兩種方式向外廣播數據:Advertising Data Payload(廣播數據)和 Scan Response Data Payload(掃描回復),每種數據最長可以包含 31 byte。這里廣播數據是必需的,因為外設必需不停的向外廣播,讓中心設備知道它的存在。掃描回復是可選的,中心設備可以向外設請求掃描回復,這里包含一些設備額外的信息,例如設備的名字。
2.3 廣播流程
GAP 的廣播工作流程如下圖所示。
從圖中我們可以清晰看出廣播數據和掃描回復數據是怎么工作的。外圍設備會設定一個廣播間隔,每個廣播間隔中,它會重新發送自己的廣播數據。廣播間隔越長,越省電,同時也不太容易掃描到。
2.4 廣播的網絡拓撲結構
大部分情況下,外設通過廣播自己來讓中心設備發現自己,并建立 GATT 連接,從而進行更多的數據交換。也有些情況是不需要連接的,只要外設廣播自己的數據即可。用這種方式主要目的是讓外圍設備,把自己的信息發送給多個中心設備。因為基于 GATT 連接的方式,只能是一個外設連接一個中心設備。使用廣播這種方式最典型的應用就是蘋果的 iBeacon。廣播工作模式下的網絡拓撲圖如下:
3、GATT
GATT 的全名是 Generic Attribute Profile(姑且翻譯成:普通屬性協議),它定義兩個 BLE 設備通過叫做 Service 和 Characteristic 的東西進行通信。GATT 就是使用了 ATT(Attribute Protocol)協議,ATT 協議把 Service, Characteristic 以及對應的數據保存在一個查找表中,此查找表使用 16 bit ID 作為每一項的索引。
一旦兩個設備建立起了連接,GATT 就開始起作用了,這也意味著,你必需完成前面的 GAP 協議。這里需要說明的是,GATT 連接,必需先經過 GAP 協議。實際上,在 Android 開發中,可以直接使用設備的 MAC 地址,發起連接,可以不經過掃描的步驟。這并不意味不需要經過 GAP,實際上在芯片級別已經給你做好了,藍牙芯片發起連接,總是先掃描設備,掃描到了才會發起連接。
GATT 連接需要特別注意的是:GATT 連接是獨占的。也就是一個 BLE 外設同時只能被一個中心設備連接。一旦外設被連接,它就會馬上停止廣播,這樣它就對其他設備不可見了。當設備斷開,它又開始廣播。
中心設備和外設需要雙向通信的話,唯一的方式就是建立 GATT 連接。
3.1 GATT 連接的網絡拓撲
下圖展示了 GATT 連接網絡拓撲結構。這里很清楚的顯示,一個外設只能連接一個中心設備,而一個中心設備可以連接多個外設。
一旦建立起了連接,通信就是雙向的了,對比前面的 GAP 廣播的網絡拓撲,GAP 通信是單向的。如果你要讓兩個設備外設能通信,就只能通過中心設備中轉。
3.2 GATT 通信事務
GATT 通信的雙方是 C/S 關系。外設作為 GATT 服務端(Server),它維持了 ATT 的查找表以及 service 和 characteristic 的定義。中心設備是 GATT 客戶端(Client),它向 Server 發起請求。需要注意的是,所有的通信事件,都是由客戶端(也叫主設備,Master)發起,并且接收服務端(也叫從設備,Slave)的響應。
一旦連接建立,外設將會給中心設備建議一個連接間隔(Connection Interval),這樣,中心設備就會在每個連接間隔嘗試去重新連接,檢查是否有新的數據。但是,這個連接間隔只是一個建議,你的中心設備可能并不會嚴格按照這個間隔來執行,例如你的中心設備正在忙于連接其他的外設,或者中心設備資源太忙。
下圖展示一個外設(GATT 服務端)和中心設備(GATT 客戶端)之間的數據交換流程,可以看到的是,每次都是主設備發起請求:
3.3 GATT 結構
GATT 事務是建立在嵌套的 Profiles, Services 和 Characteristics 之上的的,如下圖所示:
1、Profile 并不是實際存在于 BLE 外設上的,它只是一個被 Bluetooth SIG 或者外設設計者預先定義的 Service 的集合。例如心率 Profile(Heart Rate Profile)就是結合了 Heart Rate Service 和 Device Information Service。所有官方通過 GATT Profile 的列表可以從這里找到。
2、Service 是把數據分成一個個的獨立邏輯項,它包含一個或者多個 Characteristic。每個 Service 有一個 UUID 唯一標識。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通過認證的,需要花錢購買,128 bit 是自定義的,這個就可以自己隨便設置。
官方通過了一些標準 Service,完整列表在這里。以 Heart Rate Service 為例,可以看到它的官方通過 16 bit UUID 是 0x180D,包含 3 個 Characteristic:Heart Rate Measurement, Body Sensor Location 和 Heart Rate Control Point,并且定義了只有第一個是必須的,其它是可選實現的。
3、Characteristic 是在 GATT 事務中的最低界別的,Characteristic 是最小的邏輯數據單元,當然它可能包含一組關聯的數據,例如加速度計的 X/Y/Z 三軸值。
與 Service 類似,每個 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一標識。你可以免費使用 Bluetooth SIG 官方定義的標準 Characteristic,使用官方定義的,可以確保 BLE 的軟件和硬件能相互理解。當然,你可以自定義 Characteristic,這樣的話,就只有你自己的軟件和外設能夠相互理解。
舉個例子,Heart Rate Measurement Characteristic,這是上面提到的 Heart Rate Service 必需實現的 Characteristic,它的 UUID 是 0x2A37。它的數據結構是,開始 8 bit 定義心率數據格式,接下來就是對應格式的實際心率數據。
實際上,和 BLE 外設打交道,主要是通過 Characteristic。你可以從 Characteristic 讀取數據,也可以往 Characteristic 寫數據。這樣就實現了雙向的通信。所以你可以自己實現一個類似串口(UART)的 Sevice,這個 Service 中包含兩個 Characteristic,一個被配置只讀的通道(RX),另一個配置為只寫的通道(TX)。
3.4 更多內容
Bluetooth SIG 官方文檔
藍牙核心協議文檔
Bluetooth Developer Portal
官方通過的 BLE Profile
官方通過的 BLE Service
官方通過的 BLE Characteristic
移動開發資源
Android BLE GUIDE - Android developer 官網的入門文章,里面有實例代碼和講解視頻。
Application Accelerator Kit - iOS, Android or Windows Phone 移動開發樣例
視頻: Core Bluetooth 101 - WWDC 2012 關于 BLE 開發的視頻。
————————————————
版權聲明:本文為CSDN博主「fqerfcqewfd」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43172830/article/details/83828092
總結
以上是生活随笔為你收集整理的iOS - GATT Profile 简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 001.组织机构代码生成
- 下一篇: 在线相册管理系统