【嵌入式智能硬件】BLE相關協議(GAP&GATT)

一、GAP

GAP全名是Generic Access Profile,通用訪問配置文件,它定義了藍牙設備的角色,中心和外設,並且控制他們的連接和廣播數據。廣播數據有兩種方式:廣播數據和掃描回覆數據,數據包大小最長爲31字節,其中廣播數據方式是必需的。
廣播數據就是藍牙設備自己定時廣播數據出來,讓周圍環境的其它設備可以掃描到它,知道它的存在,是外設主動完成的。而掃描回覆數據是可選的,它會根據需要響應請求,比如收到中心設備連接請求,會響應這個請求。這個協議決定了藍牙設備的交互方式,比如iBeacon只能向外廣播消息,而小米手環可以與中心設備雙向通信。
GAP的工作流程如下圖:

 

GAP廣播流程圖.png

大部分情況外設廣播自己來讓中心設備發現自己並建立連接,然後GATT(後面講到)就可以用來進行更多的數據交換,這種方式是獨佔的,就是建立連接了以後外設就不再廣播了,只跟連接上的中心通信。但也有一種是不需要連接的,比如上面說的Beancon設備,它只需要向外廣播數據,只要在一定的範圍內,所有的中心設備都可以收到數據,不需要指定跟具體某個中心建立連接,他們的網絡拓撲圖如下:

GAP廣播方式網絡拓撲圖.png

二、GATT

GATT,全名Generic Attribute Profile, 通用屬性配置文件。它定義了兩個BLE設備的數據傳輸方式和兩個概念:Services 和 Characteristics。它建立在ATT(Attribute Protocol)協議的基礎上,ATT協議主要是定義了Attribute(屬性)這個數據結構。
一個attribute由三個元素組成:
1、16 bit的句柄(唯一性,用於區分和查找不同的attribute)
2、UUID(ATT本身不定義,留給GATT來定義)
3、一個定長的值value(配合UUID使用,由GATT來決定這個UUID的意義和數據)

GATT協議中的Service和Characteristic需要遵循ATT這種數據結構,ATT會管理這些數據並提供查找方法。

GATT是建立在GAP基礎之上發揮作用的,就是兩個BLE設備只有通過GAP建立連接之後才能用GATT進行通信。上面說了掃描回覆數據交互方式是獨佔的,所以GATT通信只允許是一個外設和一箇中心連接。如果兩個外設想要通信,唯一的方式就是建立GATT連接,通過中心來中轉。

記住:一個外設只能跟一箇中心建立連接(獨佔的),而一箇中心可以同時連接多個外設(一個手機可以同時連接多個BLE設備)
GATT連接網絡拓撲圖

 

GATT網絡拓撲圖.png

GATT通信的雙方是C/S關係,外設作爲GATT的服務器(Server),中心設備是GATT的客戶端(Client),它向Server發起請求。注意,所有的通信都是由主設備(客戶端Client)發起,服務器Server響應數據反饋給Client。一旦建立了通信連接,外設會建議中心設備做定時連接(connection interval),這樣中心設備就會在每個連接間隔嘗試重新連接,檢查有沒有新的數據。這個只是一個建議,中心設備可能不會嚴格按照這個時間間隔來執行,例如中心設備正忙於連接其它外設或者資源太忙。
外設與中心數據交換圖:

 

數據交換圖.png

GATT結構由嵌套的Profile、Service、Characteristics組成,如下圖:

GATT結構圖.png

Profile,每個Profile就是預先定義好的Service集合。例如官方的心率Heart Rate Profile就是結合了Heart Rate Service和Device Information Service(可以在這裏下載下面這兩個PDF文件查看詳細內容)

心率.png

 

所有官方通過GATT的Profile可以看這裏

Service就是一個獨立的邏輯項,它包含一個或多個Characteristic,每個Service都由唯一的UUID標識,UUID有16位的有128位的,16位的UUID是官方通過認證的,需要花錢購買,128位的可以隨便自己定義。完整的Service列表可以看這裏

Characteristic是GATT中最小的邏輯數據單元,當然它可能包含一組關聯的數據,例如加速度計的 X/Y/Z 三軸值。還是官方心率的例子,可以看到它包含了 3 個 Characteristic:Heart Rate Measurement、Body Sensor Location 和 Heart Rate Control Point,並且定義了只有第一個是必須的,其他是可選實現的。
每個Characteristic對應的value就是對應格式的實際心率數據。中心可以通過讀取service、再進一步讀取characteristic來獲得具體的心率數值。

與Service類似,每個 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一標識。所有數據交互必須通過明確的UUID確定到service和characteristic。

你可以免費使用 Bluetooth SIG 官方定義的標準 Characteristic,使用官方定義的,可以確保 BLE 的軟件和硬件能相互理解。當然,你可以自定義 Characteristic,這樣的話,就只有你自己的軟件和外設能夠相互理解。

實際上,和 BLE 外設打交道,主要是通過 Characteristic。你可以從 Characteristic 讀取數據,也可以往 Characteristic 寫數據。這樣就實現了雙向的通信。所以你可以自己實現一個類似串口(UART)的 Sevice,這個 Service 中包含兩個 Characteristic,一個被配置只讀的通道(RX),另一個配置爲只寫的通道(TX)。



作者:eb59f8b6f06e
鏈接:https://www.jianshu.com/p/62eb2f5407c9
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章