iOS iBeacon開發(fā)筆記

2015.10.19

airlocate 本文摘抄加個人總結(jié)

=========

airlocate顯示如何使用這個監(jiān)控范圍clbeaconregions。

代碼還提供了一個例子,你如何能校準(zhǔn)和配置iOS設(shè)備作為信標(biāo)corebluetooth。

您可以配置一個iOS設(shè)備作為信標(biāo)如下:

1)獲得兩個iOS設(shè)備配備藍(lán)牙LE。一個將是目標(biāo)設(shè)備,一個將是一個遠(yuǎn)程(校準(zhǔn))設(shè)備。

2)負(fù)載和啟動這個應(yīng)用程序在這兩個設(shè)備上。

3)通過選擇配置和打開啟用的開關(guān),將目標(biāo)設(shè)備轉(zhuǎn)為信標(biāo)。

4)取校準(zhǔn)裝置,并將一米距離的目標(biāo)設(shè)備移動。

5)在校準(zhǔn)裝置上通過選擇校準(zhǔn)校準(zhǔn)過程。

6)從表格視圖中選擇目標(biāo)設(shè)備。

7)校準(zhǔn)過程將開始。你應(yīng)該在這一過程中,在這個過程中,從一邊到另一邊的校準(zhǔn)裝置的波。

8)當(dāng)校準(zhǔn)過程完成后,它會顯示一個校準(zhǔn)的RSSI值在屏幕上。

9)在目標(biāo)設(shè)備上,返回到配置屏幕并輸入該值在測量功率下。

注:校準(zhǔn)過程是可選的,但建議將微調(diào)范圍為您的環(huán)境。

您可以配置一個iOS設(shè)備沒有校準(zhǔn)它不指定測量功率信標(biāo)。

如果未指定測量功率,CoreLocation默認(rèn)為預(yù)定值。

一旦你設(shè)置你的目標(biāo)設(shè)備作為一個燈塔,你可以使用這個應(yīng)用程序演示燈塔范圍和監(jiān)測。

要演示范圍,選擇遠(yuǎn)程設(shè)備。alrangingviewcontroller范圍一套clbeaconregions。

要演示監(jiān)控,選擇遠(yuǎn)程設(shè)備監(jiān)控。almonitoringviewcontroller允許您配置一個clbeaconregion監(jiān)測。

版權(quán)所有(2013)蘋果公司保留所有權(quán)利。

零.寫在前面

關(guān)于測試:建議下載Estimote的app,作為基站,得到它的UUID,majon,minor參數(shù)。

關(guān)于設(shè)備:iBeacon 使用Bluetooth

LE技術(shù),所以你必須要有一個內(nèi)置有低功耗藍(lán)牙的 iOS 設(shè)備以便與 iBeacon協(xié)同工作。目前這個列表里包含如下一些設(shè)備:

iPhone 4s 或更新的

第三代 iPad 或更新的

iPad mini 或更新的

第五代iPod touch 或更新的

系統(tǒng)版本7.0以上

測試結(jié)果:rssi信號輕度大概到-90,有效距離大概為30m。

用途:藍(lán)牙BLE,定位,智能家居等。自己還做了個上班打卡的

app,只有進(jìn)入有效范圍內(nèi)才能打卡成功。

UUID、主要、次要標(biāo)識符

如果你不熟悉 iBeacon,你可能也不熟悉術(shù)語UUID、主要值(major

value)和次要值(minor value)。

一個 iBeacon除了是一個低功耗藍(lán)牙設(shè)備之外什么也不是,它們以特定結(jié)構(gòu)發(fā)布信息。這些特定的東西超出本教程的范圍,但要明白的一件重要事情是 iOS之所以能夠監(jiān)控這些 iBeacon 就是基于UUID、主要值和次要值。

UUDID 是 Universally UniqueIdentifier(通用唯一標(biāo)識符)的縮寫,它實際上是一個隨機字符串;B558CBDA-4472-4211-A350-FF1196FFE8C8就是一個例子。在 iBeacon 的討論范圍里,一個 UUID 通常用于表示你的頂層標(biāo)識。作為開發(fā)者如果你生成一個 UUID并將其分配給你的 iBeacon 設(shè)備,那么當(dāng)一個設(shè)備檢測到你的 iBeacon 時,它就知道它是在和哪個 iBeacon通信。

主要值與次要值在 UUID 之上提供了稍多的粒度。這些值只是 16 位無符號整數(shù),能夠標(biāo)識每個單獨的 iBeacon

,甚至是具有同樣 UUID 的哪些。

舉個例子,如果你有多間百貨公司,那么你所有的 iBeacon 發(fā)射器都可有同一個 UUID

,但每個店都有它自己的主要值,而里面的每個部門就會有它自己的次要值。你的應(yīng)用能夠?qū)σ粋€位于你在邁阿密、佛羅里達(dá)店的鞋類部們里的

iBeacon 做出響應(yīng)。

一.iBeacon的使用

開始監(jiān)聽你的Ibeacon。

在iOS8里面蘋果改變了地位的開啟方式(iBeacon的使用是基于藍(lán)牙和定位的),首先要在工程里的info.plist增加字段NSLocationAlwaysUsageDescription(這個是允許一直在后臺運行的)

可能你會有些奇怪 iBeacon 會與 Core Location 相關(guān),畢竟它是藍(lán)牙設(shè)備,但考慮到 iBeacon

提供微定位信息對應(yīng) GPS 提供宏定位信息,也就不奇怪了。在將一個 iOS 設(shè)備當(dāng)作一個iBeacon 而編程時,你就要利用 Core

Bluetooth 框架,而在監(jiān)控 iBeacon 時,你只需同 Core Location 打交道。

當(dāng)程序運行起來你會發(fā)現(xiàn),設(shè)備左下角有你的程序 icon 圖標(biāo)

.h文件

#import

#import

@interface ViewController : UIViewController

@property (nonatomic, strong) NSArray

*beaconArr;//存放掃描到的iBeacon

@property (strong, nonatomic) CLBeaconRegion

*beacon1;//被掃描的iBeacon

@property (strong, nonatomic) CLLocationManager *

locationmanager;

@end

.m文件

#define BEACONUUID

@"12334566-7173-4889-9579-954995439125"http://iBeacon的uuid可以換成自己設(shè)備的uuid

- (void)viewDidLoad {

[super viewDidLoad];

self.tableView = [[UITableView alloc]

initWithFrame:CGRectMake(0, 20, 320, 568)];

self.tableView.delegate = self;

self.tableView.dataSource = self;

[self.view addSubview:self.tableView];

self.beaconArr = [[NSArray alloc] init];

self.locationmanager = [[CLLocationManager alloc]

init];//初始化

self.locationmanager.delegate = self;

self.beacon1 = [[CLBeaconRegion alloc]

initWithProximityUUID:[[NSUUID alloc]

initWithUUIDString:BEACONUUID]

identifier:@"media"];//初始化監(jiān)測的iBeacon信息

[self.locationmanagerrequestAlwaysAuthorization];//設(shè)置location是一直允許

}

- (void)locationManager:(CLLocationManager *)managerdidChangeAuthorizationStatus:(CLAuthorizationStatus)status{

if (status == kCLAuthorizationStatusAuthorizedAlways) {

[self.locationmanagerstartMonitoringForRegion:self.beacon1];//開始MonitoringiBeacon

}

}

{

//發(fā)現(xiàn)有iBeacon進(jìn)入監(jiān)測范圍

-(void)locationManager:(CLLocationManager *)manager

didEnterRegion:(CLRegion *)region{

[self.locationmanagerstartRangingBeaconsInRegion:self.beacon1];//開始RegionBeacons

}

//找的iBeacon后掃描它的信息

- (void)locationManager:(CLLocationManager *)manager

didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion

*)region{

//如果存在不是我們要監(jiān)測的iBeacon那就停止掃描他

if (![[region.proximityUUID UUIDString]

isEqualToString:BEACONUUID]){

[self.locationmanager stopMonitoringForRegion:region];

[self.locationmanager stopRangingBeaconsInRegion:region];

}

//打印所有iBeacon的信息

for (CLBeacon* beacon in beacons) {

NSLog(@"rssi is :%ld",beacon.rssi);

NSLog(@"beacon.proximity %ld",beacon.proximity);

......

}

self.beaconArr = beacons;

[self.tableView reloadData];

}

- (NSInteger)tableView:(UITableView *)tableView

numberOfRowsInSection:(NSInteger)section

{

return self.beaconArr.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *ident = @"cell";

UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:ident];

if (!cell) {

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:ident];

}

CLBeacon *beacon = [self.beaconArr

objectAtIndex:indexPath.row];

cell.textLabel.text = [beacon.proximityUUID UUIDString];

NSString *str;

switch (beacon.proximity) {

case CLProximityNear:

str = @"近";

break;

case CLProximityImmediate:

str = @"超近";

break;

case CLProximityFar:

str = @"遠(yuǎn)";

break;

case CLProximityUnknown:

str = @"不見了";

break;

default:

break;

}

cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %ld

%@ %@",str,beacon.rssi,beacon.major,beacon.minor];

return cell;

}

//一些錯誤處理,因為你正在同非常具體的硬件特性打交道,你需要知道任何原因?qū)е碌谋O(jiān)控和測距失敗

- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error {NSLog(@"Failed monitoring region:%@", error);}- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {NSLog(@"Location manager failed:%@", error);

}

二.ibeacon的參數(shù)

uuid唯一標(biāo)識此類iBeacon。

proximity遠(yuǎn)近范圍的,有Near(在幾米內(nèi)),Immediate(在幾厘米內(nèi)),F(xiàn)ar(超過 10

米以外,不過在測試中超不過10米就是far),Unknown(無效)

major和minor組合后區(qū)分同一類型下的iBeacon。

accuracy和iBeacon的距離

rssi信號輕度為負(fù)值,越接近0信號越強,等于0時無法獲取信號強度

三.通知

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {if ([regionisKindOfClass:[CLBeaconRegionclass]]) {? ? ? ? UILocalNotification *notification = [[UILocalNotificationalloc]init];? ? ? ? notification.alertBody =@"Are you forgetting something?";? ? ? ? notification.soundName =@"Default";? ? ? ? [[UIApplicationsharedApplication]presentLocalNotificationNow:notification];? ? }}

你的位置管理器將在你離開某個區(qū)域時調(diào)用上面的方法,這就是這個應(yīng)用有用的時刻。你不需要在你接近你的電腦包時被告知,只需在你離開它太遠(yuǎn)時通知你。

此處你檢查區(qū)域是否是一個CLBeaconRegion,因為如果你同時也在執(zhí)行地理定位區(qū)域監(jiān)視的話,它還可能是一個CLCircularRegion。然后你就發(fā)送一個本地通知,附帶一個消息“Are you forgetting something?” 。

編譯并運行你的應(yīng)用;離開某個你的注冊的 iBeacon,然后一旦你離開得足夠遠(yuǎn),你就會看到通知彈出來。

參考地址:https://github.com/nixzhu/dev-blog/blob/master/2014-04-23-ios7-ibeacons-tutorial.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容