假日藍芽工程師: GATT protocol
假日工程師這次要介紹GATT protocol,這東西定義了兩個術語
- Service (服務)
- Characteristics (特徵 ?!)
Service
所有的Service會用UUID = 0x2800定義服務的起點。在之前的ATT protocol裡,滿足的handle是0x1/ 0x8/ 0x9/ 0x11/ 0x15。
handle: 0x0001, uuid: 2800 1800, Generic access
這些handle的數值是服務的UUID,代表這個服務是什麼。以handle[0x9]為例,0x180D正是心跳感應器。因為下一個UUID = 0x2800位在handle[0x11],所以心跳感應器所屬的handle[0x9~ 0x10]。
所以每個BLE裝置,只要找UUID = 0x2800就可以找到所有的services,而且同步可以確定所屬的handle區間。
handle: 0x0001, uuid: 2800 1800, Generic access
handle: 0x0008, uuid: 2800 1801, Generic attributes
handle: 0x0009, uuid: 2800 180D, Heart Rate
handle: 0x0011, uuid: 2800 180F, Battery Service
handle: 0x0015, uuid: 2800 180A, Device Information
所以每個BLE裝置,只要找UUID = 0x2800就可以找到所有的services,而且同步可以確定所屬的handle區間。
Characteristic
在每個Service理,有另外一個分隔線UUID = 0x2803定義characteristics (特徵?)。聰明機知道Heart rate service位在handle[0x9 ~ 0x10],接下來在這個區間搜尋UUID = 0x2803就可以定位所有的Characteristics。在我們的心跳表範例,會找到三枚handle[0xA/ 0xD/ 0xF]。
handle: 0x0009, uuid: 2800 180D, Heart Rate
handle: 0x000a, uuid: 2803 10 000b 2a37
handle: 0x000b, uuid: 2a37 Heart rate measurement, only notify (*)
handle: 0x000c, uuid: 2902 Control channel
handle: 0x000d, uuid: 2803 02 000e 2a38
handle: 0x000e, uuid: 2a38 01, chest
handle: 0x000f, uuid: 2803 08 0010 2a39
handle: 0x0010, uuid: 2a39 Heart rate control point
手機接著讀Handle[0xD],讀到02 000E 2A38,請參考下面條列式的解析。接下來手機就知道去讀handle[0xE],看這條心跳帶裝在哪個地方 (0x2A38)
手機接著讀Handle[0xD],讀到02 000E 2A38,請參考下面條列式的解析。接下來手機就知道去讀handle[0xE],看這條心跳帶裝在哪個地方 (0x2A38)
- Permission, 0x2,read only
- Property is at handle[0xE]
- Property's UUID is 0x2A38
Handle[0xA]的資料是10 000B 2A37。Permission 0x10代表notification-only (通知)。所以直接去讀handle[0xB]心跳表示不會理你的。這個characteristic還有另外一個handle[0xC],這就是文章一開始圖片裡的descriptor。在這個範例裡,他的UUID = 0x2902,是所謂的CCC (Client Characteristic Configuration)
- [bit0] enable/disable notification
- [bit1] enable/disable indication
主控端寫入0x1啟動notification的功能。之後心跳表就會送出notification (心跳值)給手機。Notification這個字在藍芽通訊協定裡,代表手機可以不回應裝置。另外一個對應的詞彙叫indication,這種場景主控端就得回復BLE裝置。
BLE Master Device Summary
所以當我用運動紀錄器連上心跳帶時,手機實際上做了這些事...
- 手機對BLE裝置搜尋UUID = 0x2800,之後手機就知道BLE裝置提供的服務,以及每個服務對應的handles[]區間。
- 每個服務的handle[]區間裡,搜尋UUID = 0x2803就能找到服務的characteristic,找到他們的handle-index, property (UUID)和value。
- 手機接著能讀寫這些characteristics和BLE裝置通訊。
- 有些handle是notification/ indication,手機還要找到UUID = 0x2902的handle再去啟動notification(bit[0])或indication(bit[1])。
- 然後APP就能讀到心跳數值,顯示在畫面上
參考資料
留言