1.關於服務與特徵值的簡述 數組
以前說到藍牙的鏈接過程,那藍牙鏈接以後具體是如何傳數據的呢。這裏作一下簡要說明。 spa
藍牙4.0是以參數來進行數據傳輸的,即服務端定好一個參數,客戶端能夠對這個參數進行讀,寫,通知等操做,這個東西咱們稱之爲特徵值(characteristic), blog
但一個參數不夠咱們用,好比咱們這個特徵值是電量的值,另外一個特徵值是設備讀取的溫度值。 索引
那這時候會有多個特徵值,而且咱們還會對它們分類,分出來的類咱們稱之爲服務(service)。 ip
一個設備能夠有多個服務,每個服務能夠包含多個特徵值。爲了方便操做,每一個特徵值都有他的屬性,例如長度(size),權限(permission),值(value),描述(descriptor),以下圖。 it
2.ATT與GATT io
咱們剛纔介紹服務與特徵值,那具體咱們是怎麼去實現的呢. table
藍牙4.0版本推出了低功耗規範,引入了兩個核心協議:ATT(Attribute Protocol)和GATT(Generic Attribute Protocol).這兩個協議主要目標是BLE,可是也能夠運行在傳統藍牙上(BR/EDR)。 service
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字節