iOS 藍牙定位  iBeacons

原文地址:iOS 藍牙定位  iBeacons作者:scanf

 

什麼是iBeacons

 

iBeacons是蘋果在2013年WWDC上推出一項基於藍牙4.0(Bluetooth LE | BLE | Bluetooth Smart)的精準微定位技術,當你的手持設備靠近一個Beacon基站時,設備就能夠感應到Beacon信號,範圍可以從幾毫米到50米。iBeacons相比較於原來的藍牙技術有幾個特點:

 

1.首先它不需要配對,所以你不用擔心一個名爲『一頭母豬』的藍牙設備請求和你配對^_^。蘋果在之前對藍牙設備的控制比較嚴格,所以只有通過MFI認證過的藍牙設備才能與iDevice連接,而藍牙4.0就沒有這些限制了;

2.準確與距離。普通的藍牙(藍牙4.0之前)一般的傳輸距離在0.1~10m,而iBeacons信號可以精確到毫米級別,並且最大可支持到50m的範圍;

3.功耗更低。其實藍牙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基站信息,包括proximityUUID、major、minor以及當該Pass接收到該beacon信號時需要顯示的文本relevantText。這樣,當你把這個包含beacons信息的Pass加入到Passbook,並靠近beacons中的某個基站時,該Pass的信息就會自動出現在手機的鎖屏界面上,並顯示relevantText中的文本。當然得有一個前提:手機打開藍牙。

  1. "beacons":[ 
  2.     { 
  3.      "proximityUUID" : "E2C56DB5-DFFB-48D2-B060-D0F5A71096E0"
  4.      "relevantText" : "TechDay 2013 Beijing"
  5.      "major" : 0, 
  6.      "minor" : 0 
  7.      } 
  8.   ], 

和 locations 字段一樣,一個Pass文件中最多支持10個beacon基站信息。其實這樣做也是出於省電考慮,因爲系統在每次接收到beacon信號時,都會在Passbook庫中輪詢每一個Pass的beacons信息,匹配後纔將它顯示出來,所以如果不做數量限制,耗電量可能就難以接受,locations原理也類似。

 

iBeacons開發

Beacon Monitoring

因爲是一種定位技術,蘋果將iBeacons相關的接口放到了 CoreLocation.framework 。在iOS7之前,我們可以通過CLRegion定義一個地理區域,來跟蹤設備在該區域內的運動情況,iOS7之後,CLRegion被完全變成了一個抽象類,子類CLCircularRegion和CLBeaconRegion分別承擔實現一個地理區域和Beacon信號區域的功能。

 

即iOS7之後的CLRegion主要有兩個屬性:

  1. @interface CLRegion : NSObject  
  2. @property (nonatomic, assign) BOOL notifyOnEntry; 
  3. @property (nonatomic, assign) BOOL notifyOnExit; 
  4. @end 

notifyOnEntry和notifyOnExit分別標記是否在進入和退出該區域時調用對用代理方法。CLBeaconRegion另外增加了一個屬性notifyEntryStateOnDisplay標記是否在用戶手機屏幕點亮時調用代理方法。

 

一個beacon基站主要有三個屬性,即上面說到過的:proximityUUID、 major、 minor,對應到CoreLocation中的CLBeacon類:

  1. @interface CLBeacon : NSObject  
  2. //... 
  3. @property (readonly, nonatomic) NSUUID *proximityUUID; 
  4. @property (readonly, nonatomic) NSNumber *major; 
  5. @property (readonly, nonatomic) NSNumber *minor; 
  6. //... 
  7. @end 

創建一個 CLBeaconRegion ,我們需要先創建一個目標監控區域唯一的UUID:

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

創建完Regoin後,我們需要對該Region進行監控以獲取是否進入該區域及一些距離等信息,我們需要創建一個CLLocationManager實例然後調用startMonitoringForRegion:方法來監控上面的BeaconRegion:

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

剩下的就是通過CLLocationManagerDelegate中的各個方法來獲取監控區域內的所有CLBeacon基站,進入或退出某個Beacon區域,計算舉例某個CLBeacon的距離等。

 

Beacon Broadcasting

前面我們說到所有支持藍牙4.0的iDevice都能夠作爲beacon基站發射信號,這就需要 CoreBluetooth.framework 的支持。 我們需要創建一個CBPeripheralManager實例,然後發射beacon廣播信號:

  1. //爲beacon基站創建一個唯一標示 
  2. NSUUID *myUUID = [[NSUUID alloc] initWithUUIDString:@"A4E86DC5-A0E2-G7W0-B060-A0F5A71096C0"]; 
  3. CLBeaconRegion *myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:myUUID identifier:@"iBeacons"]; 
  4.  
  5. //獲取該Beacon區域的信號信息 
  6. NSDictionary *peripheralData = [myBeaconRegion peripheralDataWithMeasuredPower:nil]; 
  7.  
  8. //創建並廣播Beacon信號 
  9. CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()]; 
  10. [peripheralManager startAdvertising:peripheralData]; 

當然你還需要在CBPeripheralManagerDelegate代理方法:peripheralManagerDidUpdateState:根據不同的狀態做一些處理。

 

總結

蘋果的偉大之處就是在於將複雜的技術以簡單的形式呈現出來,相信看完本文你已經對iBeacons開發相關的技術有了很好的瞭解,然而iBeacons技術本身的應用纔是真正體現價值的地方,相信它能給很多行業帶來變革。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章