一、IBeacon的原理
iBeacon的工作是基于Android的低功耗蓝牙BLE,和蓝牙不同的是iBeacon不用配对和连接过程,iBeacon基站通过BLE蓝牙的广播频道不断向外发送位置信息,当智能设备进入设定区域时,不需要连接就能够收到信号,只要满足iBeacon技术标准的都可以使用。IBeacon可以通过rssi来判断设备与基站的距离,用于室内的定位、微信签到等场景。
发射端通过BLE的广告通信信道,以一定时间间隔向外广播数据包,当某个监听设备监听到这个广播数据的时候,就好发送 Scan Response Request,请求广播发送方发送扫描响应数据。这两部分数据的长度都是固定的 31 字节。在 Android 中,系统会把这两个数据拼接在一起,返回一个 62 字节的数组。
iBeacon的核心组成:
- UUID:厂商识别号
- Major:相当于群组号,同一个组里Beacon有相同的Major
- Minor:相当于识别群组里单个的Beacon
- TX Power:用于测量设备离Beacon的距离,目前只定义了大概的3个粗略级别10里面内,一米内,一米外。
UUID+Major+Minor就构成了一个Beacon的识别号,有点类似于网络中的IP地址。可以根据TX Power和rssi等信息通过算法计算出定位信息。
iBeacon中一般有两个角色:
- 基站/从机/外围设备(peripheral),发射端
- 手机/主机/中心设备(central),接收者
下面分为两个部分,分别介绍:
二、发射广播信号的IBeacon
1、设置广播参数
public AdvertiseSettings createAdvertiseSettings(boolean isConnect, int timeoutMillis) {
return new AdvertiseSettings.Builder()
.setConnectable(isConnect)
.setTimeout(timeoutMillis)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
.build();
}
(1)setTxPowerLevel:
- ADVERTISE_TX_POWER_LOW:低功率
- ADVERTISE_TX_POWER_MEDIUM:中等功率
- ADVERTISE_TX_POWER_HIGH:高功率,功率越高越耗性能
(2)setAdvertiseMode:
- ADVERTISE_MODE_LOW_LATENCY :在低延迟、高功率模式下执行蓝牙 LE 广告
- ADVERTISE_MODE_LOW_POWER :在低功耗模式下执行蓝牙 LE 广告
- ADVERTISE_MODE_BALANCED :在平衡功率模式下执行蓝牙 LE 广告。
(3)setTimeout:
默认0表示用不超时,最大超时时间180秒,如果设置时间超过180秒则会抛出异常。
(4)setConnectable:
是否运行设备自动连接。
2、设置广播数据
private AdvertiseData createAdvertiseData(String beaconUuid) {
AdvertiseData.Builder builder = new AdvertiseData.Builder()
//广播服务的UUID
//.addServiceUuid(parcelUuid)
//添加服务数据UUID和服务数据
//.addServiceData(parcelUuid, "ee1".getBytes())
//添加制造商ID和数据
.addManufacturerData(176, mManufacturerData.array());
//广播是否包含设备名
// .setIncludeDeviceName(true)
//广播是否包含发射功率等级
//.setIncludeTxPowerLevel(true);
return builder.build();
}
(1)设置广播服务的UUID
private static final String BEACON_UUID = "0000180d-0000-1000-8000-00805f9b34fb";
ParcelUuid parcelUuid = ParcelUuid.fromString(BEACON_UUID);
.addServiceUuid(parcelUuid)
addServiceUuid:设置了该参数,就可以在startScan的onScanResult中通过result.getScanRecord().getServiceUuids()获取到,否则为null。
这块的UUID是设备厂家设置的UUID信息。
(2)添加服务数据UUID和服务数据
.addServiceData(parcelUuid, "ee1".getBytes())

本文详细介绍了iBeacon的工作原理,包括其基于BLE的广播方式、核心组件如UUID、Major、Minor和TXPower。同时,文章阐述了在Android中设置和解析iBeacon广播数据的步骤,包括广告参数、广播数据设置、制造商ID和数据填充,并提供了发射和接收端的代码示例。此外,还提到了接收端所需的权限和数据解析方法。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



