首页 > 代码库 > (转载)IOS7 iBeacons探寻
(转载)IOS7 iBeacons探寻
最近在学习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类:
- @interface CLBeacon : NSObject <NSCopying, NSSecureCoding>
- //...
- @property (readonly, nonatomic) NSUUID *proximityUUID;
- @property (readonly, nonatomic) NSNumber *major;
- @property (readonly, nonatomic) NSNumber *minor;
- //...
- @end
//为beacon基站创建一个唯一标示
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区域的信号信息
- NSDictionary *peripheralData = [region peripheralDataWithMeasuredPower:nil];
- //创建并广播Beacon信号
- 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主要有两个属性:
- @interface CLRegion : NSObject <NSCopying, NSSecureCoding>
- @property (nonatomic, assign) BOOL notifyOnEntry;
- @property (nonatomic, assign) BOOL notifyOnExit;
- @end
notifyOnEntry和notifyOnExit分别标记是否在进入和退出该区域时调用对用代理方法。CLBeaconRegion另外增加了一个属性notifyEntryStateOnDisplay标记是否在用户手机屏幕点亮时调用代理方法。
创建一个 CLBeaconRegion ,我们需要先创建一个目标监控区域唯一的UUID(该UUID需要跟之前基站的UUID一致):
- CLBeaconRegion *targetBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:
self.beaconRegion.proximityUUID
identifier:self.beaconRegion.identifier];
创建完Regoin后,我们需要对该Region进行监控以获取是否进入该区域及一些距离等信息,我们需要创建一个CLLocationManager实例然后调用startMonitoringForRegion:方法来监控上面的BeaconRegion:
- self.locationManager = [[CLLocationManager alloc] init];
- self.locationManager.delegate = self;
- [self.locationManager startMonitoringForRegion:targetBeaconRegion];
剩下的就是通过CLLocationManagerDelegate中的各个方法来获取监控区域内的所有CLBeacon基站,进入或退出某个Beacon区域,计算举例某个CLBeacon的距离等。