iBeacon


iBeacon介紹

iBeacon是蘋果在2013年WWDC上推出一項基於藍牙4.0(Bluetooth LE | BLE | Bluetooth Smart)的精准微定位技術,當你的手持設備靠近一個Beacon基站時,設備就能夠感應到Beacon信號,范圍可以從幾毫米到50米。因為是一種定位技術,蘋果將iBeacon相關的接口放到了CoreLocation.framework。

使用iBeacon的前提條件,是用戶開啟支持BLE的iOS終端的藍牙功能,並開啟位置信息服務。iOS在接收到iBeacon后,會將UUID告知使用iBeacon的App。在UUID的觸發下,App就會被叫醒。 

 

本文轉自Migrant的博客,原文:《Can you Smell the iBeacon?

 
雖然我們還未看到任何實際生活中的使用案例,但 iBeacon 絕對是 iOS 7 帶來的最熱門的新話題之一。
 
上周我收到了我的  Developer Preview Kit from Estimote,為了將其收入我正在寫作的新書中,我開始研究 iBeacon。下面是我的發現。
 
為了理解兩種操作模式的不同之處,有兩個詞你應該知道:
1.  Monitoring – 涉及小功率區域監測,接收 didEnterRegion: 和 didExitRegion: 代理消息。
2.  Ranging – 意味着大功率活動,此時你能從各個 iBeacon 收到信號強度並能夠估計此刻與它們的距離。
 
iOS 7 之前蘋果給我們提供了監測設備將要進入或離開某一個特定區域的能力,其核心是 CLRegion。該技術圍繞着地理位置和進入或退出該位置時將要發生的事情。更好的是,如果你在 info.plist 中指定了接收后台位置更新,那么系統可以在區域邊界處激活你的應用。
 
iOS 7 增加了繼承自 CLRegion 的 CLBeaconRegion。只要有 iBeacon 被 iOS 檢測到,即使信號可能很弱,你就被定義為位於區域之內。這讓測試過程令人發瘋,因為即使我把我所有的 Estmote beacons 用鋁箔包裹起來, iOS 仍然認為我位於該區域內。
 
一個 iBeacon 通過 3 個值被識別: proximityUUID, Major 和 Minor。第一個是 UUID,后兩者是兩個 16 位二進制整數。你可以構建 3 個級別的 CLBeaconRegion: 只有 UUID,UUID + Major,UUID + Major + Minor。例如你可能想用一個 UUID 對應整個公司,Major 對應各個店鋪。Minor 則可以用來指定每個店鋪中的各個貨架。
 
做廣告吧
普通的 BTLE (Bluetooth Low Energy) 外設宣傳多重服務,iBeacon 不同。iBeacon 自己使用廣告信息並且不需要真正的藍牙鏈接,因為所有所需信息已存在於 iBeacon 廣告中。
 
以一個簡略的例子開始:
  1. @implementation ViewController 
  2.    CBPeripheralManager *_peripheralManager; 
  3.    BOOL _isAdvertising; 
  4.   
  5. - (void)_startAdvertising 
  6.    NSUUID *estimoteUUID = [[NSUUID alloc] initWithUUIDString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"]; 
  7.   
  8.    CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:estimoteUUID 
  9.                                                                     major:2 
  10.                                                                     minor:1 
  11.                                                                identifier:@"SimEstimote"]; 
  12.    NSDictionary *beaconPeripheralData = [region peripheralDataWithMeasuredPower:nil]; 
  13.   
  14.    [_peripheralManager startAdvertising:beaconPeripheralData]; 
  15.   
  16. - (void)_updateEmitterForDesiredState 
  17.    if (_peripheralManager.state == CBPeripheralManagerStatePoweredOn) 
  18.    { 
  19.       // only issue commands when powered on 
  20.   
  21.       if (_isAdvertising) 
  22.       { 
  23.          if (!_peripheralManager.isAdvertising) 
  24.          { 
  25.             [self _startAdvertising]; 
  26.          } 
  27.       } 
  28.       else 
  29.       { 
  30.          if (_peripheralManager.isAdvertising) 
  31.          { 
  32.             [_peripheralManager stopAdvertising]; 
  33.          } 
  34.       } 
  35.    } 
  36.   
  37. #pragma mark - CBPeripheralManagerDelegate 
  38.   
  39. - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral 
  40.    [self _updateEmitterForDesiredState]; 
  41.   
  42. #pragma mark - Actions 
  43.   
  44. - (IBAction)advertisingSwitch:(UISwitch *)sender 
  45.    _isAdvertising = sender.isOn; 
  46.   
  47.    [self _updateEmitterForDesiredState]; 
  48.   
  49. @end 
 
這個例子有一個 UISwitch 來切換 soft-beacon。這里有一些陷阱。首先它用了若干毫秒來開啟藍牙系統。只有在藍牙啟動時才能使用 CBPeripheralManager。它一這么做你就會收到 peripheralManagerDidUpdateState: 代理回調,如果藍牙電源此時處於開啟狀態,你就可以開始廣播 beacon。
 
停止 iBeacon 要簡單的多,只需要一個命令。如果 CBPeripheralManager 電源被關閉,則所有的廣告也會停止。當應用進入后台而你又沒有告訴 iOS 保持藍牙服務繼續運行時就會導致這種情況發生。沒記錯的話,所有的服務在應用回到前台時會恢復。
 
Estimote
用何種類型的設備來執行 iBeacon 的功能並無結論,你可以讓任何 iOS 設備 (>= iPhone 4S) 和 Mac (>= late 2011) 的藍牙芯片作為 iBeacon。也有一些硬件公司提供專用的硬件。
Beacon 硬件的初衷是你讓你並不需要在牆上粘一個真的 iOS 設備。不是每個人都能在店鋪的每一個角落都放上 iPad。標准 iBeacon 硬件的價格是 99 美金 3個。我用這個價格買了 3 個 Estimote beacon。 
Estimote Developer Preview Kit
 
Estimote 提供了非常友好的拆箱體驗。除了 3 個不同顏色的 iBeacon,還有 1 個按鈕,1 張貼紙,1 張 Estimote CEO 和聯合創始人 Jakub Krzych 的名片,還有一些警告信息來告知你這些 beacon 目前是手工組裝的因此可能存在固件 bug。
 
收到 beacon 后你要做的第一件事是下載 Estimote 的演示應用,它可以讓你像上文描述的那樣嘗試 Monitoring 和 Ranging。它還允許你鏈接各個 Estimote 設備來觀察它們的電量,固件版本,以及 UUID, Major 和 Minor 的設置值。
 
此時我很驚訝的得知 Estimote 使用了”燒入”的 UUID。官方聲明說這是有意的設計,用來阻止來自越獄設備的黑客和位置欺騙。
 
UUID 在應用內很明顯,也被公布於幾個博客中:
  1. B9407F30-F5F8-466E-AFF9-25556B57FE6D 
 
這也是我上面的例子中使用的 UUID,其實是創建了一個模擬的 Estimote beacon。
 
Estimote beacon 被完全包裹於橡膠之中因此並沒有像 USB 之類的物理硬件接口。所有的設置通過藍牙和 Estimote 暴露的內部服務來完成。推測未來版本的  official Estimote SDK 會針對擔心自己 beacon 安全的人推出 UUID 加密方法。
 
他們還建議你使用他們包裝的 Core Location 和 Core Bluetooth 來代替原生的 iOS 方法。對於系統也提供的功能,我個人比較反感使用第三方 SDK。對於你和你的鄰居使用相同的 UUID 所造成的潛在問題的最佳解決方案是使用隨機的 Major 值結合 UUID 來監測。一旦范圍被發現,你要做額外的檢查 — 可能針對於地理位置 — 是否你確實在你自己的店鋪里。
 
監測 iBeacon 區域
如果你已經有了一個 Estimote 或按照上面創建了一個 soft-beacon,下一步就是監測這個區域。下面是一個可行的示例,目的是當你穿過區域邊界時,更新文本標簽並發出一個本地通知:
  1. @implementation AppDelegate 
  2.    CLLocationManager *_locationManager; 
  3.    BOOL _isInsideRegion; // flag to prevent duplicate sending of notification 
  4.   
  5. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)options 
  6.    // create a location manager 
  7.    _locationManager = [[CLLocationManager alloc] init]; 
  8.   
  9.    // set delegate, not the angle brackets 
  10.    _locationManager.delegate = self; 
  11.   
  12.    NSUUID *estimoteUUID = [[NSUUID alloc] initWithUUIDString:@"B9407F30-F5F8-466E-AFF9-25556B57FE6D"]; 
  13.    CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:estimoteUUID 
  14.                                                                identifier:@"Estimote Range"]; 
  15.   
  16.    // launch app when display is turned on and inside region 
  17.    region.notifyEntryStateOnDisplay = YES; 
  18.    // isMonitoringAvailableForClass:Returns a Boolean indicating whether the device supports region monitoring using the specified class.
  19.    if ([CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) 
  20.    { 
  21.       [_locationManager startMonitoringForRegion:region]; 
  22.   
  23.       // get status update right away for UI 
  24.       [_locationManager requestStateForRegion:region]; 
  25.    } 
  26.    else 
  27.    { 
  28.       NSLog(@"This device does not support monitoring beacon regions"); 
  29.    } 
  30.   
  31.     // Override point for customization after application launch. 
  32.     return YES; 
  33.   
  34. - (void)_sendEnterLocalNotification 
  35.    if (!_isInsideRegion) 
  36.    { 
  37.       UILocalNotification *notice = [[UILocalNotification alloc] init]; 
  38.   
  39.       notice.alertBody = @"Inside Estimote beacon region!"
  40.       notice.alertAction = @"Open"
  41.   
  42.       [[UIApplication sharedApplication] scheduleLocalNotification:notice]; 
  43.    } 
  44.   
  45.    _isInsideRegion = YES; 
  46.   
  47. - (void)_sendExitLocalNotification 
  48.    if (_isInsideRegion) 
  49.    { 
  50.       UILocalNotification *notice = [[UILocalNotification alloc] init]; 
  51.   
  52.       notice.alertBody = @"Left Estimote beacon region!"
  53.       notice.alertAction = @"Open"
  54.   
  55.       [[UIApplication sharedApplication] scheduleLocalNotification:notice]; 
  56.    } 
  57.   
  58.    _isInsideRegion = NO; 
  59.   
  60. - (void)_updateUIForState:(CLRegionState)state 
  61.    ViewController *vc = (ViewController *)self.window.rootViewController; 
  62.   
  63.    if (state == CLRegionStateInside) 
  64.    { 
  65.       vc.label.text = @"Inside"
  66.    } 
  67.    else if (state == CLRegionStateOutside) 
  68.    { 
  69.       vc.label.text = @"Outside"
  70.    } 
  71.    else 
  72.    { 
  73.       vc.label.text = @"Unknown"
  74.    } 
  75.   
  76. #pragma mark - CLLocationManagerDelegate 
  77.   
  78. - (void)locationManager:(CLLocationManager *)manager 
  79.     didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region 
  80.    // always update UI 
  81.    [self _updateUIForState:state]; 
  82.   
  83.    if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) 
  84.    { 
  85.       // don't send any notifications 
  86.       return
  87.    } 
  88.   
  89.    if (state == CLRegionStateInside) 
  90.    { 
  91.       [self _sendEnterLocalNotification]; 
  92.    } 
  93.    else 
  94.    { 
  95.       [self _sendExitLocalNotification]; 
  96.    } 
  97.   
  98. @end 
 
本質上,你只是創建了一個 CLBeaconRegion 並讓 CLLocationManager 對象去監聽它。對於某些設備 beacon 監聽會不可用,比如缺少 BT4 芯片,所以你需要通過 isMonitoringAvailableForClass: 來查詢。
 
 注意: didDetermineState: 在穿越區域邊界時和 requestStateForRegion: 方法后都會被調用。所以你可以在這里做關於監聽的工作並實現 didEnterRegion 和 didExitRegion: 來保證不會過分干擾用戶。
 
剩下的代碼用來在應用在后台運行時發送本地通知,並避免對同一狀態連續發送多個相同消息。
在我測試時,當我在 iPad 上打開第一個例子中的 soft beacon,我總是會立刻收到 didEnterRegion: 消息。關閉 beacon 后會延遲 43 秒收到 didExit 消息。所以 iOS 在內部做了一些過濾來避免實時觸發。
 
后台
你會發現上面的代碼在應用在前台運行時運行的非常好,但是當應用進入后台后不會繼續發送/監聽。
 
為了在后台監聽區域,你需要將 info.plist 中的 “Location updates” 后台模式開啟。”Acts as Bluetooth LE accessory” 則用來使 soft beacon 持久。Xcode 為此提供了很友好的 UI。 
Enabling iBeacon background modes
 
這里做出的改變最終會體現在 info.plist 文件中的 UIBackgroundModes 下。
 
增加配件設置要求用戶授權藍牙文件共享。注意用戶可能拒絕或者在隱私設置中關閉授權。
 
集成了兼容 BT4 芯片的 Mac 可以發射 soft-beacon。CoreBluetooth 從 OS X 10.9 開始也可以在 Mac 上使用。2011 年以后生產的 Mac 通常含有該芯片。唯一缺少的是 CLBeaconRegion,不過如果你自己構建用來廣播 iBeacon 的字典就可以解決這個問題。至此,你所需要了解的最后一件事是 CoreBluetooth.framework 隱藏在 IOBluetooth.framework 中。
 
Matthew Robinson 創建了  BeaconOSX sample 來做這件事。
 
競爭
至寫作此文時蘋果並未發布官方的 iBeancon 規范。當我詢問蘋果相關負責人,他告訴我當他們發布時會告知我。所以只能寄希望於它們最終會這么做。與此同時,一些聰明人仍舊跑在前面並且對  iBeacon 進行逆向工程
 
幾個 iBeacon 硬件已經面世,Estimote 很快就會感受到來自他們的競爭。我粗略的搜索后發現的其他公司有:
1.  RedBearLab 出售 Arduino 插件板(也叫做 “shield”),售價 $29,有一個  iBeacon profile
2.  Kontakt.io 出售運行於可人工替換的普通電池上的 beacon,售價 $99 3個,$149 5個, $279 10個。
3.  GeoHopper 以 USB 供電的作為 iBeacon 的微型插頭: 售價 $39.99 1個,$89.99 3個,192.99 5個。
4. 你還可以[用 Raspberry Pi 和 Bluetooth LE 適配器自己做一個],設備價值 $40 左右,適配器 $10 左右。
 
以上公司中,Estimote 似乎服務最好。
 
USB 供電和可更換電池並不是十分必要,低功耗的 BTLE 據說可以維持 2 年。防水橡膠外套和內置的貼紙可以讓你很容易的將它粘貼到任何地方而不必害怕它被偷走和損害。
 
但是競爭從未停止,更多的公司一如既往的進入這個熱門領域,下一年的價格一定會降低一半甚至更多。希望 Estimote 在價格上保持競爭力,並且當可以在生產線量產 beacon 的時候進一步降低價格。
 
只有兩個不那么積極的消息。我個人認為自定義 SDK 不應該被當做 USP 使用來鎖定用戶,並且他們也不打算支持自定義的 UUID,當然也許是出於安全方面的考慮。也許它們最終也會明白過來。目前這些東西可以很容易的工作,”包裹”中其余的東西也非常有價值。
 
結論
沒什么能阻止我們將 iBeacon 技術發揚光大,使應用和服務留意用戶需求。要是真有什么的話,可能是擔心蘋果可能會更新仍然保密的 iBeacon 廣告包來包含其它值。不過我提到的所有的硬件設備也可以升級來調整廣告值。
 
唯一的問題是想象力的缺乏以及緩慢的賣家和合作方市場的低采用率。iBeacon 承諾會讓進入傳統的實體商店再次變得有趣。如此一來,任何這種公司會被很好的宣傳以快速采用 iBeacon,以此方法將顧客重新勾住和拉回實體店。
 
小型商店可以在他們用於 POS 系統的 Mac 或 iPad 上運行一個 iBeacon,避免額外話費。這允許基於 Passbook 的優惠券或當靠近收銀台時會員卡自動彈出。

 本文摘自:http://www.cocoachina.com/applenews/devnews/2014/0515/8427.html

 

參考資料

IBEACON官方文檔翻譯一

http://blog.csdn.net/meway/article/details/25311753

 

iBeacon開發:

http://esoftmobile.com/2013/12/15/ibeacons/

 

iBeacon技術解析

http://blog.csdn.net/zengraoli/article/details/19614443

 

iBeacon是什么 iBeacon怎么用:

http://jingyan.baidu.com/article/4d58d541cb12a59dd4e9c0ef.html

 

如何使用iOS 7的iBeacons來提高你的應用:

http://www.cocoachina.com/applenews/devnews/2014/0115/7705.html

 

iOS7的iBeacon技術解析

:http://www.w3c.com.cn/ios7%E7%9A%84ibeacon%E6%8A%80%E6%9C%AF%E8%A7%A3%E6%9E%90

 

 自己動手 IBeacon 室內定位 完整體驗(超詳細過程):

http://blog.csdn.net/u011341435/article/details/18948137

 

iOS藍牙調用的一般流程 - ctaodrea:

http://www.tuicool.com/articles/qYv2Mn

 

iOS CoreBluetooth 教程:

http://zhuhaibobb.blog.163.com/blog/static/2744006720136954416112/

 

iBeacons開發示例代碼:

http://wiki.viewc.com/ibeacons-example-code-cn.html

 

蘋果iOS Developer Library更新(示例代碼):

http://ios.9tech.cn/news/2014/0117/39661.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM