iBeacon 開發筆記,ibeacon開發筆記
iBeacon開發筆記
2015.10.19
airlocate
=========
airlocate顯示如何使用這個監控範圍clbeaconregions。
代碼還提供了一個例子,你如何能校準和配置iOS裝置作為信標corebluetooth。
您可以配置一個iOS裝置作為信標如下:
1)獲得兩個iOS裝置配備藍芽LE。一個將是目標裝置,一個將是一個遠程(校準)裝置。
2)負載和啟動這個應用程式在這兩個裝置上。
3)通過選擇配置和開啟啟用的開關,將目標裝置轉為信標。
4)取校準裝置,並將一米距離的目標裝置移動。
5)在校準裝置上通過選擇校準校準過程。
6)從表格視圖中選擇目標裝置。
7)校準過程將開始。你應該在這一過程中,在這個過程中,從一邊到另一邊的校準裝置的波。
8)當校準過程完成後,它會顯示一個校準的RSSI值在螢幕上。
9)在目標裝置上,返回到配置螢幕並輸入該值在測量功率下。
註:校準過程是可選的,但建議將微調範圍為您的環境。
您可以配置一個iOS裝置沒有校準它不指定測量功率信標。
如果未指定測量功率,CoreLocation預設為預定值。
一旦你設定你的目標裝置作為一個燈塔,你可以使用這個應用程式示範燈塔範圍和監測。
要示範範圍,選擇遠程裝置。alrangingviewcontroller範圍一套clbeaconregions。
要示範監控,選擇遠程裝置監控。almonitoringviewcontroller允許您配置一個clbeaconregion監測。
著作權(2013)蘋果公司著作權所有,並保留一切權利。
零.寫在前面
關於測試:建議下載Estimote的app,作為基站,得到它的UUID,majon,minor參數。
關於裝置:iBeacon 使用 Bluetooth LE 技術,所以你必須要有一個內建有低功耗藍芽的 iOS 裝置以便與 iBeacon 協同工作。目前這個列表裡包含如下一些裝置:
- iPhone 4s 或更新的
- 第三代 iPad 或更新的
- iPad mini 或更新的
- 第五代iPod touch 或更新的
- 系統版本7.0以上
測試結果:rssi訊號輕度大概到-90,有效距離大概為30m。
用途:藍芽BLE,定位,智能家居等。自己還做了個上班打卡的 app,只有進入有效範圍內才能打卡成功。
UUID、主要、次要標識符
如果你不熟悉 iBeacon,你可能也不熟悉術語 UUID
、主要值(major value)
和 次要值(minor value)
。
一個 iBeacon 除了是一個低功耗藍牙裝置之外什麼也不是,它們以特定結構發布資訊。這些特定的東西超出本教程的範圍,但要明白的一件重要事情是 iOS 之所以能夠監控這些 iBeacon 就是基於 UUID
、主要值
和 次要值
。
UUDID 是 Universally Unique Identifier(通用唯一識別碼)的縮寫,它實際上是一個隨機字串;B558CBDA-4472-4211-A350-FF1196FFE8C8
就是一個例子。在 iBeacon 的討論範圍裡,一個 UUID 通常用於表示你的頂層標識。作為開發人員如果你產生一個 UUID 並將其分配給你的 iBeacon 裝置,那麼當一個裝置檢測到你的 iBeacon 時,它就知道它是在和哪個 iBeacon 通訊。
主要值與次要值在 UUID 之上提供了稍多的粒度。這些值只是 16 位不帶正負號的整數,能夠標識每個單獨的 iBeacon ,甚至是具有同樣 UUID 的哪些。
舉個例子,如果你有多間百貨公司,那麼你所有的 iBeacon 發射器都可有同一個 UUID ,但每個店都有它自己的主要值,而裡面的每個部門就會有它自己的次要值。你的應用能夠對一個位於你在邁阿密、佛羅里達店的鞋類部們裡的 iBeacon 做出響應。
一.iBeacon的使用
開始監聽你的Ibeacon。
在iOS8裡面蘋果改變了地位的開啟方式(iBeacon的使用是基於藍芽和定位的),首先要在工程裡的info.plist增加欄位NSLocationAlwaysUsageDescription(這個是允許一直在後台啟動並執行)
可能你會有些奇怪 iBeacon 會與 Core Location 相關,畢竟它是藍牙裝置,但考慮到 iBeacon 提供微定位資訊對應 GPS 提供宏定位資訊,也就不奇怪了。在將一個 iOS 裝置當作一個iBeacon 而編程時,你就要利用 Core Bluetooth 架構,而在監控 iBeacon 時,你只需同 Core Location 打交道。
當程式運行起來你會發現,裝置左下角有你的程式 icon 表徵圖
.h檔案
#import<UIKit/UIKit.h>
#import<CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,CLLocationManagerDelegate>
@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"//iBeacon的uuid可以換成自己裝置的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"];//初始化監測的iBeacon資訊
[self.locationmanager requestAlwaysAuthorization];//設定location是一直允許
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
if (status == kCLAuthorizationStatusAuthorizedAlways) {
[self.locationmanager startMonitoringForRegion:self.beacon1];//開始MonitoringiBeacon
}
}
{
//發現有iBeacon進入監測範圍
-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
[self.locationmanager startRangingBeaconsInRegion:self.beacon1];//開始RegionBeacons
}
//找的iBeacon後掃描它的資訊
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region{
//如果存在不是我們要監測的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 = [tableView dequeueReusableCellWithIdentifier:ident];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier: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 = @"遠";
break;
case CLProximityUnknown:
str = @"不見了";
break;
default:
break;
}
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %ld %@ %@",str,beacon.rssi,beacon.major,beacon.minor];
return cell;
}
//一些錯誤處理,因為你正在同非常具體的硬體特性打交道,你需要知道任何原因導致的監控和測距失敗
- (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的參數
uuid唯一標識此類iBeacon。
proximity遠近範圍的,有Near(在幾米內),Immediate(在幾厘米內),Far(超過 10 米以外,不過在測試中超不過10米就是far),Unknown(無效)
major和minor組合後區分同一類型下的iBeacon。
accuracy和iBeacon的距離
rssi訊號輕度為負值,越接近0訊號越強,等於0時無法擷取訊號強度
三.通知
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { if ([region isKindOfClass:[CLBeaconRegion class]]) { UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.alertBody = @"Are you forgetting something?"; notification.soundName = @"Default"; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; }}
你的位置管理器將在你離開某個地區時調用上面的方法,這就是這個應用有用的時刻。你不需要在你接近你的電腦包時被告知,只需在你離開它太遠時通知你。
此處你檢查地區是否是一個 CLBeaconRegion
,因為如果你同時也在執行地理定位地區監視的話,它還可能是一個 CLCircularRegion
。然後你就發送一個本地通知,附帶一個訊息“Are you forgetting something?” 。
編譯並運行你的應用;離開某個你的註冊的 iBeacon,然後一旦你離開得足夠遠,你就會看到通知彈出來。
參考地址:https://github.com/nixzhu/dev-blog/blob/master/2014-04-23-ios7-ibeacons-tutorial.md