1. 程式人生 > >藍芽學習筆記之例項廣播資料的解析

藍芽學習筆記之例項廣播資料的解析

轉載自:
https://blog.csdn.net/sinat_23338865/article/details/52170581

BLE 裝置工作的第一步就是向外廣播資料。廣播資料中帶有裝置相關的資訊。

本文主要說一下 BLE 的廣播中的資料的規範以及廣播包的解析,這是我們專案中的廣播資料,實際操作廣播資料在程式廣播初始化函式中,根據自己的需要定義廣播型別和廣播資料。

廣播模式
BLE 中有兩種角色 Central 和 Peripheral ,也就是中心裝置和外圍裝置。中心裝置可以主動連線外圍裝置,外圍裝置傳送廣播或者被中心裝置連線。外圍通過廣播被中心裝置發現,廣播中帶有外圍裝置自身的相關資訊。

廣播包有兩種: 

廣播包 (Advertising Data)和 響應包 (Scan Response),其中廣播包是每個裝置必須廣播的,而響應包是可選的。

資料包的格式如下圖所示(圖片來自官方 Spec):每個包都是 31 位元組,資料包中分為有效資料(significant)和無效資料(non-significant)兩部分。

有效資料部分 :包含若干個廣播資料單元,稱為 AD Structure 。如圖中所示,AD Structure 的組成是:第一個位元組是長度值 Len ,表示接下來的 Len 個位元組是資料部分。資料部分的第一個位元組表示資料的型別 AD Type ,剩下的 Len - 1 個位元組是真正的資料 AD data 。其中 AD type 非常關鍵,決定了 AD Data 的資料代表的是什麼和怎麼解析,這個在後面會詳細講;
無效資料部分 :因為廣播包的長度必須是 31 個 byte,如果有效資料部分不到 31 自己,剩下的就用 0 補全。這部分的資料是無效的,解釋的時候,忽略即可。
廣播資料格式
所有的 AD type 的定義 如下型別:

Flags: TYPE = 0x01

這個資料用來標識裝置 LE 物理連線的功能。DATA 是 0 到多個位元組的 Flag 值,每個 bit 上用 0 或者 1 來表示是否為 True。如果有任何一個 bit 不為 0,並且廣播包是可連線的,就必須包含此資料。各 bit 的定義如下:

bit 0: LE 有限發現模式
bit 1: LE 普通發現模式
bit 2: 不支援 BR/EDR
bit 3: 對 Same Device Capable(Controller) 同時支援 BLE 和 BR/EDR
bit 4: 對 Same Device Capable(Host) 同時支援 BLE 和 BR/EDR
bit 5..7: 預留
特別注意的是 : 這裡我們發現我們的廣播資料為0x06,其實就是我們程式設計廣播模式flag:
flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;      


Service UUID: 廣播資料中一般都會把裝置支援的 GATT Service 廣播出來,用來告訴外面本裝置所支援的 Service。有三種類型的 UUID:16 bit, 32bit, 128 bit。廣播中,每種型別型別有有兩個類別:完整和非完整的。

這樣就共有 6 種 AD Type。

非完整的 16 bit UUID 列表: TYPE = 0x02;

完整的 16 bit UUID 列表: TYPE = 0x03;

非完整的 32 bit UUID 列表: TYPE = 0x04;

完整的 32 bit UUID 列表: TYPE = 0x05;

非完整的 128 bit UUID 列表: TYPE = 0x06;

完整的 128 bit UUID 列表: TYPE = 0x07;
Local Name: 裝置名字,DATA 是名字的字串。 Local Name 可以是裝置的全名,也可以是裝置名字的縮寫,其中縮寫必須是全名的前面的若干字元。裝置全名: TYPE = 0x08

裝置簡稱: TYPE = 0x09
TX Power Level: TYPE = 0x0A,表示裝置傳送廣播包的訊號強度。DATA 部分是一個位元組,表示 -127 到 + 127 dBm。

帶外安全管理(Security Manager Out of Band):TYPE = 0x11。DATA 也是 Flag,每個 bit 表示一個功能:

bit 0: OOB Flag,0 表示沒有 OOB 資料,1 表示有bit 1: 支援 LEbit 2: 對 Same Device Capable(Host) 同時支援 BLE 和 BR/EDRbit 3: 地址型別,0 表示公開地址,1 表示隨機地址
外設(Slave)連線間隔範圍:TYPE = 0x12。資料中定義了 Slave 最大和最小連線間隔,資料包含 4 個位元組:

前 2 位元組:定義最小連線間隔,取值範圍:0x0006 ~ 0x0C80,而 0xFFFF 表示未定義;後 2 位元組:定義最大連線間隔,同上,不過需要保證最大連線間隔大於或者等於最小連線間隔。
服務搜尋:外圍裝置可以要請中心裝置提供相應的 Service。其資料定義和前面的 Service UUID 類似:

16 bit UUID 列表: TYPE = 0x14

32 bit UUID 列表: TYPE = 0x??

128 bit UUID 列表: TYPE = 0x15
Service Data: Service 對應的資料。

16 bit UUID Service: TYPE = 0x16, 前 2 位元組是 UUID,後面是 Service 的資料;32 bit UUID Service: TYPE = 0x??, 前 4 位元組是 UUID,後面是 Service 的資料;128 bit UUID Service: TYPE = 0x??, 前 16 位元組是 UUID,後面是 Service 的資料;
公開目標地址:TYPE = 0x17,表示希望這個廣播包被指定的目標裝置處理,此裝置綁定了公開地址,DATA 是目標地址列表,每個地址 6 位元組。

隨機目標地址:TYPE = 0x18,定義和前一個類似,表示希望這個廣播包被指定的目標裝置處理,此裝置綁定了隨機地址,DATA 是目標地址列表,每個地址 6 位元組。

Appearance:TYPE = 0x19,DATA 是表示了裝置的外觀。

廠商自定義資料: TYPE = 0xFF,廠商自定義的資料中,前兩個位元組表示廠商 ID,剩下的是廠商自己按照需求新增,裡面的資料內容自己定義,我們的程式在這塊添加了mac地址。

還有一些其他的資料,用的不多大家需要可以查閱核心手冊。