什么是iBeacons

iBeacons是苹果在2013年WWDC上推出一项基于蓝牙4.0(Bluetooth LE | BLE | Bluetooth Smart)的精准微定位技术,当你的手持设备靠近一个Beacon基站时,设备就能够感应到Beacon信号,范围可以从几毫米到50米。iBeacons相比较于原来的蓝牙技术有几个特点:

  • 首先它不需要配对,所以你不用担心一个名为『一头母猪』的蓝牙设备请求和你配对^_^。苹果在之前对蓝牙设备的控制比较严格,所以只有通过MFI认证过的蓝牙设备才能与iDevice连接,而蓝牙4.0就没有这些限制了;
  • 准确与距离。普通的蓝牙(蓝牙4.0之前)一般的传输距离在0.1~10m,而iBeacons信号可以精确到毫米级别,并且最大可支持到50m的范围;
  • 功耗更低。其实蓝牙4.0又叫低功耗蓝牙,一个普通的纽扣电池可供一个Beacon基站硬件使用两年。

目前已经有不少硬件厂商都在生产Beacon发射硬件,文章配图为Estimote公司生产的宝石形状的Beacon。当然并不是非得购买这些Beacon硬件才能使用iBeacons技术,其实从iPhone 4S和iPad 3及后续设备都已经支持蓝牙4.0,所以这些设备升级到iOS7都能够支持iBeacons,同时也能作为Beacon发射基站使用。 苹果在全美254家Apple Store中部署iBeacons很多就是直接使用iDevice作为基站。

Passbook + iBeacons

在iOS7中,Passbook的功能所有增强,当然也少不了对iBeacons的支持,你只需要在pass.json文件中加入beacons字段,然后填写上与该Pass相关的beacon基站信息,包括proximityUUIDmajorminor以及当该Pass接收到该beacon信号时需要显示的文本relevantText。这样,当你把这个包含beacons信息的Pass加入到Passbook,并靠近beacons中的某个基站时,该Pass的信息就会自动出现在手机的锁屏界面上,并显示relevantText中的文本。当然得有一个前提:手机打开蓝牙。

  "beacons":[
{
"proximityUUID" : "E2C56DB5-DFFB-48D2-B060-D0F5A71096E0",
"relevantText" : "TechDay 2013 Beijing",
"major" : 0,
"minor" : 0
}
],

和 locations 字段一样,一个Pass文件中最多支持10个beacon基站信息。其实这样做也是出于省电考虑,因为系统在每次接收到beacon信号时,都会在Passbook库中轮询每一个Pass的beacons信息,匹配后才将它显示出来,所以如果不做数量限制,耗电量可能就难以接受,locations原理也类似。

iBeacons开发

Beacon Monitoring

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

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

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

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

一个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

创建一个 CLBeaconRegion ,我们需要先创建一个目标监控区域唯一的UUID:

NSUUID *myUUID = [[NSUUID alloc] initWithUUIDString:@"E2C56DB5-DFFB-48D2-B060-D0F5A71096E0"];
CLBeaconRegion *targetBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:myUUID identifier:@"TechDay 2013 Beijing"];

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

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

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

Beacon Broadcasting

前面我们说到所有支持蓝牙4.0的iDevice都能够作为beacon基站发射信号,这就需要 CoreBluetooth.framework 的支持。 我们需要创建一个CBPeripheralManager实例,然后发射beacon广播信号:

//为beacon基站创建一个唯一标示
NSUUID *myUUID = [[NSUUID alloc] initWithUUIDString:@"A4E86DC5-A0E2-G7W0-B060-A0F5A71096C0"];
CLBeaconRegion *myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:myUUID identifier:@"iBeacons"]; //获取该Beacon区域的信号信息
NSDictionary *peripheralData = [myBeaconRegion peripheralDataWithMeasuredPower:nil]; //创建并广播Beacon信号
CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
[peripheralManager startAdvertising:peripheralData];

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

总结

苹果的伟大之处就是在于将复杂的技术以简单的形式呈现出来,相信看完本文你已经对iBeacons开发相关的技术有了很好的了解,然而iBeacons技术本身的应用才是真正体现价值的地方,相信它能给很多行业带来变革。

Posted by TracyYih - 2013-12-15
如需转载,请注明: 本文来自 Esoft Mobile

iBeacon开发的更多相关文章

  1. iBeacon 开发笔记

    iBeacon开发笔记 2015.10.19 airlocate ========= airlocate显示如何使用这个监控范围clbeaconregions. 代码还提供了一个例子,你如何能校准和配 ...

  2. Android 开发中 iBeacon的使用

    iBeacon的工作原理是基于Bluetooth Low Energy(BLE)低功耗蓝牙传输技术,iBeacon基站不断向四周发送蓝牙信号,当智能设备进入设定区域时,就能够收到信号.只要满足iBea ...

  3. iOS开发 关于iBeacon的一些记录

    最近时间一直在研究ibeacon所以把自己遇到的一些问题写下来做个笔记. 参考资料:https://github.com/nixzhu/dev-blog/blob/master/2014-04-23- ...

  4. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  5. C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现

    ”摇一摇周边“是微信提供的一种新的基于位置的连接方式.用户通过“摇一摇”的“周边”页卡,可以与线下商户进行互动,获得商户提供的个性化的服务.微信4月份有一个赠送摇一摇设备的活动,我们有幸获得赠送资格, ...

  6. iOS--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook等系统服务开发汇总

    iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...

  7. iOS开发——高级技术&蓝牙服务

    蓝牙服务 蓝牙 随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低.从iOS的 ...

  8. iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  9. Android BLE开发之Android手机搜索iBeacon基站

    本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 上次讲了Android手机与BLE终端之间的通信,而最常见的BLE终端应该是苹果公司倡导的iBeacon基站. ...

随机推荐

  1. lintcode:Minimum Subarray 最小子数组

    题目: 最小子数组 给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 样例 给出数组[1, -1, -2, 1],返回 -3 注意 子数组最少包含一个数字 解题: 和最大子数组 ,差不多的 ...

  2. leetcode 4 : Median of Two Sorted Arrays 找出两个数组的中位数

    题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  3. Apache源码分析资源

    关于作者张中庆, 目前主要的研究方向是嵌入式浏览器,移动中间件以及大规模服务器设计.目前正在进行Apache的源代码分析,计划出版<Apache源代码全景分析>上 下册.Apache系列文 ...

  4. 利用BBRSACryptor实现iOS端的RSA加解密

    背景 RSA这种非对称加密被广泛的运用于网络数据的传输,但其在iOS上很难直接实现,BBRSACryptor框架通过移植openssl实现了iOS端的RSA,本文将介绍如何使用BBRSACryptor ...

  5. C#基础(WinForm窗体的单例模式,避免窗体被实例化多次)

    在MDI窗体中使用单例模式可以有效的避免同个窗体被实例化多次 [csharp] view plain copy   //==============字窗体的修改================  // ...

  6. Android ActionBar的Overlay模式如何不遮盖顶部内容的问题

    关于actionbar的overlay模式请参考 如何让android的actionbar浮动且透明 一文.这篇文章讲的是如何在这种模式下让actionbar不遮住顶部的内容. 这 一般是这样的场景, ...

  7. 转:Android 获取Root权限

    来自:http://blog.csdn.net/twoicewoo/article/details/7228940 import java.io.DataOutputStream; import an ...

  8. web前端性能测试小点

    关于前端性能的文章: http://www.cnblogs.com/fnng/archive/2011/09/19/2181894.html web应用的前端性能响应时间指浏览器的页面加载时间.浏览器 ...

  9. "hadoop namenode -format"命令的作用和影响的文件

    在hadoop部署好了之后是不能马上应用的,而是对配置的文件系统进行格式化.这里的文件系统,在物理上还未存在,或者用网络磁盘来描述更加合适:还有格式化,并不是传统意义上的磁盘清理,而是一些清除与准备工 ...

  10. C++ STL之查找算法

    C++STL有好几种查找算法,但是他们的用法上有很多共同的地方: 1.除了binary_search的返回值是bool之外(查找的了返回true,否则返回false),其他所有的查找算法返回值都是一个 ...