BluetoothLe廣播數據解析

1、前言

對於低功耗藍牙而言,通常分爲兩種類型的設備:一種爲是Central devices(中心設備),一種是Peripheral devices(外圍設備)。中心設備通常爲手機或者Pad等設備,外圍設備通常爲手環,iBeacon等低功耗藍牙設備。外圍設備通常低功耗藍牙設備,時刻經過廣播向外發送數據包。只要在範圍內的中心設備都可以收到相關廣播。對於不瞭解低功耗藍牙的能夠閱讀個人文章:認識Bluetooth Low Energy數組

2、認識iBeacon

咱們上面提到了iBeacon,其實iBeacon是基於低功耗藍牙這項技術的。最先是蘋果公司在移動設備上配備了iBeacon的,經過iBeacon發送廣播數據,附近的設備能夠接收數據而後進行相關操做。舉個例子好比某些店鋪安裝了iBeacon設備,而後手機用戶通過店鋪就會收到店鋪促銷活動的相關消息。這類應用有不少。bash

1.iBeacon的特色

  • 時刻發送廣播數據包;
  • 通常不可鏈接;
  • 短距離傳輸,通常能達到50~80m;
  • 信號強度和廣播距離會受到周圍環境的干擾;
  • 能夠經過信號強度(RSSI)粗略計算位置信息;

2.低功耗藍牙的數據格式

完整數據包爲:廣播包(Advertising Data)和響應包(Scan Response Data),對於每一個低功耗設備而言,廣播包都是必須有的,而響應包是可選的。在前面的文章中咱們介紹過關於低功耗藍牙的相關東西,不熟悉的童鞋能夠閱讀認識Bluetooth Low Energy。每一個數據包格式以下圖:ide

​​

  • 每一個數據包都包含31個字節,通常都包含有效數據(Significant part)部分和無效數據部分(Non-sinificant part);
  • 有效數據部分:包含若干個廣播數據單元,如圖所示,稱爲AD Structure。其中每一個數據單元都是Length+Data的格式,Length是一個字節的長度,Data包含AD Type+AD Data,數據長度爲Length。AD Type是該數據單元所表明的數據類型,爲一個字節;AD Data是該數據單元真正應該解析的數據部分,數據長度爲Length-1。數據解析部分會在後面詳細介紹;
  • 無效數據部分:如有效數據不足31個字節,無效數據會用0進行補位;

注意:ui

bit:一個二進制數據0或者1;spa

1 byte = 8 bit.net

1 octets: 8 bit數組串;code

3.iBeacon數據格式

iBeacon設備就是低功耗藍牙的一種,它特有的參數,請閱讀:iBeacon參數。cdn

3、解析廣播數據

在上一篇文章中,咱們進行了低功耗藍牙設備的掃描工做。不清楚藍牙掃描的能夠閱讀低功耗藍牙開發之設備掃描。當咱們開啓藍牙掃描以後,會在ScanCallback的onScanResult方法中回調掃描到的低功耗藍牙設備。在這個回調方法裏第一個參數是callbackType,是在開始掃描的時候設置的回調類型;第二個參數是ScanResult,裏面包含了掃描到設備的信息。blog

咱們在這裏使用雲裏物裏這個設備廠商的iBeacon設備做爲分析示例,打印一下ScanResult這個參數會發現:ip

ScanResult{

            device=C2:00:F4:00:00:4E,

            scanRecord=ScanRecord [mAdvertiseFlags=6,

                                   mServiceUuids=null,

                                   mManufacturerSpecificData={76=[2, 21, -30, -59, 109, -75, -33, -5, 72, -46, -80, 96, -48, -11, -89, 16, -106, -32, 39, 17, 76, -70, -59]},

                                   mServiceData={0000fff0-0000-1000-8000-00805f9b34fb=[100, 39, 17, 76, -70]},

                                   mTxPowerLevel=4,

                                   mDeviceName=MiniBeacon_00001],

            rssi=-70,

            timestampNanos=214956467801851,

            eventType=27,

            primaryPhy=1,

            secondaryPhy=0,

            advertisingSid=255,

            txPower=127,

            periodicAdvertisingInterval=0

            }複製代碼
咱們分析一下能從這個回調裏拿到什麼參數:
  • BluetoothDevice:遠程藍牙設備的一些信息,包含設備名,設備MAC地址,藍牙設備類型等信息;
  • ScanRecord:低功耗藍牙的掃描結果的原始信息,包含藍牙的Flags,ManufacturerSpecificData,ServiceData,Tx Power Level(廣播功率)等;
  • Rssi:實時信號強度;
  • TimestampNanos:自設備Boot爲標準得到的該藍牙設備掃描到的時間戳;

等;

下面咱們針對低功耗藍牙的主要參數進行解析:

1.解析iBeacon數據:

數據來源:ScanRecord;

經過ScanRecord獲取Byte數組便可獲取16進制Byte數組:

  • 16進制Byte數組:
//廣播包數據

[2, 1, 6, 26, -1, 76, 0, 2, 21,#iBeacon advertising prefix(9)

 -30, -59, 109, -75, -33, -5, 72, -46, -80, 96, -48, -11, -89, 16, -106, -32,# iBeacon profile serviceUuid(16)

 39, 17,#major(2)

 76, -70,#minor(2)

 -59,#txPower 表示距離1米是應該接收到的信號強度,可用於計算距離(1)


//響應包數據

 2, 10, 4, #Tx Power Level

 8, 22, -16, -1, 100, 39, 17, 76, -70,#Service Data

 17, 9, 77, 105, 110, 105, 66, 101, 97, 99, 111, 110, 95, 48, 48, 48, 50, 55,#Complete Local Name

 0, 0]複製代碼
有些心細的童鞋可能會發想上面的廣播包和響應包不是31個字節啊!??具體爲何我也沒有深究過,經過ScanRecord獲取字節數組就獲得上面的結果,有多是Android系統作了特殊的處理。你們能夠發表一下本身的看法!不勝感激~
  • 16進制HexString:

將上述數據轉化成Hexadecimal Value(十六進制),爲何須要轉化爲十進制呢?一方面是行業習慣,另外一方面是方便查找AD type作數據解析。

//廣播報數據

02 01 06 1A FF 4C 00 02 15 #iBeacon advertising prefix(9)

E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0 # iBeacon profile serviceUuid(16)

27 11 #major(2)

4C BA #minor(2)

C5 #txPower 表示距離1米是應該接收到的信號強度,可用於計算距離(1)


//響應包數據

02 0A 04 #Tx Power Level

08 16 F0 FF 64 27 11 4C BA #Service Data

11 09 4D 69 6E 69 42 65 61 63 6F 6E 5F 30 30 30 32 37 #Complete Local Name

00 00複製代碼
  • 按照GAP(藍牙接入規範)解析

(1)《Flags》(02 01 06)-3

0 2

len:02 type:01 value:06(3)

##以value爲06(HexString)爲例

獲取value的各bit位數據:0000 0110

解析結果:LE普通發現模式;不支持BR/EDR

##解析規則:各位值爲1

bit 0: LE有限發現模式 (LELimitDiscoverable)

bit 1: LE普通發現模式 (LEGeneralDiscoverable)

bit 2: 不支持BR/EDR (BrEdrNotSupported)

bit 3: 對Same Device Capable(Controller)同時支持BLE和BR/EDR(LEAndBrEdrCapable(Controller))

bit 4: 對Same Device Capable(Host)同時支持BLE和BR/EDR(LEAndBrEdrCapable(Host))

bit 5..7: 預留

(2)《Manufacturer Specific Data》(1A FF 4C 00 02 15 E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0 27 11 4C BA C5)-27

3 4 5 29

len:1A(26) type:FF value:4C 00 02 15 E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0 27 11 4C BA C5 (5-29)

##Company identifier code (0x004C == Apple)

02 Byte 0 of iBeacon advertisement indicator

15 Byte 1 of iBeacon advertisement indicator

27 11 #major(2)

4C BA #minor(2)

C5 #txPower 表示距離1米是應該接收到的信號強度

(3)《Tx Power Level》(02 0A 00)-3

30 31 32

len:02 type:0A value:04(3)

(4)《Service Data》(08 16 F0 FF 64 27 11 4C BA)-09

33 34 35 41

len:08 type:16 value:F0 FF 64 27 11 4C BA

(5)《Complete Local Name》(11 09 4D 69 6E 69 42 65 61 63 6F 6E 5F 30 30 30 32 37)-18

len:11(17) type:09 value:4D 69 6E 69 42 65 61 63 6F 6E 5F 30 30 30 32 37

上面這些參數都是基於Generic Access Profile和Bluetooth Core Specification v4.0進行解析的。

2.設備基本參數:

  • Name(設備名):來源BluetoothDevice-device.getName();
  • Address(Mac地址):來源BluetoothDevice-device.getAddress();
  • Device Type(藍牙類型):來源BluetoothDevice-device.getType();
  • BondState(綁定狀態):來源BluetoothDevice-device.getBondState();
  • Rssi(實時信號強度):來源ScanResult-result.getRssi();
  • Tx Power Level(發射功率等級):來源ScanRecord-record.getTxPowerLevel()或經過響應包數據解析獲得,類型爲:0x0A;
  • Flags(藍牙的特性):經過解析ManufacturerSpecificData獲取,類型爲:0x01;
  • Manufacturer Specific Data(製造商特定數據):經過ManufacturerSpecificData獲取,類型爲:0xFF。能夠獲取低功耗藍牙設備的公司識別碼,(iBeacon)設備的UUID,Major,Minor,Rssi at 1m(廣播校驗值)在此處解析;
  • ServiceData(響應包數據):經過ScanRecord獲取,類型:0x16,能夠獲取ServiceData的UUID和附加數據等;

到這裏就基本結束了,總的而言若是是自產設備,能夠在響應包里根據業務需求添加須要的信息。

相關文章
相關標籤/搜索