Android 4.0以后開(kāi)始引入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)兩部分轧拄。
- 有效數(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ù)組牡整。
下面就用一個(gè)具體的廣播來(lái)說(shuō)明下:
第一個(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)題的開(kāi)始)变骡,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)的字符串萨咳。
而廣播數(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 表示公開(kāi)地址驾茴,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) 公開(kāi)目標(biāo)地址:TYPE = 0x17验夯,表示希望這個(gè)廣播包被指定的目標(biāo)設(shè)備處理,此設(shè)備綁定了公開(kāi)地址摔刁,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)容自己定義。