iBeacon技术分析文档
2016-06-17 08:37
302 查看
1前言
iBeacon是苹果公司在 iOS 7中推出的一种近场定位技术,可以感知一个附近的 iBeacon 信标的存在。当一个iBeacon兼容设备进入/退出一个iBeacon信标标识的区域时,iOS和支持iBeacon
的 app
就能得知这一信息,从而对用户发出相应的通知。
典型的应用场景:例如博物馆实时推送附近展品的相关信息,商场内即时通知客户折扣信息等。苹果在Apple Store中也部署了 iBeacon来推送优惠、活动信息。
2 iBeacon特点
iBeacon 基于低功耗蓝牙技术(Bluetooth Low Energy, BLE)这一开放标准,因此也继承了 BLE的一些特点。1) 范围广
相比于 NFC
的数厘米的识别范围,iBeacon
的识别范围可以达到数十米,并且能够估计距离的远近。
2) 兼容性
iBeacon 是基于 BLE做的一个简单封装,因此大部分支持 BLE的设备都可以兼容。
例如可以使用一个普通的蓝牙芯片作为信标,使用 Android设备检测信标的存在。
3) 低能耗
不少 beacon 实现宣称可以不依赖外部能源独立运行两年。
3 iBeacon使用场景
我们以一个连锁商场的例子来讲解iBeacon的一个流程。在一个连锁商场中,店家需要在商场中的不同地方推送不同的优惠信息,比如服装和家居柜台推送的消息就很有可能不同。当消费者走进某个商场时,会扫描到一个beacon。这个 beacon有三个标志符,proximityUUID是一个整个公司(所有连锁商场)统一的值,可以用来标识这个公司,major值用来标识特定的连锁商场,比如消费者正在走进的商场,minor值标识了特定的一个位置的
beacon,例如定位到消费者正在门口。
这时商场的 app会被系统唤醒,app可以运行一个比较短的时间。在这段时间内,app可以根据beacon
的属性查询到用户的地理位置(通过查询服务器或者本地数据),例如在化妆品专柜,之后就可以通过一个local notification推送化妆品的促销信息。用户可以点击这次local notification来查看更详细的信息,这样一次促销行为就完成了。
4 iBeacon API介绍
下面主要介绍iBeacon具体怎么使用:4.1 Beacon的表示
iBeacon本质上来说是一个位置(区域)信息,所以 Apple把 iBeacon功能集成在了Core Location里面。
iBeacon信标在 Core Location中表现为一个CLBeacon,它圈定的范围则表现为
CLBeaconRegion,这是一个CLRegion的子类。
CLBeaconRegion主要用三个属性来标识一个 iBeacon,proximityUUID、major和
minor。
proximityUUID是一个 NSUUID,用来标识公司,每个公司、组织使用的iBeacon应该拥有同样的
proximityUUID。
major用来识别一组相关联的 beacon,例如在连锁超市的场景中,每个分店的beacon应该拥有同样的
major。
minor则用来区分某个特定的 beacon。
这些属性如果不指定(即 nil),匹配的时候就会忽略这个属性。例如只指定proximityUUID的
CLBeaconRegion可以匹配某公司的所有beacons。
4.2 Monitoring
Apple在 iOS 4中增加了地理围栏 API,可以用来在设备进入/退出某个地理区域时获得通知,这些API包括:
-startMonitoringForRegion:
-locationManager:didEnterRegion:
-locationManager:didExitRegion:等。
CLBeaconRegion作为 CLRegion的子类也可以复用这些 API,这种检测iBeacon的方式叫做
monitoring。
使用这种方法可以在程序在后台运行时检测iBeacon,但是只能同时检测 20个
region,也不能推测设备与beacon的距离。
4.3 Ranging
除了使用地理围栏 API的方式,Apple还在 iOS 7中新增加了iBeacon
专用的检测方式,也就是 ranging。
通过 CLLocationManager的-startRangingBeaconsInRegion:方法可以开始检测特定的iBeacon。
当检测到beacon的时候,CLLocationManager的delegate
方法 -locationManager:didRangeBeacons:inRegion:会被调用,通知调用者现在被检测到的beacons。
这个方法会返回一个CLBeacon的数组,根据 CLBeacon的 proximity属性就可以判断设备和beacon之间的距离。
proximity属性有四个可能的值,unknown、immediate、near和
far。
另外 CLBeacon还有 accuracy和 rssi
两个属性能提供更详细的距离数据。
使用 iOS设备作为 iBeacon:
我们可以使用Core Bluetooth框架来广播特定的 payload来让
iOS 设备成为一个iBeacon。
这个 payload可以由CLBeaconRegion的 -peripheralDataWithMeasuredPower:方法来获取。
之后交给CBPeripheralManager广播出去就可以了。
需要注意的是,广播iBeacon信息的时候 app
必须在前台运行。
4.4 iBeacon行为
iBeacon的 API并不十分复杂,但他的行为比较难弄清楚,特别是当应用运行在后台时,检测到beacon的时间延迟会让开发者难以推测。在做了一些实验和合理的推测后,我们得出了一些结论:检测到beacon的时间跟设备进行蓝牙扫描的时间间隔有关,每当设备进行扫描的时候,就能发现iBeacon region的变化。
在 ranging打开的情况下,设备会每秒钟做一次扫描,也就是说状态更新最多延迟一秒。
程序在后台运行,并且monitoring打开的时候,设备可能每隔数分钟做一次扫描。iOS 7的响应速度较慢,iOS7.1有比较大的改善。
如果存在设置notifyEntryStateOnDisplay=YES的 beacon,iOS会在屏幕点亮的时候(锁屏状态下按下home键,或者因为收到推送点亮等)进行一次扫描。
设备重启并不影响iBeacon后台检测的执行。
iOS7 中,在多任务界面中杀掉程序会终止 iBeacon检测的执行,iOS7.1上改变了这一行为,被杀掉的
app还可以继续进行iBeacon检测。
5参考文献
1)AirLocate,苹果官方的 sample code,包含了 iBeacon的大部分用法。
2)
iBeacon Monitoring in the Background and Foreground,实验证实了 iBeacon的一些行为。
相关文章推荐
- Android初级教程Fragment到Fragment的通信初探
- Android初级教程Fragment到Fragment的通信初探
- 瞰视图代码详解
- asp.net获取当前网址url\域名
- contentType
- canvas语法糖
- Cocos2d-Lua之Lua文件的加载与运行
- CentOS 7安装Splunk
- HDU七夕节 1215
- css——浏览器前缀
- 对于被子应该是买1.8宽的,长可以是2.2左右
- Windows ping源码
- mysql服务器的常规操作
- 导航的下拉菜单制作
- 不发生死锁的设备最小数
- Request中getContextPath、getServletPath、getRequestURI、request.getRealPath的区别
- java基础,+=的问题
- 制作一个简单的webCrawler - 以Goodreads上的作家quotes为例+爬取Finance Yahoo上的公司股价信息
- spring源码分析之spring jmx
- 数据库查询4