对于低功耗蓝牙而言,通常分为两种类型的设备:一种为是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进行解析的。
到这里就基本结束了,总的而言若是是自产设备,能够在响应包里根据业务需求添加须要的信息。