Android 藍(lán)牙廣播數(shù)據(jù)包分析

Android 4.0以后開始引入ble(低功耗藍(lán)牙),但是5.0之前的版本只支持手機(jī)做為中央設(shè)備(Central ),手機(jī)不能設(shè)置外設(shè)模式,
谷歌從5.0后才加入,而手機(jī)作為外設(shè)時(shí)需要發(fā)送廣播,中央設(shè)備掃描到才能進(jìn)行連接。那作為外設(shè)的設(shè)備其廣播數(shù)據(jù)是怎么樣構(gòu)成的?
藍(lán)牙的廣播包有兩種: 廣播包 (Advertising Data)和 響應(yīng)包 (Scan Response),其中廣播包是每個(gè)設(shè)備必須廣播的,而響應(yīng)包是可選的。
每個(gè)包都是 31 字節(jié),數(shù)據(jù)包中分為有效數(shù)據(jù)(significant)和無(wú)效數(shù)據(jù)(non-significant)兩部分。

  1. 有效數(shù)據(jù)部分 :包含若干個(gè)廣播數(shù)據(jù)單元,稱為 AD Structure 。AD Structure 的組成是:第一個(gè)字節(jié)是長(zhǎng)度值 Len ,表示接下來(lái)的 Len 個(gè)字節(jié)是數(shù)據(jù)部分。數(shù)據(jù)部分的第一個(gè)字節(jié)表示數(shù)據(jù)的類型 AD Type ,剩下的 Len - 1 個(gè)字節(jié)是真正的數(shù)據(jù) AD data 。其中 AD type 非常關(guān)鍵,決定了 AD Data 的數(shù)據(jù)代表的是什么和怎么解析。無(wú)效數(shù)據(jù)部分 :因?yàn)閺V播包的長(zhǎng)度必須是 31 個(gè) byte,如果有效數(shù)據(jù)部 分不到 31 自己,剩下的就用 0 補(bǔ)全。這部分的數(shù)據(jù)是無(wú)效的,解釋的時(shí)候,忽略即可。在 Android 中,系統(tǒng)會(huì)把這兩個(gè)數(shù)據(jù)拼接在一起,返回一個(gè) 62 字節(jié)的數(shù)組。
20161122143946_794.jpg

下面就用一個(gè)具體的廣播來(lái)說(shuō)明下:

QQ截圖20170801134726.png

第一個(gè) 字節(jié)代表廣播數(shù)據(jù)單元的長(zhǎng)度 ,02 轉(zhuǎn)為10進(jìn)制就是 2代表其數(shù)據(jù)長(zhǎng)度為2 , 而數(shù)據(jù)單元的第一個(gè)字節(jié)代表類型 。
01 代表 代表物理連接功能為普通發(fā)現(xiàn)模式 06代表其數(shù)據(jù)類容
緊接著下一個(gè)數(shù)據(jù)單元:0B代表數(shù)據(jù)長(zhǎng)度為11 ,數(shù)據(jù)類型為 02 即Serviceuuid代表是非完整的16bit uuid, 所以緊接著的后10位就是其uuid。接下來(lái)就是下一個(gè)數(shù)據(jù)單元 首位是13轉(zhuǎn)為二進(jìn)制就是19,其長(zhǎng)度就是19,類型就是09 ,代表設(shè)備名稱,30-》字符0,65代表字符e,61代表字符a,73代表字符s,79代表字符y,4E代表N,65代表e,57代表W,44代表D,43代表C,53代表S ,00 代表字符null,01代表字符soh(SOH是序始字符(Start Of Header),它表示標(biāo)題的開始),56代表V ,31代表字符1,2E代表字符.,30代表字符0,44代表D所有其設(shè)備名稱就是0easyNewDCS V1.0D。接下來(lái)的一個(gè)數(shù)據(jù)單元長(zhǎng)度是5,廣播類型12 連接間隔范圍,有四個(gè)字節(jié),接下來(lái)數(shù)據(jù)長(zhǎng)度是02,類型是0A代表信號(hào)強(qiáng)度 剩余都是00000都是補(bǔ)位的無(wú)效數(shù)據(jù)。

下面附帶 16進(jìn)制和10進(jìn)制轉(zhuǎn)換表和對(duì)應(yīng)的字符串。

QQ截圖20170801142956.png

而廣播數(shù)據(jù)類型 有以下這些:
(1)Flags: TYPE = 0x01。這個(gè)數(shù)據(jù)用來(lái)標(biāo)識(shí)設(shè)備 LE 物理連接的功能。DATA 是 0 到多個(gè)字節(jié)的 Flag 值,每個(gè) bit 上用 0 或者 1 來(lái)表示是否為 True。如果有任何一個(gè) bit 不為 0,并且廣播包是可連接的,就必須包含此數(shù)據(jù)。各 bit 的定義如下: bit 0: LE 有限發(fā)現(xiàn)模式 bit 1: LE 普通發(fā)現(xiàn)模式 bit 2: 不支持 BR/EDR bit 3: 對(duì) Same Device Capable(Controller) 同時(shí)支持 BLE 和 BR/EDR bit 4: 對(duì) Same Device Capable(Host) 同時(shí)支持 BLE 和 BR/EDR bit 5..7: 預(yù)留
(2)Service UUID: 廣播數(shù)據(jù)中一般都會(huì)把設(shè)備支持的 GATT Service 廣播出來(lái),用來(lái)告訴外面本設(shè)備所支持的 Service。有三種類型的 UUID:16 bit, 32bit, 128 bit。廣播中,每種類型類型有有兩個(gè)類別:完整和非完整的。這樣就共有 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;
(3) Local Name: 設(shè)備名字,DATA 是名字的字符串。 Local Name 可以是設(shè)備的全名,也可以是設(shè)備名字的縮寫,其中縮寫必須是全名的前面的若干字符。 設(shè)備全名: TYPE = 0x08 設(shè)備簡(jiǎn)稱: TYPE = 0x09
(4)TX Power Level: TYPE = 0x0A,表示設(shè)備發(fā)送廣播包的信號(hào)強(qiáng)度。DATA 部分是一個(gè)字節(jié),表示 -127 到 + 127 dBm。
(5) 帶外安全管理(Security Manager Out of Band):TYPE = 0x11。DATA 也是 Flag,每個(gè) bit 表示一個(gè)功能: bit 0: OOB Flag,0 表示沒(méi)有 OOB 數(shù)據(jù),1 表示有 bit 1: 支持 LE bit 2: 對(duì) Same Device Capable(Host) 同時(shí)支持 BLE 和 BR/EDR bit 3: 地址類型,0 表示公開地址,1 表示隨機(jī)地址 。
(6)外設(shè)(Slave)連接間隔范圍:TYPE = 0x12。數(shù)據(jù)中定義了 Slave 最大和最小連接間隔,數(shù)據(jù)包含 4 個(gè)字節(jié):
前 2 字節(jié):定義最小連接間隔,取值范圍:0x0006 ~ 0x0C80,而 0xFFFF 表示未定義; 后 2 字節(jié):定義最大連接間隔,同上,不過(guò)需要保證最大連接間隔大于或者等于最小連接間隔。
(7) 服務(wù)搜尋:外圍設(shè)備可以要請(qǐng)中心設(shè)備提供相應(yīng)的 Service。其數(shù)據(jù)定義和前面的 Service UUID 類似:
16 bit UUID 列表: TYPE = 0x14
32 bit UUID 列表: TYPE = 0x??
128 bit UUID 列表: TYPE = 0x15
(8) Service Data: Service 對(duì)應(yīng)的數(shù)據(jù)。
16 bit UUID Service: TYPE = 0x16, 前 2 字節(jié)是 UUID,后面是 Service 的數(shù)據(jù);
32 bit UUID Service: TYPE = 0x??, 前 4 字節(jié)是 UUID,后面是 Service 的數(shù)據(jù);
128 bit UUID Service: TYPE = 0x??, 前 16 字節(jié)是 UUID,后面是 Service 的數(shù)據(jù);
(9) 公開目標(biāo)地址:TYPE = 0x17,表示希望這個(gè)廣播包被指定的目標(biāo)設(shè)備處理,此設(shè)備綁定了公開地址,DATA 是目標(biāo)地址列表,每個(gè)地址 6 字節(jié)。
(10) 隨機(jī)目標(biāo)地址:TYPE = 0x18,定義和前一個(gè)類似,表示希望這個(gè)廣播包被指定的目標(biāo)設(shè)備處理,此設(shè)備綁定了隨機(jī)地址,DATA 是目標(biāo)地址列表,每個(gè)地址 6 字節(jié)。
(11) Appearance:TYPE = 0x19,DATA 是表示了設(shè)備的外觀。
(12) 廠商自定義數(shù)據(jù): TYPE = 0xFF,廠商自定義的數(shù)據(jù)中,前兩個(gè)字節(jié)表示廠商 ID,剩下的是廠商自己按照需求添加,里面的數(shù)據(jù)內(nèi)容自己定義。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言: 本文主要描述Android BLE的一些基礎(chǔ)知識(shí)及相關(guān)操作流程,不牽扯具體的業(yè)務(wù)實(shí)現(xiàn),其中提供了針對(duì)廣播包...
    幻影宇寰閱讀 5,583評(píng)論 6 19
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,296評(píng)論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • 簡(jiǎn)介 用簡(jiǎn)單的話來(lái)定義tcpdump,就是:dump the traffic on a network,根據(jù)使用者...
    保川閱讀 6,061評(píng)論 1 13
  • 今天接完老媽的電話,心情突然就變得很差,這種現(xiàn)象已經(jīng)持續(xù)有幾年了。相信大齡剩男剩女們應(yīng)該知道為什么,父母的催...
    野林閱讀 269評(píng)論 0 0

友情鏈接更多精彩內(nèi)容