iBeacons技术

iBeacon:是苹果公司2013年9月发布的移动设备用OS(iOS7)上配备的新功能。

其工作方式是,配备有 低功耗蓝牙(BLE)通信功能的设备使用BLE技术向周围发送自己特有的ID,接收到该ID的应用软件会根据该ID采取一些行动。比如,在店铺里设置iBeacon通信模块的话,便可让iPhone和iPad上运行一资讯告知服务器,或者由服务器向顾客发送折扣券及进店积分。此外,还可以在家电发生故障或停止工作时使用iBeacon向应用软件发送资讯。

苹果 WWDC 14 之后,对 iBeacon 加大了技术支持和对其用于室内地图的应用有个更明确的规划。苹果公司公布了 iBeacon for Developers 和 Maps for Developers 等专题页面。

These are a new feature of Bluetooth LE which allows proximity-based notifications and ranging.(蓝牙的新特性,允许附近通知和测距。)

The seeker device displays updates of estimated range to it.(iBeacon可显示装置更新的估计范围。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 遵守并实现 CBPeripheralManagerDelegate, CLLocationManagerDelegate.

@interface SCViewController () <CBPeripheralManagerDelegate, CLLocationManagerDelegate> {

// CBPeripheralManager - 如果你的应用程序没有指定bluetooth-peripheral背景模式,其服务的内容处于暂停状态,任何远程中央试图访问服务的特征值或特征描述符接收到一个错误。
// NSUUID - 唯一地标识类型的字符串,接口
// CLBeaconRegion - 基于设备的接近蓝牙信号强度,而不是地理位置
// CLLocationManager - 位置管理者

CBPeripheralManager *_cbPeripheralManager;
NSUUID *_beaconUUID;
CLBeaconRegion *_rangedRegion;
CLLocationManager *_clLocationManager;
}

包含 CoreLocation and CoreBluetooth:

1
2
@import CoreBluetooth;
@import CoreLocation;

为了使应用程序出现,我们创建一个“CLBeaconRegion”对象,我们需要指定id。

1、CoreBluetooth peripheral 管理者:

1
2
_cbPeripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self
queue:dispatch_get_main_queue()];

2、The UUID:

1
_beaconUUID = [[NSUUID alloc] initWithUUIDString:@"3B2DCB64-A300-4F62-8A11-F6E7A06E4BC0"];

3、在我们的例子中我们只设置UUID:

1
2
_rangedRegion = [[CLBeaconRegion alloc] initWithProximityUUID:_beaconUUID
identifier:@"com.shinobicontrols.HotOrCold"];

CBPeripheralManager 有一个协议方法,并没有什么卵用,但是需要强制实现:

1
2
3
4
5
#pragma mark - CBPeripheralManager delegate methods
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
{
// We don't really care...
}

现在,当我们想要开始广播,作为iBeacon,那么我们得到一个词典设置从“CLBeaconRegion”并将其传递到“CBPeripheralManager”开始广播:

1
2
3
4
5
6
7
8
9
10
11
12
13
- (IBAction)handleHidingButtonPressed:(id)sender {

//蓝牙启用情况
if(_cbPeripheralManager.state < CBPeripheralManagerStatePoweredOn) {
NSLog(@"Bluetooth must be enabled in order to act as an iBeacon");
return;
}

// 构造 CLBeaconRegion, measuredPower指信号强度
NSDictionary *toBroadcast = [_rangedRegion peripheralDataWithMeasuredPower:@-60];

[_cbPeripheralManager startAdvertising:toBroadcast];
}

实现以下 CLLocationManagerDelegate 协议方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#pragma mark - CLLocationManagerDelegate methods
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
if([region isEqual:_rangedRegion]) {

// Let's just take the first beacon
CLBeacon *beacon = [beacons firstObject];

self.statusLabel.textColor = [UIColor whiteColor];
self.signalStrengthLabel.textColor = [UIColor whiteColor];
self.signalStrengthLabel.text = [NSString stringWithFormat:@"%ddB", beacon.rssi];

// 邻近的设备。
switch (beacon.proximity) {
case CLProximityUnknown:
self.view.backgroundColor = [UIColor blueColor];
break;

case CLProximityFar:
self.view.backgroundColor = [UIColor blueColor];
break;

case CLProximityImmediate:
self.view.backgroundColor = [UIColor purpleColor];
break;

case CLProximityNear:
self.view.backgroundColor = [UIColor redColor];
break;

default:
break;
}
}
}

没有感应到基站或距离很远,屏幕为蓝色。

距离适中,为紫色。

距离很近,为红色。


以上