iBeacons是iOS7的新增的功能,可用于室内近场定位。iOS设备可以检测到附近的iBeacons兼容设备,在当前版本中甚至可以在应用后台运行的情况下获得回调。
iBeacons设备往往都是低功耗的,用Bluetooth Low Energy低功耗蓝牙实现,设计良好的iBeacons设备在一节CR2032纽扣电池支持下应能支持一年以上的使用时间。
iBeacons还有一个有用的特性是可以距离感应,当你的iOS设备检测到了一个iBeacons设备,那么app即可通过CoreLocation监测设备的距离,通过回调的形式通知距离变化。
常见应用场景
可以有不少有趣的应用场景,随便列举一些。
- 商场购物时,靠近某些商品时,提示用户正在打折,或者查看商品的具体信息以及评价。靠近交费区域时,使用某一信用卡支付可以获得优惠。
- 室内导航,例如机场登机口指示
- 各种大会入场checkin,免去繁琐的签到流程
- 各种展览场所,当用户靠近某些展品时,就可以获得相应的介绍信息
什么时候应该使用iBeacons
- 同时需要检测多个区域
- 被检测区域可以是一个移动的区域,例如汽车,列车。。
- 检测区域范围有限的情况(一般不会大于100m)
- 每个区域需要一些标识做区分的情况
- 每个区域可以在室内,同一建筑物内,可以有重合
- 用户愿意开启低功耗蓝牙来检测区域
如何把iOS设备变成一个iBeacon
所有支持低功耗蓝牙技术的iOS设备都可以变成一个iBeacon设备,被其它iOS设备检测到。例如iPhone 4s, iPod Touch5, iPad3及之后的设备,都支持低功耗蓝牙技术。
定义你的iBeacon
首先需要了解4个属性
- proximity UUID , 是一个iBeacon或一组iBeacons设备的唯一标识,标明它的类型,你可以用osx下的
uuidgen
命令生成 - 一个内部identifier ,你在app中自定义的标识
- 一个 major identifier, 可用于区分一组拥有相同proximity UUID的设备
- 一个 minor identifier, 可用于区分一组拥有相同proximity UUID和相同major identifier的设备
创建并广播一个iBeacon区域
首先需要定义一个CLBeaconRegion来实现iBeacon,如下
NSUUID *myProximityUUID = [[NSUUID alloc]
initWithUUIDString:@"566C5595-6EC7-4F08-909F-C954BDCA6CD3"];
NSNumber *branchNumber = @42;
NSNumber *tillNumber = @3;
CLBeaconRegion *region = [[CLBeaconRegion alloc]
initWithProximityUUID:myProximityUUID
major:[branchNumber unsignedShortValue]
minor:[tillNumber unsignedShortValue]
identifier:@"com.mycompany.store"];
然后把这些信息交由CBPeripheralManager进行广播
`NSDictionary *peripheralData =
[region peripheralDataWithMeasuredPower:nil];
CBPeripheralManager *myPeripheralManager =
[[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
[myPeripheralManager startAdvertising:peripheralData];`
于是一个iOS设备就变成了一个iBeacon了
兼容的iBeacon设备
目前Apple并未公布iBeacons的具体技术细节,但是仍然有不少第三方通过蓝牙嗅探工具反向工程实现了iBeacons兼容设备。在国外已经有一些成品上市,例如
- estimote
- sticknfind
- paypal,它甚至将iBeacons融入了它的支付技术
本人也利用TI公司的CC2541实现了一个简单的iBeacons兼容模块,为了未来可能的变化,做了预留的空中升级接口,现在某宝尝试性的对外出售,适用于有一定电子技术动手能力的爱好者测试。