iOS7的iBeacon技术解析

来源:互联网 发布:mac不能看腾讯视频 编辑:程序博客网 时间:2024/04/29 22:14

       iOS7虽然出来很长时间了,但是关于iOS7的iBeacon的技术以及知识是一点都不知道,目前关于iBeacon的技术介绍和成熟的产品也很少。但现在需要该技术的支持,自己就去大概的了解了下。当然,由于接触的时间短,也没有去详细的看官方的文档,所以可能会造成理解的不全面或者理解错误,但是在写这篇文章的时候,暂时就按自己的理解来说吧,至于错误或者不全面留给以后去解决吧。

1、什么是iBeacon技术?

       iBeacons是苹果在WWDC 2013上有意无意透漏出来的一项重要功能,通过低功耗蓝牙(BluetoothLowEnergy)技术进行十分精确的微定位和室内导航,据悉其定位精度可以以厘米计算。iBeacon基站可以创建一个信号区域(如何创建没有去详细的了解,但是下面的例子会告诉你如何创建一个信号区域),当设备进入该区域时,相应的应用程序便会提示用户是否需要接入这个信号网络。实现iBeacons精准的微定位功能需要运行iOS 7且支持BLE的设备,比如iPhone4s以后的设备。

2.iBeacon的使用案例

       当用户走进iBeacon基站信号覆盖区域内时,用户就会收到相关的提醒和询问。举个例子,当用户走到商场某个店面附近时,安装了相应app的用户就会收到由iBeacons基站发出的产品信息或者打折信息。苹果更是在254间Apple Store 里应用了iBeacon 技术。

        对于开发者来说,可以创建一个更加具有交互性的博物馆应用,当用户在博物馆内随意行走时,通过信息提醒用户某些特别的展览。技术还可以用作室内导航,比如在地铁站或者机场这些GPS信号不大好的地方更好地引导用户。

3.如何实现基于iBeacon的信息推送

        相信大家都会有个有误解,认为推送消息是通过iBeacon基站下发的,其实不然。
        iBeacon仅仅提供位置服务,推送消息功能需要您去开发一款APP软件,并安装到用户手机中,在后台挂载相应服务程序。例如进入iBeacons广播范围的用户手机收到商场打折促销信息,信息是由手机上的应用去获取的,而不是保存在iBeacons里。
        具体实现过程是:当APP软件接收到iBeacon广播的位置信息后,经过一定计算来获取自己的当前位置,当计算出来的位置符合您设定的特定条件时,APP向您的广告数据服务器请求对应内容并呈现给用户,到此完成一条消息的推送。也就是说要实现动态的信息推送,至少需要一个APP软件和一个数据服务器。当然如果仅向用户呈现固定内容,则数据服务器不是必须的。

4.实现个iBeacon的Demo

        文中所用的demo是我们用来展示如何检测和处理来自beacon的广播,但首先我们需要创建一款app来担当beacon的角色--没有其他功能,只是用来广播信号。然后再写个app来担当接受者。最后,我们将有代表双方沟通的两款app。

        iBeacons是iOS 7引入的新技术,所以我们需要两部运行iOS 7并支持BLE的设备,比如iPhone 4S以上设备,iPad mini以及iPad 3以后设备。同时,为了在设备上部署app,你还需要是苹果iOS开发者计划(99美元)的成员。

        前提准备:打开你的终端,在Finder下的应用程序->实用工具  下,然后输入:uuidgen获取一个UUID的字符串,记住它。

       

         iBeacon广播的是什么?它是一个UUID,类似:C293726B-63BF-420A-9D79-92C71F67536A。beacon会不断地广播该UUID,并且接收方app会用同样的UUID检测信号。所以要准备好一个UUID。

        接着在Xcode中创建一个新的Single View Application,命名为BeaconBroadcast,在mainstoryboard里面的ViewContrller的view里面加入一个Button和Label控件,如下图,将button名称改为Broadcast。

                                     

然后利用辅助编辑器,在ViewController.h文件里创建Label的

  

在ViewnController.m文件里再创建一个Button事件

然后,再给工程添加必需的框架,CoreBluetooth.framework和CoreLocation.framework.并在viewcontroller.h文件中#import进去

#import <CoreLocation/CoreLocation.h>
#import <CoreBluetooth/CoreBluetooth.h>

并且定义如下几个变量,结果如图

接着在viewncontroller.m文件的ViewDidLoad方法中写下你刚才创建的UUID

上边的代码中,我们创建了一个新的NSUUID对象。

然后,我们设置了一个CLBeaconRegion,并通过那个UUID进行初始化,major number,minor number 以及identifier。如果你所处的位置内有一大堆数据,major number和minor number就是用来识别你的beacons。在上边百货的例子中,每个department会有一个特定的major number--识别一组beacons,在店内,每个beacon会有一个特定的minor number。
通过major number和minor number ,你将能精确识别哪个beacon被获取了。最后,标识符是该区域唯一的ID。

在之前我们设置的buttonClicked method中,我们添加如下代码:

在上述代码中,我们调用了“peripheralDataWithMeasuredPower:” ,它可以给我们提供即将进行广播的beacon data。

第二行代码启动了外围设备管理,并监控Bluetooth的状态更新。
 
现在我们需要处理状态更新方法来检测Bluetooth何时打开和关闭。所以添加以下委托方法,因为我们的ViewController类遵照“CBPeripheralManagerDelegate” 的协议。

当Bluetooth外围设备状态改变时会触发该方法。所以在该方法中,我们要检查当前设备处于什么状态。如果Bluetooth处于打开状态,我们将会更新我们的标签,调用“startAdvertising”方法,并把传递beacon data进行广播。相反,如果Bluetooth处于关闭状态,我们将会停止广播。如果不熟悉苹果蓝牙API的童鞋,可能不理解这一步,建议先去看下苹果蓝牙接口的文档,熟悉下蓝牙从发现外设并和外设进行通信的整个流程。

        现在把app部署至设备,打开Bluetooth并点击按钮,系统就会广播你的UUID!现在我们要创建一个接收方的app来检测和处理广播。注意,模拟器不能使用Bluetooth,所以不能通过模拟器进行广播。为了把app部署至支持BLE的真实设备上(iPhone 4S and up, iPad mini and iPad 3 and up),你需要加入苹果开发者计划。

        设置另一个Single View Application,并命名为“BeaconReceiver”

        打开Main.storyboard,在view中添加单个UILabel,该Label会显示接收机有没有进入iBeacon广播的范围。

添加CoreLocation框架
CoreLocation框架已经更新以支持beacon检测,我们需要把它添加在我们项目中。打开项目属性并点击“Linked Libraries and Frameworks”下的“+”图标。添加CoreLocation框架
        现在,通过IBOutlet属性连接来添加UILabel。打开辅助编辑器,确保ViewController.h位于右边窗格。按下“control”键并点击UILabel,拖出一条线并放在 “@interface” 和 “@end”行之间。放开后,出现一个弹出对话框,你可以给属性命名为“statusLabel”。

        最后打开ViewController.h,在文件顶部添加CoreLocation框架,并调整类声明使之遵从CLLocationManagerDelegate协议,该协议包含一个delegate method,可以让我们知道最新监测到的beacons。

监测Beacons

我们需要添加两个属性,一个是保持对beacon region(我们即将进行检测)的跟踪;另一个是保存locationmanager,它会更新发现的beacons,在ViewController.h添加以下代码:
       最后ViewController.h文件的代码如下图:

      

        现在打开ViewController.m,在“viewDidLoad” 方法中,我们将要初始化locationManager,把我们设置为它的委托。我们也将开始监控想要的beacon。

       

       这里那串UUID和identifer要和第一个工程(BeaconBroadcast)的UUID和identifier一致,因为接收机会和broadcast机对这两个参数进行匹配,匹配一致之后,才会进行相应的操作。其实,发送机一直再对这两个参数进行广播,接收机进入这个区域之后会接收到这两个参数,如果发现这两个参数是我感兴趣的,我就可以进行相应的操作了。

       在第20和第21行代码中,我们把locationManager初始化为CLLocationManager的新实例,然后把我们设置为它的委托,这样当更新时就会通知我们。

       在24行中,我们通过同样的UUID设置了NSUUID对象,作为一个被app(先前创建的那个)广播的对象。
       最后我们把region传递给location manager 以便于监视。
 
下一步,我们需要执行一些委托方法,当region被检测时将会调用该方法。
       首先,在ViewController.m中添加如下代码:

      这两个方法是CLLocationManagerDelegate的委托,当设备进入区域或者离开区域时会被调用。当区域被检测,我们通知locationManager开始寻找区域内的beacons。


最后再执行下面的一个方法:

      这个委托,就在statusLabel上显示,接收机找到了一个匹配的iBeacon.当一个或者更多beacons被检测时,该方法将会被失效。在上述代码中,你可以看到我们如何获得UUID,来自beacon的major和minor数据。另外,虽然我们上边并未执行,但你可以遍历beacons array,并通过检测近距离的beacon属性来决定哪一个是最近的。

     然后在两台iOS7之后和支持BLE的两台iP设备上,分别运行这两个程序,我是用iPad Air作为接收机即(BeaconReceiver的程序),iPhone4s作为广播机

                       

(两个工程的下载地址广播机 http://download.csdn.net/detail/christ_beings/7212101  接收机的:http://download.csdn.net/detail/christ_beings/7212139)

2 0
原创粉丝点击