您的位置:首页 > 移动开发 > IOS开发

IOS7 iBeacons探寻

2016-04-21 10:59 435 查看
最近在学习iBeacons发现这个东西很有潜力,能够改善未来我们生活中的很多用户体验。iBeacons 是IOS7系统最新推出的一个类似于RFID的微定位技术。利用蓝牙4.0(低功耗蓝牙)进行数据传输(iphone 4s 以上设备)。手持设备能够在一定的范围内(可以达到50m之内)收到IBecons基站发送的信号。任何实现了IBeacon协议的蓝牙设备都可以充当ibeacon基站使用。不同其它利用GPS,蜂窝数据等的定位方式。蓝牙4.0本身的成本低,设备的耗电量也低所以相比其它定位方式有自己的优势。并且这种定位直接是端对端的直接定位,省去了GPS的卫星和蜂窝数据的基站通信,是对现有定位技术的一个有效的补充,有其利用的独特的场景和价值。
iBeacons开发

Beacon Broadcasting

所有支持蓝牙4.0的iDevice都能够作为beacon基站发射信号,这就需要 CoreBluetooth.framework 的支持。 我们需要创建一个CBPeripheralManager实例,然后发射beacon广播信号:

一个beacon基站主要有三个属性,即上面说到过的:proximityUUID、 major、 minor,对应到CoreLocation中的CLBeacon类:

[html] view
plaincopy





@interface CLBeacon : NSObject <NSCopying, NSSecureCoding>

//...

@property (readonly, nonatomic) NSUUID *proximityUUID;

@property (readonly, nonatomic) NSNumber *major;

@property (readonly, nonatomic) NSNumber *minor;

//...

@end

//为beacon基站创建一个唯一标示

[html] view
plaincopy





time_t t;
srand((unsigned) time(&t));
CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:self.beaconRegion.proximityUUID
major:rand()
minor:rand()
identifier:self.beaconRegion.identifier];

proximityUUID :对于每个公司这个是唯一的。对于该公司的所有的ibeacons都有相同的UUID。
major:相关的一系列ibeacons的标示。
minor:某个特殊的ibeacon的标示。
identifier:该beacons区域的唯一标示。
举个例子:一个展览公司A,和一个展览公司B会有不同的proximityUUID,展览公司A在地址C和地址D有不同的展览馆,那么他们就有不同的major值。对于地址C的展览馆里面的不同楼层有会有不同的minor值。所以我们可以根据proximityUUID,major,minor三个值唯一确定一个ibeacon。

//获取该Beacon区域的信号信息

[html] view
plaincopy





NSDictionary *peripheralData = [region peripheralDataWithMeasuredPower:nil];

//创建并广播Beacon信号

[html] view
plaincopy





CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];

[peripheralManager startAdvertising:peripheralData];

当然你还需要在CBPeripheralManagerDelegate代理方法:peripheralManagerDidUpdateState:根据不同的状态做一些处理。

Beacon Monitoring

苹果将iBeacons相关的接口放到了 CoreLocation.framework 。在iOS7之前,我们可以通过CLRegion定义一个地理区域,来跟踪设备在该区域内的运动情况,iOS7之后,CLRegion被完全变成了一个抽象类,子类CLCircularRegion和CLBeaconRegion分别承担实现一个地理区域和Beacon信号区域的功能。

即iOS7之后的CLRegion主要有两个属性:

[html] view
plaincopy





@interface CLRegion : NSObject <NSCopying, NSSecureCoding>

@property (nonatomic, assign) BOOL notifyOnEntry;

@property (nonatomic, assign) BOOL notifyOnExit;

@end

notifyOnEntry和notifyOnExit分别标记是否在进入和退出该区域时调用对用代理方法。CLBeaconRegion另外增加了一个属性notifyEntryStateOnDisplay标记是否在用户手机屏幕点亮时调用代理方法。

创建一个 CLBeaconRegion ,我们需要先创建一个目标监控区域唯一的UUID(该UUID需要跟之前基站的UUID一致):

[html] view
plaincopy





CLBeaconRegion *targetBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:
self.beaconRegion.proximityUUID
identifier:self.beaconRegion.identifier];

创建完Regoin后,我们需要对该Region进行监控以获取是否进入该区域及一些距离等信息,我们需要创建一个CLLocationManager实例然后调用startMonitoringForRegion:方法来监控上面的BeaconRegion:

[html] view
plaincopy





self.locationManager = [[CLLocationManager alloc] init];

self.locationManager.delegate = self;

[self.locationManager startMonitoringForRegion:targetBeaconRegion];

剩下的就是通过CLLocationManagerDelegate中的各个方法来获取监控区域内的所有CLBeacon基站,进入或退出某个Beacon区域,计算举例某个CLBeacon的距离等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: