BLE 中有兩種角色 Central 和 Peripheral ,也就是中心設備和外圍設備。中心設備能夠主動鏈接外圍設備,外圍設備發送廣播或者被中心設備鏈接。外圍經過廣播被中心設備發現,廣播中帶有外圍設備自身的相關信息。
廣播包 (Advertising Data)和 響應包 (Scan Response),其中廣播包是每一個設備必須廣播的,而響應包是可選的。 數據包的格式以下圖所示(圖片來自官方 Spec):
每一個包都是 31 字節,數據包中分爲有效數據(significant)和無效數據(non-significant)兩部分。html
Len
個字節是數據部分。數據部分的第一個字節表示數據的類型
AD Type
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 能夠是設備的全名,也能夠是設備名字的縮寫,其中縮寫必須是全名的前面的若干字符。post
- 設備全名: TYPE = 0x08
- 設備簡稱: TYPE = 0x09
-
TX Power Level: TYPE = 0x0A,表示設備發送廣播包的信號強度。DATA 部分是一個字節,表示 -127 到 + 127 dBm。spa
-
帶外安全管理(Security Manager Out of Band):TYPE = 0x11。DATA 也是 Flag,每一個 bit 表示一個功能:設計
- bit 0: OOB Flag,0 表示沒有 OOB 數據,1 表示有
- bit 1: 支持 LE
- bit 2: 對 Same Device Capable(Host) 同時支持 BLE 和 BR/EDR
- bit 3: 地址類型,0 表示公開地址,1 表示隨機地址
-
外設(Slave)鏈接間隔範圍:TYPE = 0x12。數據中定義了 Slave 最大和最小鏈接間隔,數據包含 4 個字節:code
- 前 2 字節:定義最小鏈接間隔,取值範圍:0x0006 ~ 0x0C80,而 0xFFFF 表示未定義;
- 後 2 字節:定義最大鏈接間隔,同上,不過須要保證最大鏈接間隔大於或者等於最小鏈接間隔。
-
服務搜尋:外圍設備能夠要請中心設備提供相應的 Service。其數據定義和前面的 Service UUID 相似:htm
- 16 bit UUID 列表: TYPE = 0x14
- 32 bit UUID 列表: TYPE = 0x??
- 128 bit UUID 列表: TYPE = 0x15
-
Service Data: Service 對應的數據。blog
- 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 字節。ip
-
Appearance:TYPE = 0x19,DATA 是表示了設備的外觀。
-
廠商自定義數據: TYPE = 0xFF,廠商自定義的數據中,前兩個字節表示廠商 ID,剩下的是廠商本身按照需求添加,裏面的數據內容本身定義,咱們的程序在這塊添加了mac地址。
-
還有一些其餘的數據,用的很少你們須要能夠查閱核心手冊。