對於低功耗藍牙而言,通常分爲兩種類型的設備:一種爲是Central devices(中心設備),一種是Peripheral devices(外圍設備)。中心設備通常爲手機或者Pad等設備,外圍設備通常爲手環,iBeacon等低功耗藍牙設備。外圍設備通常低功耗藍牙設備,時刻經過廣播向外發送數據包。只要在範圍內的中心設備都可以收到相關廣播。對於不瞭解低功耗藍牙的能夠閱讀個人文章:認識Bluetooth Low Energy數組
咱們上面提到了iBeacon,其實iBeacon是基於低功耗藍牙這項技術的。最先是蘋果公司在移動設備上配備了iBeacon的,經過iBeacon發送廣播數據,附近的設備能夠接收數據而後進行相關操做。舉個例子好比某些店鋪安裝了iBeacon設備,而後手機用戶通過店鋪就會收到店鋪促銷活動的相關消息。這類應用有不少。bash
完整數據包爲:廣播包(Advertising Data)和響應包(Scan Response Data),對於每一個低功耗設備而言,廣播包都是必須有的,而響應包是可選的。在前面的文章中咱們介紹過關於低功耗藍牙的相關東西,不熟悉的童鞋能夠閱讀認識Bluetooth Low Energy。每一個數據包格式以下圖:ide
注意:ui
bit:一個二進制數據0或者1;spa
1 byte = 8 bit.net
1 octets: 8 bit數組串;code
iBeacon設備就是低功耗藍牙的一種,它特有的參數,請閱讀:iBeacon參數。cdn
在上一篇文章中,咱們進行了低功耗藍牙設備的掃描工做。不清楚藍牙掃描的能夠閱讀低功耗藍牙開發之設備掃描。當咱們開啓藍牙掃描以後,會在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
}複製代碼
等;
下面咱們針對低功耗藍牙的主要參數進行解析:
數據來源:ScanRecord;
經過ScanRecord獲取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]複製代碼
將上述數據轉化成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複製代碼
(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進行解析的。
到這裏就基本結束了,總的而言若是是自產設備,能夠在響應包里根據業務需求添加須要的信息。