文章總列表

假日藍芽工程師: GATT protocol

假日工程師這次要介紹GATT protocol,這東西定義了兩個術語
  • Service (服務)
  • Characteristics (特徵 ?!)


其實就是上面這張圖,每個服務裡,會包含多個特徵。每個特徵會有一個property/value以及幾個descriptor。

Service
所有的Service會用UUID = 0x2800定義服務的起點。在之前的ATT protocol裡,滿足的handle是0x1/ 0x8/ 0x9/ 0x11/ 0x15。

    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

這些handle的數值是服務的UUID,代表這個服務是什麼。以handle[0x9]為例,0x180D正是心跳感應器。因為下一個UUID = 0x2800位在handle[0x11],所以心跳感應器所屬的handle[0x9~ 0x10]。

所以每個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)
  • 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
所以當我用運動紀錄器連上心跳帶時,手機實際上做了這些事...
  1. 手機對BLE裝置搜尋UUID = 0x2800,之後手機就知道BLE裝置提供的服務,以及每個服務對應的handles[]區間。
  2. 每個服務的handle[]區間裡,搜尋UUID = 0x2803就能找到服務的characteristic,找到他們的handle-index, property (UUID)和value。
  3. 手機接著能讀寫這些characteristics和BLE裝置通訊。
  4. 有些handle是notification/ indication,手機還要找到UUID = 0x2902的handle再去啟動notification(bit[0])或indication(bit[1])。
  5. 然後APP就能讀到心跳數值,顯示在畫面上

參考資料

留言

匿名表示…
台湾加油!!!

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

幼犬書桌椅選擇心得 升降桌 兒童桌椅

CANON G3000 廢墨瓶改裝