自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iBeacon的第一篇:基于Swift實現(xiàn)

移動開發(fā) iOS
低功耗藍牙技術(shù)現(xiàn)在幾乎是只能手機的標配。隨著這一技術(shù)的發(fā)展,蘋果在2013年WWDC大會上,蘋果推出iBeacon技術(shù)。該技術(shù)允許開發(fā)人員開發(fā)能夠使用iBeacon硬件傳感器的iOS應用程序。

[[117135]]

低功耗藍牙技術(shù)現(xiàn)在幾乎是智能手機的標配。隨著這一技術(shù)的發(fā)展,蘋果在2013年WWDC大會上,蘋果推出iBeacon技術(shù)。該技術(shù)允許開發(fā) 人員開發(fā)能夠使用iBeacon硬件傳感器的iOS應用程序,來為相應的應用程序提供更加精準的位置信息。2014年WWDC大會上,蘋果表示,對 iBeacon技術(shù)進行了改善,借助該技術(shù),應用程序現(xiàn)在能夠跟蹤到用戶所在的樓層的精確位置信息。

iBeacon的工作方式是Transmitter-Receiver,即基站-接收機模式的?;荆窟@個時候不要想到移動、聯(lián)通的那些大鐵 塔。這個基站可以是一個運行著Bluetooth 4.0 LE的設備,也可以是經(jīng)過配置的iPhone、iPad。iPhone4S和之后的iPhone、iPad3或之后的iPad,包括iPad mini都可以配置成iBeacon基站。

這里列舉個iBeacon的使用場景:在房屋中介中使用。米國一家技術(shù)公司把 iBeacon 安裝在要出售的房屋前,當用戶開車至此,不用下車就可以用中介的 APP 獲得此房屋所有相關(guān)信息和照片,不用打印及搜索。據(jù)說,效果還是很不錯的,大約有一半左右的用戶打開手機查看了相關(guān)信息。甚至于還有一個老外用 iBeacon做了一個實景的經(jīng)營游戲,點擊這里觀看。

一個基站主要有三部分標識:

1. UUID,形如:206A2476-D4DB-42F0-BF73-030236F2C756。用來標識某一個公司。比如,某個房地產(chǎn)公司的全部的基站都用同一個UUID。

2. major,用來標識某一類的beacon。比如這個房地產(chǎn)公司的北京的房子都設定為1,上海的都設定為2。

3. minor,用來標識某一個特定的beacon。比如某棟樓的某個基站。

用這個房地產(chǎn)商開發(fā)的app就可以獲取到UUID,和后面的major值和minor值。當app進入beacon的區(qū)域,探測到 UUID:”206A2476-D4DB-42F0-BF73-030236F2C756“,major為1,minor為20。那么就表明這個用戶在這 個房地產(chǎn)商的北京樓盤的編號20的樓盤。這棟樓的說明文字、圖片或者視頻等就可以展現(xiàn)在用戶面前。

下面就進入我們的教程。不過前提是你要是蘋果的開發(fā)者,因為這個app需要在真機運行。然后要有2臺設備,一個當基站,一個當接收機。最后,還得有一臺能運行Xcode的電腦。

首先創(chuàng)建一個SingleView的項目,起個名字叫MyBeacon。然后把我們需要用到的Framework加進來,把CoreBluethooth.framework和CoreLocation.framework加到項目中。

創(chuàng)建一個Storybard,并在視圖中添加如下的UIController:

關(guān)于storyboard的細節(jié)就不多說了。下面新建兩個文件:TrackViewController 和 ConfigViewController 。這時候會自動生成一個 ViewControler 類。分別把他們按照上圖所示對應到 stroyboard 的幾個ViewController 中,并添加圖中所示的 UILabel 。然后把需要現(xiàn)實APP運行結(jié)果的 UILabel 作為 IBOutlet 。

TrackViewController 的 IBOutlet 是這樣的:(以下的兩個文件都用的是Swift語言,如果你需要的話可以自行修改為OC語言)

ConfigViewController 的 IBOutlet 是這樣的:

先搞定基站部分

在 ConfigViewController 中添加如下的屬性:

第一個 CLBeaconRegin 屬性,用來設置基站需要的 proximityUUID ,major 和 minor 的給你信息。

第二個 NSDictionary 的屬性,用來獲取外設的數(shù)據(jù)。

第三個 CBPeripheralManager 的屬性,用來開啟基站的數(shù)據(jù)傳輸。

這些屬性后面的感嘆號是Swift里的一種語法。變量或者屬性的定義,在類型的后面可以是問號后者是感嘆號。他們都表示這個變量或者屬性可以是 有值的也可以是空值nil(注意這里的nil和OC里的nil是兩回事)。但是使用問號的變量或者屬性需要在使用前判斷是否有值,如果有的話通過感嘆號取 值。使用感嘆號定義的變量或者屬性則可以直接取值并使用。這里使用感嘆號定義屬性,這樣在使用的時候可以直接取值。詳細的使用會在代碼中體現(xiàn)。

要讓iOS設備開始傳輸信號還需要做些其他的事情。在viewDidLoad中調(diào)用幾個方法才能讓基站工作起來。首先調(diào)用的是initBeacon方法,之后是要把數(shù)據(jù)現(xiàn)實出來的setLabels方法。

在這里通過uuid字符串設定NSUUID實例。uuid字符串可以通過uuidgen命令在終端里生成。也可以通過代碼生成,但是這里沒有這個必要。然后其他的值major和minor分別設定為1,identifier設定為我們示例的名字。

下面我們就要考慮傳輸?shù)膯栴}了。在用戶點擊了傳輸按鈕之后開始使用設備的藍牙外設發(fā)出信號。方法如下

在這個方法里,首先通過我們設定的beaconRegion屬性獲得相關(guān)的外設數(shù)據(jù)。這個數(shù)據(jù)是NSDictionary類型的。需要說明的是,這個類型可以在Swift中使用,但是和Swift本身的Dictionary是不兼容的。

之后,初始化了CBPeripheralManager屬性。這里簡單處理,設定queue和options為nil。為了設定代理為 self 需要實現(xiàn) CBPeripheralManagerDelegate protocol 。

實現(xiàn)了這個protocol之后,還需要實現(xiàn)這個protocol的一個方法。這個方法在OC里來講是required的,所以必須實現(xiàn)。

外設的狀態(tài)中有兩個需要我們處理的。一個是PoweredOn一個PoweredOff。On了就讓peripheralManager開始對 外發(fā)出信號。Off了就停止發(fā)出信號。所以呢,如果直接在transmitAction中調(diào)用代碼startAdvertising是設備對外發(fā)出信號的 話,會報錯。Console會打印出”CBPeripheralManager is not Powered on“。所以我們在以上的代碼中在Pwoered On的時候再開始調(diào)用代碼發(fā)出信號。發(fā)出信號的時候呢,我們給了advertising方法傳入了從beaconRegion取出來的 NSDictionary數(shù)據(jù)。這也是接收機辨識基站用到的數(shù)據(jù)。

之后我們把數(shù)據(jù)顯示在界面上。

這個方法很簡單,只要在viewDidLoad里調(diào)用setLabels方法就可以。全部設定在基站里的數(shù)據(jù)都會顯示在界面上了。其中包括 uuid、major和minor,最后是我們設定的identifier。用Swift比用OC寫代碼是會少一些量,如果你對Swift足夠熟的話。比 如,取得一個值的字符竄值的時候就不用[NSString stringWithFormat:"..."]這么麻煩的寫法了。

我們的app已經(jīng)可以作為基站使用了。但是沒有接收機的話這個app可是一點都不好玩。在下面就開始處理接收機的部分。

接收iBeacon信息

接收iBeacon信號的底層功能已經(jīng)在Core Location Framework里實現(xiàn)了。在iOS7里,可以自動識別你是否進入了一個區(qū)域以及其他的距離之類的信息。

下面在TrackViewController中處理,首先把CoreLocation庫的頭文件加進來。然后增加下面的兩個屬性:

CLBeaconRegion屬性是用來定義我們要尋找的beacon的。這個app只會接收到有同樣的UUID的的發(fā)射機發(fā)射的信號。

CLLocationManager屬性是用來建立位置服務并搜索beacon的。

在viewDidLoad方法中添加如下代碼:

首先,要初始化CLLocationManager,然后把代理設置為self。當然設定代理之前我么需要實現(xiàn)CLLocationManagerDelegate protocol,具體的就不寫出來了。然后調(diào)用initRegion方法,這個會在后面給出詳情。

首先創(chuàng)建UUID實例。用來初始化這個實例的的uuid字符串必須和基站的uuid字符串是一樣的,要不互相找不見。

然后初始化beaconRegion,proximityUUID就是前面創(chuàng)建的UUID實例,identitifer就是在基站中用到的 identifier字符串。然后開始監(jiān)測前面初始化出來的beaconRegion。調(diào)用代碼 self.trackLocationManager.startMonitoringForRegion(self.beaconRegion)開始檢 測。

接下來,我們需要監(jiān)測這個app進入和離開區(qū)域的事件,代碼如下:

第一個方法是進入的,當你接收到基站信號的時候這個方法就開始執(zhí)行(當然你要離基站足夠近)。然后調(diào)用locationManager的startRagingBeaconsInRegion方法,病傳入我們之前定義好的beaconRegion屬性。

第二個方法很簡單,就是在離開這個區(qū)域的時候就停止執(zhí)行,調(diào)用locationManager的stopRagingBeaconsInRegion。

下面是didRangeBeacons方法:

首先判斷方法傳入的beacons數(shù)組的元素有多少。如果有0個的時候什么都不做。如果有一個或以上的話,這里簡單處理只取最后一個beacon來處理。

之后的代碼都只是從beacon中取出數(shù)據(jù)來現(xiàn)實在界面上,比如UUID,major,minor,accuracy和RSSI。這些值會隨著 接收機和基站的距離不同以及基站的設置不同而一直改變。尤其accuracy和RSSI都是beacon用來現(xiàn)實距離的。其中proximity會顯示四 個值:Unknown、Immediate、Near和Far。Immediate是半米以內(nèi),Near遠一些,F(xiàn)ar更遠。RSSI是信號強度。

運行程序

現(xiàn)在這個app可以運行了。但是需要分別運行在兩臺可以兼容低功耗藍牙的設備上。一臺當基站一臺當接收機。

當你從足夠遠(10~20米)的地方想基站的方向走的時候,一個你”didEnterRange”那個didRangeBeacons方法就會被調(diào)用,這是就可以從方法中傳入的beacon數(shù)組中取出值來現(xiàn)實在界面上。

但是有一點需要注意的是,我們處理的基站只有一個,所以每次都取出beacon數(shù)組的最后一個。如果有多個beacon基站的話就需要循環(huán)beacon數(shù)組的每一個元素,判斷這個元素的proximity是Immdiate還是Near還是Far等。

每次測試的時候都進入或者離開一個區(qū)域太麻煩。可以在viewDidLoad方法中添加一行代碼:

然后添加如下方法:

動調(diào)用了didStartMonitoringForRegion,在這個方法中調(diào)用了trackLocationManager的startRangingBeaconsInRegion方法。這樣雖然不完美,但是足夠測試了。

下面是代碼列表:

ConfigViewController:

  1. import UIKit  
  2. import CoreLocation  
  3. import CoreBluetooth  
  4.   
  5. class ConfigViewController: UIViewController, CBPeripheralManagerDelegate {  
  6.      
  7.      // properties  
  8.      @IBOutlet var uuidLabel: UILabel  
  9.      @IBOutlet var majorLabel: UILabel  
  10.      @IBOutlet var minorLabel: UILabel  
  11.      @IBOutlet var identityLabel: UILabel  
  12.      @IBOutlet var transmitButton: UIButton  
  13.        
  14.      var beaconRegion : CLBeaconRegion!  
  15.      var beaconPeripheralData : NSDictionary!  
  16.      var peripheralManager : CBPeripheralManager!  
  17.        
  18.      override func viewDidLoad() {  
  19.          super.viewDidLoad()  
  20.    
  21.          self.initBeacon()  
  22.          self.setLabels()  
  23.      }  
  24.        
  25.      func initBeacon(){  
  26.          self.beaconRegion = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "206A2476-D4DB-42F0-BF73-030236F2C756")  
  27.              , major: 1, minor: 1, identifier: "com.mybeacon.region")  
  28.      }  
  29.        
  30.      func setLabels(){  
  31.          self.uuidLabel.text = self.beaconRegion.proximityUUID.UUIDString  
  32.          self.majorLabel.text = self.beaconRegion.major.stringValue  
  33.          self.minorLabel.text = self.beaconRegion.minor.stringValue  
  34.          self.identityLabel.text = self.beaconRegion.identifier  
  35.      }  
  36.    
  37.      override func didReceiveMemoryWarning() {  
  38.          super.didReceiveMemoryWarning()  
  39.          // Dispose of any resources that can be recreated.  
  40.      }  
  41.        
  42.      @IBAction func transmitAction(sender: UIButton) {  
  43.          self.beaconPeripheralData = self.beaconRegion.peripheralDataWithMeasuredPower(nil)  
  44.          self.peripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil)  
  45.      }  
  46.    
  47.      // delegate methods  
  48.      func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager!){  
  49.          if peripheral.state == CBPeripheralManagerState.PoweredOn {  
  50.              println("Powered on")  
  51.              self.peripheralManager.startAdvertising(self.beaconPeripheralData)  
  52.          }  
  53.          else if peripheral.state == CBPeripheralManagerState.PoweredOff {  
  54.              println("Powered off")  
  55.              self.peripheralManager.stopAdvertising()  
  56.          }  
  57.      }  
  58.  }  

TrackViewController:

  1. import UIKit  
  2. import CoreLocation  
  3.   
  4. class TrackViewController: UIViewController, CLLocationManagerDelegate {  
  5.   
  6.     @IBOutlet var beaconLabel: UILabel  
  7.     @IBOutlet var uuidLabel: UILabel  
  8.     @IBOutlet var majorLabel: UILabel  
  9.     @IBOutlet var minorLabel: UILabel  
  10.     @IBOutlet var accuracyLabel: UILabel  
  11.     @IBOutlet var distanceLabel: UILabel  
  12.     @IBOutlet var rssiLabel: UILabel  
  13.       
  14.     var beaconRegion : CLBeaconRegion!  
  15.     var trackLocationManager : CLLocationManager!  
  16.       
  17.     override func viewDidLoad() {  
  18.         super.viewDidLoad()  
  19.   
  20.         self.trackLocationManager = CLLocationManager();  
  21.         self.trackLocationManager.delegate = self;  
  22.         self.initRegion()  
  23.         self.locationManager(self.trackLocationManager, didStartMonitoringForRegion: self.beaconRegion)  
  24.     }  
  25.       
  26.     func initRegion(){  
  27.         var uuid = NSUUID(UUIDString: "206A2476-D4DB-42F0-BF73-030236F2C756")  
  28.         self.beaconRegion = CLBeaconRegion(proximityUUID: uuid, identifier: "com.mybeacon.region")  
  29.         self.trackLocationManager.startMonitoringForRegion(self.beaconRegion)  
  30.     }  
  31.       
  32.     func locationManager(manager: CLLocationManager!, didStartMonitoringForRegion region: CLRegion!) {  
  33.         self.trackLocationManager.startRangingBeaconsInRegion(self.beaconRegion)  
  34.     }  
  35.   
  36.     override func didReceiveMemoryWarning() {  
  37.         super.didReceiveMemoryWarning()  
  38.         // Dispose of any resources that can be recreated.  
  39.     }  
  40.       
  41.     func locationManager(manager: CLLocationManager!, didEnterRegion region: CLRegion!) {  
  42.         self.trackLocationManager.startRangingBeaconsInRegion(self.beaconRegion)  
  43.     }  
  44.       
  45.     func locationManager(manager: CLLocationManager!, didExitRegion region: CLRegion!) {  
  46.         self.trackLocationManager.stopRangingBeaconsInRegion(self.beaconRegion)  
  47.         self.beaconLabel.text = "No"  
  48.     }  
  49.       
  50.     func locationManager(manager: CLLocationManager!, didRangeBeacons beacons: [AnyObject]!, inRegion region: CLBeaconRegion!) {  
  51.         println("beacons count" + String(beacons.count))  
  52.         if beacons.count <= 0 {  
  53.             return  
  54.         }  
  55.           
  56.         var beacon: AnyObject = beacons[beacons.count - 1]  
  57.           
  58.         self.beaconLabel.text = "Yes"  
  59.         self.uuidLabel.text = beacon.proximityUUID ? beacon.proximityUUID!.UUIDString : ""  
  60.         self.majorLabel.text = beacon.major ? beacon.major!.stringValue : ""  
  61.         self.minorLabel.text = beacon.minor ? beacon.minor!.stringValue : ""  
  62.         self.accuracyLabel.text = beacon.accuracy ? String(beacon.accuracy) : ""  
  63.         if beacon.proximity {  
  64.   
  65.             switch(beacon.proximity!){  
  66.             case .Unknown:  
  67.                 self.distanceLabel.text = "Unknown proximity"  
  68.             case CLProximity.Immediate:  
  69.                 self.distanceLabel.text = "Immediate"  
  70.             case CLProximity.Near:  
  71.                 self.distanceLabel.text = "Near"  
  72.             case CLProximity.Far:  
  73.                 self.distanceLabel.text = "Far"  
  74.             default:  
  75.             }  
  76.         }  
  77.         self.rssiLabel.text = beacon.rssi ? beacon.rssi!.description : ""  
  78.     }  
  79. }  

 

責任編輯:chenqingxiang 來源: cocoachina
相關(guān)推薦

2011-03-14 15:52:50

Windows Azu

2015-05-27 09:32:29

iOS應用架構(gòu)

2011-06-21 09:14:01

Oracle查詢

2017-04-10 13:43:34

AndroidGradleAS

2022-08-01 08:18:58

網(wǎng)絡網(wǎng)絡協(xié)議

2014-03-28 13:14:33

2015-07-20 16:37:11

2015-08-20 10:13:34

2013-04-15 10:00:14

Hyper-V虛擬化網(wǎng)絡

2021-04-14 07:55:45

Swift 協(xié)議Protocol

2021-04-20 06:12:09

Swift 反射 Mirror反射機制

2021-05-10 07:38:09

Swift 泛型Tips

2021-12-04 22:05:02

Linux

2022-05-17 08:02:55

GoTryLock模式

2021-09-05 07:55:36

Lsm核心實現(xiàn)

2021-05-14 16:34:12

Semaphore原理

2021-05-28 10:02:05

Swift5 字符串String

2021-06-04 10:18:03

Trie字典樹數(shù)據(jù)

2022-04-08 08:32:40

mobx狀態(tài)管理庫redux

2021-04-08 11:00:56

CountDownLaJava進階開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號