本文摘自BLE4.0教程二 藍牙協議之服務與特征值分析 - Asam - 博客園 https://www.cnblogs.com/asam/p/8676369.html,僅用於自己學習查看,如果各位博客想看更詳細的內容,可以打開原博主的博客了解,這篇文章寫得很好的。
1.關於服務與特征值的簡述
之前說到藍牙的連接過程,那藍牙連接之后具體是如何傳數據的呢。這里做一下簡要說明。
藍牙4.0是以參數來進行數據傳輸的,即服務端定好一個參數,客戶端可以對這個參數進行讀,寫,通知等操作,這個東西我們稱之為特征值(characteristic),
但一個參數不夠我們用,比如我們這個特征值是電量的值,另一個特征值是設備讀取的溫度值。
那這時候會有多個特征值,並且我們還會對它們分類,分出來的類我們稱之為服務(service)。
一個設備可以有多個服務,每一個服務可以包含多個特征值。為了方便操作,每個特征值都有他的屬性,例如長度(size),權限(permission),值(value),描述(descriptor),如下圖。
2.ATT與GATT
我們剛才介紹服務與特征值,那具體我們是怎么去實現的呢.
藍牙4.0版本推出了低功耗規范,引入了兩個核心協議:ATT(Attribute Protocol)和GATT(Generic Attribute Protocol).這兩個協議主要目標是BLE,但是也可以運行在傳統藍牙上(BR/EDR)。
ATT主要是規定了"屬性"的定義,GATT則是將這些"屬性"包裝成我們上面所講的服務、特征值等。
那我們是怎么搭建起來我們的服務的呢?
大概可以概述為,由一個個屬性搭建起來的東西。如下圖,每一個屬性就會告訴使用者說,我是什么,我帶有什么,你能對我做什么,即描述,值,權限
序號 |
描述 |
權限 |
值 |
屬性1 |
我是 服務A的開頭 |
只讀 |
服務號0001 |
屬性2 |
我是 特征值1的開頭 |
只讀 |
特征值1的值放在屬性3里 特征值1的值類型 特征值1的值權限 |
屬性3 |
我是 特征值1的值 |
/ |
0 |
屬性4 |
我是 特征值1的特殊操作 |
讀寫 |
關閉 |
屬性5 |
我是 特征值2的開頭 |
只讀 |
… |
屬性6 |
我是 特征值2的值 |
/ |
… |
屬性7 |
我是 特征值2的特殊操作 |
讀寫 |
… |
屬性8 |
我是 服務B的開頭 |
只讀 |
服務號0002 |
上圖是一個簡單的表述,真正的屬性表如下圖。
Handle |
Type |
Permission |
Value |
… |
… |
… |
… |
39 |
0x2800 (GATT Primary Service UUID) |
Read |
E0:FF(2 bytes) (0xFFE0 = simple keys service custom UUID) |
40 |
0x2803 (GATT Characteristic Declaration UUID) |
Read |
10:29:00:E1:FF(5 byte) (0xFFE1 = Simple keys value custom UUID) (0x0029 = handle 41) (0x10 = characteristic properties :notify only) |
41 |
0xFFE1 (simple keys state) |
(none) |
00(1 byte) (value indicates states of keys) |
42 |
0x2902 (GATT Client Characteristic Configuration UUID) |
Read and Write |
00:00(2 byte) (value indicates whether notifications or indications are enabled) |
43 |
0x2800 (GATT Primary Service UUID) |
Read |
A1:DD(2 byte) (0xDDA1 = Other Service custom UUID) |
屬性的定義是這樣的
Handle |
Type |
Permission |
Value |
Handle: 其實上面那張屬性表,在程序里只是一個數組而已,所以Handle這個值其實我們是不需要專門去存的,他只是一個索引而已。
Type:屬性的類型,也即UUID ,藍牙標准組織已經對UUID進行了分類。
如上表中,服務的Type就是0X2800,所以每到一個服務,就會有一個Type類型為0x2800的屬性出現。
而特征值Declaration 的Type就是0x2803。至於特征值Value的Type可以是用戶自定義的。
Permission:屬性的訪問權限,一般有Read、Write、 notifications、 indications
Value:屬性的值 最長可達512字節