首页 > 代码库 > (转载)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类:

 

 
  1. @interface CLBeacon : NSObject <NSCopying, NSSecureCoding>  
  2. //...  
  3. @property (readonly, nonatomic) NSUUID *proximityUUID;  
  4. @property (readonly, nonatomic) NSNumber *major;  
  5. @property (readonly, nonatomic) NSNumber *minor;  
  6. //...  
  7. @end  

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

 

 
  1. time_t t;

        srand((unsigned) time(&t));

        CLBeaconRegion *region = [[CLBeaconRegion allocinitWithProximityUUID: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区域的信号信息

 

 
  1. NSDictionary *peripheralData = [region peripheralDataWithMeasuredPower:nil];  
  2. //创建并广播Beacon信号

 

 
  1. CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];  
  2. [peripheralManager startAdvertising:peripheralData];  

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

 

Beacon Monitoring

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

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

 

 
  1. @interface CLRegion : NSObject <NSCopying, NSSecureCoding>  
  2. @property (nonatomic, assign) BOOL notifyOnEntry;  
  3. @property (nonatomic, assign) BOOL notifyOnExit;  
  4. @end  

 

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

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

 

 
  1. CLBeaconRegion *targetBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:

    self.beaconRegion.proximityUUID

     identifier:self.beaconRegion.identifier];  

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

 


 
 
 
  1. self.locationManager = [[CLLocationManager alloc] init];  
  2. self.locationManager.delegate = self;  
  3. [self.locationManager startMonitoringForRegion:targetBeaconRegion];  

剩下的就是通过CLLocationManagerDelegate中的各个方法来获取监控区域内的所有CLBeacon基站,进入或退出某个Beacon区域,计算举例某个CLBeacon的距离等。