2015.10.19
airlocate 本文摘抄加個(gè)人總結(jié)
=========
airlocate顯示如何使用這個(gè)監(jiān)控范圍clbeaconregions敛助。
代碼還提供了一個(gè)例子止潘,你如何能校準(zhǔn)和配置iOS設(shè)備作為信標(biāo)corebluetooth芒帕。
您可以配置一個(gè)iOS設(shè)備作為信標(biāo)如下:
1)獲得兩個(gè)iOS設(shè)備配備藍(lán)牙LE。一個(gè)將是目標(biāo)設(shè)備绊寻,一個(gè)將是一個(gè)遠(yuǎn)程(校準(zhǔn))設(shè)備馏予。
2)負(fù)載和啟動(dòng)這個(gè)應(yīng)用程序在這兩個(gè)設(shè)備上。
3)通過(guò)選擇配置和打開(kāi)啟用的開(kāi)關(guān)戚丸,將目標(biāo)設(shè)備轉(zhuǎn)為信標(biāo)。
4)取校準(zhǔn)裝置科吭,并將一米距離的目標(biāo)設(shè)備移動(dòng)昏滴。
5)在校準(zhǔn)裝置上通過(guò)選擇校準(zhǔn)校準(zhǔn)過(guò)程。
6)從表格視圖中選擇目標(biāo)設(shè)備对人。
7)校準(zhǔn)過(guò)程將開(kāi)始用含。你應(yīng)該在這一過(guò)程中昭娩,在這個(gè)過(guò)程中鸟废,從一邊到另一邊的校準(zhǔn)裝置的波塔猾。
8)當(dāng)校準(zhǔn)過(guò)程完成后必搞,它會(huì)顯示一個(gè)校準(zhǔn)的RSSI值在屏幕上。
9)在目標(biāo)設(shè)備上没佑,返回到配置屏幕并輸入該值在測(cè)量功率下原叮。
注:校準(zhǔn)過(guò)程是可選的,但建議將微調(diào)范圍為您的環(huán)境咱台。
您可以配置一個(gè)iOS設(shè)備沒(méi)有校準(zhǔn)它不指定測(cè)量功率信標(biāo)络拌。
如果未指定測(cè)量功率,CoreLocation默認(rèn)為預(yù)定值回溺。
一旦你設(shè)置你的目標(biāo)設(shè)備作為一個(gè)燈塔春贸,你可以使用這個(gè)應(yīng)用程序演示燈塔范圍和監(jiān)測(cè)。
要演示范圍遗遵,選擇遠(yuǎn)程設(shè)備萍恕。alrangingviewcontroller范圍一套clbeaconregions。
要演示監(jiān)控车要,選擇遠(yuǎn)程設(shè)備監(jiān)控允粤。almonitoringviewcontroller允許您配置一個(gè)clbeaconregion監(jiān)測(cè)。
版權(quán)所有(2013)蘋果公司保留所有權(quán)利翼岁。
零.寫在前面
關(guān)于測(cè)試:建議下載Estimote的app类垫,作為基站,得到它的UUID琅坡,majon阔挠,minor參數(shù)。
關(guān)于設(shè)備:iBeacon 使用Bluetooth
LE技術(shù)脑蠕,所以你必須要有一個(gè)內(nèi)置有低功耗藍(lán)牙的 iOS 設(shè)備以便與 iBeacon協(xié)同工作购撼。目前這個(gè)列表里包含如下一些設(shè)備:
iPhone 4s 或更新的
第三代 iPad 或更新的
iPad mini 或更新的
第五代iPod touch 或更新的
系統(tǒng)版本7.0以上
測(cè)試結(jié)果:rssi信號(hào)輕度大概到-90,有效距離大概為30m谴仙。
用途:藍(lán)牙BLE迂求,定位,智能家居等晃跺。自己還做了個(gè)上班打卡的
app揩局,只有進(jìn)入有效范圍內(nèi)才能打卡成功。
UUID掀虎、主要凌盯、次要標(biāo)識(shí)符
如果你不熟悉 iBeacon,你可能也不熟悉術(shù)語(yǔ)UUID烹玉、主要值(major
value)和次要值(minor value)驰怎。
一個(gè) iBeacon除了是一個(gè)低功耗藍(lán)牙設(shè)備之外什么也不是,它們以特定結(jié)構(gòu)發(fā)布信息二打。這些特定的東西超出本教程的范圍县忌,但要明白的一件重要事情是 iOS之所以能夠監(jiān)控這些 iBeacon 就是基于UUID、主要值和次要值。
UUDID 是 Universally UniqueIdentifier(通用唯一標(biāo)識(shí)符)的縮寫症杏,它實(shí)際上是一個(gè)隨機(jī)字符串装获;B558CBDA-4472-4211-A350-FF1196FFE8C8就是一個(gè)例子。在 iBeacon 的討論范圍里厉颤,一個(gè) UUID 通常用于表示你的頂層標(biāo)識(shí)穴豫。作為開(kāi)發(fā)者如果你生成一個(gè) UUID并將其分配給你的 iBeacon 設(shè)備,那么當(dāng)一個(gè)設(shè)備檢測(cè)到你的 iBeacon 時(shí)逼友,它就知道它是在和哪個(gè) iBeacon通信精肃。
主要值與次要值在 UUID 之上提供了稍多的粒度。這些值只是 16 位無(wú)符號(hào)整數(shù)翁逞,能夠標(biāo)識(shí)每個(gè)單獨(dú)的 iBeacon
肋杖,甚至是具有同樣 UUID 的哪些。
舉個(gè)例子挖函,如果你有多間百貨公司状植,那么你所有的 iBeacon 發(fā)射器都可有同一個(gè) UUID
,但每個(gè)店都有它自己的主要值怨喘,而里面的每個(gè)部門就會(huì)有它自己的次要值津畸。你的應(yīng)用能夠?qū)σ粋€(gè)位于你在邁阿密、佛羅里達(dá)店的鞋類部們里的
iBeacon 做出響應(yīng)必怜。
一.iBeacon的使用
開(kāi)始監(jiān)聽(tīng)你的Ibeacon肉拓。
在iOS8里面蘋果改變了地位的開(kāi)啟方式(iBeacon的使用是基于藍(lán)牙和定位的),首先要在工程里的info.plist增加字段NSLocationAlwaysUsageDescription(這個(gè)是允許一直在后臺(tái)運(yùn)行的)
可能你會(huì)有些奇怪 iBeacon 會(huì)與 Core Location 相關(guān)梳庆,畢竟它是藍(lán)牙設(shè)備暖途,但考慮到 iBeacon
提供微定位信息對(duì)應(yīng) GPS 提供宏定位信息,也就不奇怪了膏执。在將一個(gè) iOS 設(shè)備當(dāng)作一個(gè)iBeacon 而編程時(shí)驻售,你就要利用 Core
Bluetooth 框架,而在監(jiān)控 iBeacon 時(shí)更米,你只需同 Core Location 打交道欺栗。
當(dāng)程序運(yùn)行起來(lái)你會(huì)發(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)測(cè)的iBeacon信息
[self.locationmanagerrequestAlwaysAuthorization];//設(shè)置location是一直允許
}
- (void)locationManager:(CLLocationManager *)managerdidChangeAuthorizationStatus:(CLAuthorizationStatus)status{
if (status == kCLAuthorizationStatusAuthorizedAlways) {
[self.locationmanagerstartMonitoringForRegion:self.beacon1];//開(kāi)始MonitoringiBeacon
}
}
{
//發(fā)現(xiàn)有iBeacon進(jìn)入監(jiān)測(cè)范圍
-(void)locationManager:(CLLocationManager *)manager
didEnterRegion:(CLRegion *)region{
[self.locationmanagerstartRangingBeaconsInRegion:self.beacon1];//開(kāi)始RegionBeacons
}
//找的iBeacon后掃描它的信息
- (void)locationManager:(CLLocationManager *)manager
didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion
*)region{
//如果存在不是我們要監(jiān)測(cè)的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 = @"不見(jiàn)了";
break;
default:
break;
}
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %ld
%@ %@",str,beacon.rssi,beacon.major,beacon.minor];
return cell;
}
//一些錯(cuò)誤處理征峦,因?yàn)槟阏谕浅>唧w的硬件特性打交道迟几,你需要知道任何原因?qū)е碌谋O(jiān)控和測(cè)距失敗
- (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)識(shí)此類iBeacon。
proximity遠(yuǎn)近范圍的栏笆,有Near(在幾米內(nèi))类腮,Immediate(在幾厘米內(nèi)),F(xiàn)ar(超過(guò) 10
米以外竖伯,不過(guò)在測(cè)試中超不過(guò)10米就是far)存哲,Unknown(無(wú)效)
major和minor組合后區(qū)分同一類型下的iBeacon因宇。
accuracy和iBeacon的距離
rssi信號(hào)輕度為負(fù)值七婴,越接近0信號(hào)越強(qiáng)祟偷,等于0時(shí)無(wú)法獲取信號(hào)強(qiáng)度
三.通知
- (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];? ? }}
你的位置管理器將在你離開(kāi)某個(gè)區(qū)域時(shí)調(diào)用上面的方法,這就是這個(gè)應(yīng)用有用的時(shí)刻打厘。你不需要在你接近你的電腦包時(shí)被告知修肠,只需在你離開(kāi)它太遠(yuǎn)時(shí)通知你。
此處你檢查區(qū)域是否是一個(gè)CLBeaconRegion户盯,因?yàn)槿绻阃瑫r(shí)也在執(zhí)行地理定位區(qū)域監(jiān)視的話嵌施,它還可能是一個(gè)CLCircularRegion。然后你就發(fā)送一個(gè)本地通知莽鸭,附帶一個(gè)消息“Are you forgetting something?” 吗伤。
編譯并運(yùn)行你的應(yīng)用;離開(kāi)某個(gè)你的注冊(cè)的 iBeacon硫眨,然后一旦你離開(kāi)得足夠遠(yuǎn)足淆,你就會(huì)看到通知彈出來(lái)。
參考地址:https://github.com/nixzhu/dev-blog/blob/master/2014-04-23-ios7-ibeacons-tutorial.md