Android IBeacon

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

一、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())

  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值