ble - GATT 協議詳解

目錄

GATT  OverView

service 定義

include 定義

characteristic 定義

HCI log 分析: GATT discover service flow


GATT 是ble 的另一個 基本協議,總結了gatt 一些定義,最後通過一份hci log,說明一下GATT在實際應用中如何運作。

兩年前初次接觸ble 就是從GATT spec 開始入手學習,工作中更多的是下沉到bludroid stack 維護工作中,GATT基礎知識通過整理blog,加深了自己的理解。憑着自己的工作經驗,總結了GATT部分核心內容,可能仍有些許遺漏。

歡迎有興趣的朋友留言,有描述不清或者有錯誤的地方,也歡迎指正

GATT  OverView

Gatt 是在ATT基礎上的封裝,定義了一些服務發現的框架。

整體框架圖如上, GATT DataBase主要分爲三個部分,service,include,characteristic,首先圍繞這三個分別作介紹

service 定義

 

類型: 服務有兩種類型,primary service 和secondary service,

primary service可以被其他service 所包含,可以通過discover 流程發現。

secondary service只能被primary service 或者其他secondary service 所包含,不能獨立存在。

一個服務的類型,會在申明中註明。

組成:gatt 數據框架都是有一個或者多個service 並列組成的。

用戶通過定義不同的service,實現不同的功能。

一系列ATT數據組成一個group,表示一個service。

所有的service都必須滿足相同的數據要求,具體分爲三個部分

1. 服務申明(必須)service 

2. 包含其他服務(可選)

3. 必須的特徵和可選擇的特徵、

紅色部分爲一個服務必須包含的部分,藍色爲可選擇的部分。

服務申明: 每個定義的service第一條就是服務申明, 因此以服務申明可以分隔開所有不同的服務。

服務聲明的數據結構,ATT類型(僅有兩種)+ ATT value(服務的具體類型,比如電量服務,GAP服務等等)

服務聲明爲read only,不可以被修改,有server 端在自定義數據表格的時候確定。

 

申明之後,緊跟include 和 characteristic部分。

 

include 定義

include 是解釋服務之間的關係,secondary service只能被primary service 或者其他secondary service 所包含,不能獨立存在。

include 是service 中可選擇的部分,不強制要求必須有這一部分。

同服務一個樣,include 也是從declaration 開始。

一條ATT僅包含一個include 信息。

include 申明格式:

ATT value: 包含的服務handle 是該服務對應的申明,  service UUID 是指該服務的類型

通過include 申明,可以查到包含服務的 開始handle和結束handle,及服務類型 三個信息

該申明也是read only,不可以被修改

 

characteristic 定義

特徵必須要有申明和值申明,可能含有特徵描述申明。

同服務一樣,相鄰的所有特徵都是通過申明ATT 間隔開的。一個特徵的結束handle 一定是下一個特徵的申明handle

特徵申明:

同服務申明格式一致,指出實際value對應的handle,及類型(uuid),方便解析

每一個申明都有屬性,決定value 可以被操作的方法。

特徵屬性詳解:

broadcast: 如果被設置,允許特徵值被廣播,config descriptor 一定存在

read: 如果被設置,可以通過Read ATT相關操作訪問特徵值

write with respondse:如果被設置,可以通過 Write Request 更改特徵值

Notify:如果被設置,特徵值可以通過notify 方式通過server 發送到client,config descriptor 一定存在,控制notify發送開關

Indicate:如果被設置,特徵值可以通過indicate,從server 發送到client,config descriptor 一定存在,控制indicate 狀態開關

Authenticated Singend write:如果被設置,僅能通過signed write的方式去更改特徵值

extended propertyies:如果被設置,表明改特徵值必然存在一個extended properities descriptor,屬性值配置過長,有一些補充的屬性配置在descriptor中

特徵值申明:

主要包含兩個信息:characteristic type(uuid) 和value

此處的uuid 與特徵申明中,uuid 一樣,都是指特徵值的uuid

任何特徵都必須包含這一項

這一項可以通過屬性定義的方法,被訪問或操作

特徵描述申明:

特徵描述是特徵的可選項

SIG定義了一些跟特徵相關的可用描述,描述有對應的uuid

所有的特徵描述緊緊跟着特徵值申明之後的ATT handle

擴展屬性描述:

可信任寫: 可以在一個操作中,通過pre write request,按照順序,依次write 多個att handle,然後最後一次性寫入。

Writable Auxiliaries: 可寫user descriptor,如果這個bit 被置位,可以更改特徵中的user 描述內容。

當前僅有兩個內容在擴展屬性中,後續可能會更新更多

client config 描述:

包含notify 和 indicate的開關

能夠被client 配置的描述, 比如RC 配置server 端的 按鍵屬性

其他位保留

每一個client都有與之對應的一個config,配置client config 僅僅會影響到當前配置的client

server config 描述

包含着發送廣播的配置開關

一旦這個config 被設置,會向所有的client 發送廣播包

這個值被設置,會在server 端具備發廣播的能力的時候,將特徵值通過廣播發送出去。進入start advertise 階段,會被自動發送出去。

另外一些其他的特徵描述,可以查閱spec ,在這不做一一介紹。

 

HCI log 分析: GATT discover service flow

ATT數據表是定義在server端的一組數據,在設備初次配對,client 會通過gatt service discover 步驟,獲取到client 所持有的ATT 數據表。

GATT 詳細定義了discover service 步驟,每一步均是通過handle 實現對ATT數據的操作 ,逐步獲取所有的數據表。

1. 找到所有的primary service

 在並不知道DB 中包含有多少個service 的時候,先用priimary service 過濾條件,控制搜索結果的數量

整體上快速定位目標primary service 的起始和結束handle 劃分。

第一次read by group type request,會將區間設置爲最小值1 到最大值0xffff

然後根據返回結果,不斷縮小搜索範圍,直至error response 或者到達最大值,表示全部搜索結束。

通過第一輪操作,可以整體上把所有primary service 找到,對應的列表如下:

handle 區間:

1-4 GAP service

5-15 GAP service

25-28 電量 service

29-50 HID service

51-56  自定義服務1

57-59  自定義服務2

60-63 自定義服務3

2.逐個找到所有服務中的include 和特徵值

經過第一步,僅僅大概確認了每個primary service的區間分佈。

ATT handle 都是依次排列,可以確認handle 15--25 之間,可能是secondary service,或者handle 50 之後仍然有secondary service 仍然沒有被發現。

但是通過查找primary service 中的include 信息,可以找到第一步中沒有被發現的secondary service.

在這一步中首先使用read by type ,快速找到service 區間內的inclued 申明和characteristic 申明。

由於ATT handle 的連續性,找到申明之後,後續的的值及描述都會被一一確認。

找到特徵申明之後,通過find infomation request可以查到characteristic 對應的所有handle

所有的搜索,會不斷縮小範圍,直到所有聯繫的handle 都被確認

一一解析hci log 可以得到如下的完整數據分佈:

Gatt service 列表數據表
handle service 申明 characteristic 申明 characteristic value

characteristic descriptor

1 GAP service      
2  

service change,value:3

   
3     uuid:service change;  value:      ;  propertis: indicate permite  
4       client config descriptor
5 GAP service      
6   uuid:device name; value: 7    
7     uuid:device name;  value:      ;  propertis:  
8   uuid:apperence; value: 9    
9     uuid:apperence;  value:      ;  propertis:  
10   uuid:Perpherial preferred connection paramterts; value: 11    
11     uuid:Perpherial preferred connection paramterts;  value:      ;  propertis:  
12   uuid:peripheral privacy flag; value: 13    
13     uuid:peripheral privacy flag;  value:      ;  propertis:  
14   uuid:Reconnect address; value: 15    
15     uuid:Reconnect address;  value:      ;  propertis:  
16        
17   uuid:Manufacture Name; value: 18    
18     uuid:Manufacture Name;  value:      ;  propertis:  
19   uuid:Hardware Revision; value: 20    
20     uuid:Hardware Revision;  value:      ;  propertis:  
21   uuid:System ID; value: 22    
22     uuid:System ID;  value:      ;  propertis:  
23    uuid:PNP ID; value: 24    
24     uuid:PNP ID;  value:      ;  propertis:  
25 電量 service      
26   uuid:battery level; value: 27    
27     uuid:battery level;  value:      ;  propertis:  
28       uuid:client config descriptor
29 HID service      
30   uuid:report map; value: 31    
31     uuid:report map;  value:      ;  propertis:  
32    uuid:HID information; value: 33    
33     uuid:HID information;  value:      ;  propertis:  
34   uuid:HID Control Point; value: 35    
35     uuid:HID Control Point;  value:      ;  propertis:  
36   uuid:HID report; value: 37    
37     uuid:HID report;  value:      ;  propertis:  
38       uuid:report reference descriptor; 
39       uuid:client config descriptor; 
40   uuid:HID report; value: 41    
41     uuid:HID report;  value:      ;  propertis:  
42       uuid:client config descriptor; 
43       uuid:client config descriptor;
44   uuid:HID report; value: 45    
45     uuid:HID report;  value:      ;  propertis:  
46       uuid:report reference descriptor; 
47       uuid:client config descriptor;
48   uuid:HID report; value: 49    
49     uuid:HID report;  value:      ;  propertis:  
50       uuid:client config descriptor; 
51        
..........        
自定義        

51-56  自定義服務1

57-59  自定義服務2

60-63 自定義服務3

handle 16 是secondary service  申明,暫未做解析

至此,GATT service discover 結束,所有handle的信息,均被被client 端知曉。

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