【藍牙BLE】 UUID 解釋說明
一,什么是 UUID
UUID 可以簡單理解為編號,唯一的編號,用于區分不同的個體。服務和特性都有各自的UUID。比如經典的9527。UUID 就跟身份證一樣,不管是你是局長還是科長,人人都有身份證。
這里的 Read, Notify,Write_Without_Response為該Characteristic
UUID所具有的屬性
二、 服務(Service) UUID
服務(Service)可以理解為組長,一個組里面至少有一個或多個特性(Characteristic),特性(Characteristic)可以理解為組員。不同的服務(Service)應該有不同的編號(UUID),用以區分不同的服務(Service)。
我是重案組總督察黃啟發, 這里已經被包圍了, 限你三分鐘之內投降,這里的黃Sir就是組長,組長一般是不干活的,真正干活的是組員(特性),比如談判專家、拆彈專家和飛虎隊。
三,特性(Characteristic)UUID
特性(Characteristic)是依附于某個服務(Service)的,可以理解為組員,每個組員至少要有一個編號(UUID)以及一個或多個屬性(Property)每個特性(Characteristic)可以同時有一個或多個屬性。
就比如 119 不光可以救火,像忘帶鑰匙打不開門,工頭不發工資站到樓頂上想不開等等119都可以幫忙,這就是混合屬性, 當然了,“Fire inthe hole”人家119 不管。
四,屬性(Property)
屬性的概念非常好理解,在此不多闡述,只是簡單描述一下,借用古詩一首:
文能提筆安天下,武能上馬定乾坤,上炕認識媳婦,下炕認識鞋。
常用的屬性有如下幾個,我們以手機和藍牙模塊進行通訊來舉栗說明:
Read: 讀屬性,具有該屬性的UUID 是可讀的,也就是說這個屬性允許手機來讀取一些信息。手機可以發送這個指令來讀取某個具有讀屬性UUID的信息。
Notify: 通知屬性, 具有該屬性的 UUID是可以發送通知的,也就是說具有這個屬性的特性(Characteristic)可以主動發送信息給手機。
Write: 寫屬性, 具體該屬性的 UUID 是可以接收寫入數據的。通常手機發送數據給藍模塊就是通過這個屬性完成的。這個屬性在Write 完成后,會發送寫入完成結果給手機,然后手機再可以寫入下一包,這個屬性在寫入一包數據后,需要等待應用層返回寫入結果,速度比較慢。
WriteWithout Response:寫屬性,從字面意思上看,只是寫,不需要返回寫的結果,這個屬性的特點是不需要應用層返回,完全依靠協議層完成,速度快,但是寫入速度超過協議處理速度的時候,會丟包。
看到這里,相信在這篇文章開始處列出的華茂模塊的UUID 信息就一目了然了,扛把子(服務)是0xFFE0, 小弟只有一個(特性)是0xFFE1,小弟(特性)0xFFE1同時具有讀、通知、不需要返回結果的寫屬性。順道辟個謠,有些人認為用一個UUID 來讀寫會造成沖突,其實并不是這樣,多個屬性集合到一體是可以的,藍牙協議是允許這么做的。
藍牙廣播中對服務 UUID 格式定義都有三種 16 bit UUID、32 bit UUID、128 bit UUID。
但是熟悉安卓開發的小伙伴都知道接口都 UUID 格式,fromString 時候 16bit 的 UUID 該咋辦呢?
16bit 和 32bit 的 UUID 與 128bit 的值之間轉換關系:
128_bit_UUID = 16_bit_UUID * 2^96 + Bluetooth_Base_UUID
128_bit_UUID = 32_bit_UUID * 2^96 + Bluetooth_Base_UUID
其中 Bluetooth_Base_UUID 定義為 00000000-0000-1000-8000-00805F9B34FB
如果你想說這是啥呀,那我這樣說你應該可以明白點:
若 16 bit UUID為xxxx,那么 128 bit UUID 為 0000xxxx-0000-1000-8000-00805F9B34FB
若 32 bit UUID為xxxxxxxx,那么 128 bit UUID 為 xxxxxxxx-0000-1000-8000-00805F9B34FB