iBeacon 是苹果公司在 iOS 7 中新推出的一种近场定位技术,可以感知一个附近的 iBeacon 信标的存在。

当一个 iBeacon 兼容设备进入/退出一个 iBeacon 信标标识的区域时,iOS 和支持 iBeacon 的 app 就能得知这一信息,从而对用户发出相应的通知。

典型的应用场景例如博物馆实时推送附近展品的相关信息,商场内即时通知客户折扣信息等。苹果在 Apple Store 中也部署了 iBeacon 来推送优惠、活动信息。

特点

iBeacon 基于低功耗蓝牙技术(Bluetooth Low Energy, BLE)这一开放标准,因此也继承了 BLE 的一些特点。

  • 范围广

    相比于 NFC 的数厘米的识别范围,iBeacon 的识别范围可以达到数十米,并且能够估计距离的远近。

  • 兼容性

    iBeacon 是基于 BLE 做的一个简单封装,因此大部分支持 BLE 的设备都可以兼容。 例如可以使用一个普通的蓝牙芯片作为信标,使用 Android 设备检测信标的存在。

  • 低能耗

    不少 beacon 实现宣称可以不依赖外部能源独立运行两年。

使用场景

我们以一个连锁商场的例子来讲解 iBeacon 的一个流程。在一个连锁商场中,店家需要在商场中的不同地方推送不同的优惠信息,比如服装和家居柜台推送的消息就很有可能不同。

当消费者走进某个商场时,会扫描到一个 beacon。这个 beacon 有三个标志符,proximityUUID 是一个整个公司(所有连锁商场)统一的值,可以用来标识这个公司,major 值用来标识特定的连锁商场,比如消费者正在走进的商场,minor 值标识了特定的一个位置的 beacon,例如定位到消费者正在门口。

这时商场的 app 会被系统唤醒,app 可以运行一个比较短的时间。在这段时间内,app 可以根据 beacon 的属性查询到用户的地理位置(通过查询服务器或者本地数据),例如在化妆品专柜,之后就可以通过一个 local notification 推送化妆品的促销信息。用户可以点击这次 local notification 来查看更详细的信息,这样一次促销行为就完成了。

API

闲话少说,我们来看下 iBeacon 具体怎么使用:

Beacon 的表示

iBeacon 本质上来说是一个位置(区域)信息,所以 Apple 把 iBeacon 功能集成在了 Core Location 里面。

iBeacon 信标在 Core Location 中表现为一个 CLBeacon,它圈定的范围则表现为 CLBeaconRegion,这是一个 CLRegion 的子类。

CLBeaconRegion 主要用三个属性来标识一个 iBeacon,proximityUUIDmajorminor

proximityUUID 是一个 NSUUID,用来标识公司,每个公司、组织使用的 iBeacon 应该拥有同样的 proximityUUID

major 用来识别一组相关联的 beacon,例如在连锁超市的场景中,每个分店的 beacon 应该拥有同样的 major

minor 则用来区分某个特定的 beacon。

这些属性如果不指定(即 nil),匹配的时候就会忽略这个属性。例如只指定 proximityUUIDCLBeaconRegion 可以匹配某公司的所有 beacons。

Monitoring

Apple 在 iOS 4 中增加了地理围栏 API,可以用来在设备进入/退出某个地理区域时获得通知,这些 API 包括 -startMonitoringForRegion:-locationManager:didEnterRegion:-locationManager:didExitRegion: 等。 CLBeaconRegion 作为 CLRegion 的子类也可以复用这些 API,这种检测 iBeacon 的方式叫做 monitoring。

使用这种方法可以在程序在后台运行时检测 iBeacon,但是只能同时检测 20 个 region,也不能推测设备与 beacon 的距离。

Ranging

除了使用地理围栏 API 的方式,Apple 还在 iOS 7 中新增加了 iBeacon 专用的检测方式,也就是 ranging。

通过 CLLocationManager-startRangingBeaconsInRegion: 方法可以开始检测特定的 iBeacon。

当检测到 beacon 的时候,CLLocationManager 的 delegate 方法 -locationManager:didRangeBeacons:inRegion: 会被调用,通知调用者现在被检测到的 beacons。 这个方法会返回一个 CLBeacon 的数组,根据 CLBeaconproximity 属性就可以判断设备和 beacon 之间的距离。

proximity 属性有四个可能的值,unknown、immediate、near 和 far。 另外 CLBeacon 还有 accuracyrssi 两个属性能提供更详细的距离数据。

使用 iOS 设备作为 iBeacon

我们可以使用 Core Bluetooth 框架来广播特定的 payload 来让 iOS 设备成为一个 iBeacon。 这个 payload 可以由 CLBeaconRegion-peripheralDataWithMeasuredPower: 方法来获取。

之后交给 CBPeripheralManager 广播出去就可以了。

需要注意的是,广播 iBeacon 信息的时候 app 必须在前台运行。

行为

iBeacon 的 API 并不十分复杂,但他的行为比较难弄清楚,特别是当应用运行在后台时,检测到 beacon 的时间延迟会让开发者难以推测。在做了一些实验和合理的推测后,我们得出了一些结论:

  • 检测到 beacon 的时间跟设备进行蓝牙扫描的时间间隔有关,每当设备进行扫描的时候,就能发现 iBeacon region 的变化。
  • 在 ranging 打开的情况下,设备会每秒钟做一次扫描,也就是说状态更新最多延迟一秒。
  • 程序在后台运行,并且 monitoring 打开的时候,设备可能每隔数分钟做一次扫描。iOS 7 的响应速度较慢,iOS 7.1 有比较大的改善。
  • 如果存在设置 notifyEntryStateOnDisplay=YES 的 beacon,iOS 会在屏幕点亮的时候(锁屏状态下按下 home 键,或者因为收到推送点亮等)进行一次扫描。
  • 设备重启并不影响 iBeacon 后台检测的执行。
  • iOS 7 中,在多任务界面中杀掉程序会终止 iBeacon 检测的执行,iOS 7.1 上改变了这一行为,被杀掉的 app 还可以继续进行 iBeacon 检测。

参考

  • AirLocate,苹果官方的 sample code,包含了 iBeacon 的大部分用法。
  • HiBeacons,另一个 demo。
  • iBeacon Monitoring in the Background and Foreground,实验证实了 iBeacon 的一些行为。

iBeacon 初探相关推荐

  1. iOS -- 学习资料总结(转载)

    先著名转载地址:https://www.jianshu.com/p/c47c24ab1e76/ 关于iOS学习进阶的必读一些博客总结 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱, ...

  2. 关于iOS学习进阶的必读一些博客总结

    关于iOS学习进阶的必读一些博客总结 作者 Raybon_lee 2016.01.16 22:28* 字数 3110 经过一周的思考还是决定重组一下优秀的博客,首次整理这些博客比较乱,但是后期会慢慢增 ...

  3. 初探微信摇一摇周边与iBeacon

    初探微信摇一摇周边与iBeacon 本文是对微信摇周边和iBeacon进行一些实验和理解. 小试牛刀 还是老规矩,先跟着已经有文档做个实验,对iBeacon有一个整体的认识,微信iBeaconID-微 ...

  4. 2021年大数据Flink(九):Flink原理初探

    Flink原理初探 Flink角色分工 在实际生产中,Flink 都是以集群在运行,在运行的过程中包含了两类进程. JobManager: 它扮演的是集群管理者的角色,负责调度任务.协调 checkp ...

  5. 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书

    缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...

  6. 经典算法研究系列:二、Dijkstra 算法初探

    经典算法研究系列:二.Dijkstra 算法初探  July   二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...

  7. 国外物联网平台初探(四):Ayla Networks

    定位 Ayla企业软件解决方案为全球部署互联产品提供强大的工具 功能 Ayla的IoT平台包含3个主要组成部分: (1) Ayla嵌入式代理Ayla Embedded Agents (2) Ayla云 ...

  8. android蓝牙4.0(BLE)开发之ibeacon初步

    一个april beacon里携带的信息如下 ? 1 <code class=" hljs ">0201061AFF4C0002159069BDB88C11416BAC ...

  9. las格式测井曲线_邹榕,等:顺北和托甫台区块奥陶系断裂结构单元测井响应特征初探...

    引用格式:邹榕,徐中祥,张晓明,等.顺北和托甫台区块奥陶系断裂结构单测井响应特征初探[J].油气藏评价与开发,2020,10(2):18-23.ZOUR, XU Z X, ZHANG X M, et ...

最新文章

  1. 链路负载均衡的链路和NAT地址保持
  2. linux 启动网卡错误 RTNETLINK answers: File exists 解决方案
  3. mysql的联合索引_mysql联合索引
  4. 删除链表重复节点 python_java删除链表中重复的节点(保留一个节点)
  5. matlab线性拟合二元函数,求助:怎么用已知数据进行matlab二元二次函数拟合
  6. ssh(Spring+Spring mvc+hibernate)——IDeptService.java和IEmpService.java
  7. javaScript入门基础说明
  8. 多源最短路径---Floyd-Warshall算法
  9. 如果有多个虚拟机,手动启动哪个
  10. enter对应的keycode_vue 添加enter回车事件
  11. 数据挖掘前景及工作方向选择
  12. oracle技术之让数据库变快的10个建议
  13. java smtp服务器,用Java实现SMTP服务器
  14. Python网络爬虫:下载漫画的正确姿势
  15. 3D-HEVC解码器一
  16. Exchange-获取主、所有SMTP地址
  17. java服务器开发心得
  18. 八位二进制数能表示数的范围以及原码、反码和补码含义
  19. C++数据结构之单链表(henu.hjy)
  20. 个人作品设计展示官网源码

热门文章

  1. 数据库中包含开始时间、结束时间,并且查询条件也有开始时间、结束时间的查询方法...
  2. Winform datagridview相关操作
  3. UVa 11636 Hello World!
  4. 在一个list中增加一个节点
  5. 2021 年 Linux 界的 12 件大事
  6. 内核抢占,让世界变得更美好 | Linux 内核
  7. 秒,在解答这个C语言题目上,我们都败了
  8. ESP32 coredump 分析
  9. .bat是什么语言_简单说说当我们打开网页时,浏览器到底做了什么?
  10. 【Pytorch神经网络理论篇】 26 基于空间域的图卷积GCNs(ConvGNNs):定点域+谱域+图卷积的操作步骤