AltBeacon 0.3

AltBeacon 0.3

测试已测试
Lang语言 Obj-CObjective C
许可 MIT
发布上次发布2014年12月

CharruaLabs 维护。



AltBeacon 是 iBeacon 的替代品,允许 iOS 设备在后台进行广播,这是 iBeacon 目前无法做到的。它基于开源项目 Vinicity(感谢 Ben Ford) https://github.com/Instrument/Vicinity。除了在 Vinicity 中所做的大量工作之外,AltBeacon 还增加了检测不同 UUID 的多个 AltBeacon 的可能性,并提高了范围准确性。值得注意的是,通过后台广播,可以出现一系列新的用例,这些用例需要人们与附近的人进行交互,例如为附近的人的消息应用。我们目前正在使用这个框架开发一个即将上架 AppStore 的产品。

工作原理

AltBeacon 的关键是 iOS 的低功耗蓝牙堆栈允许作为外围设备进行背景广播(在 Android 中这仍然不可能,但我们正在研究解决方案)。然而,当在后台广播时,只能发现之前已知的 UUID(这已在苹果的 BLE 文档中提到,但我们自己也进行了测试)。使用以下调用:

NSDictionary *scanOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey:@(YES)};
[centralManager scanForPeripheralsWithServices:nil options:scanOptions];

将找到所有在前面进行广播的 AltBeacon,但不会找到正常广播的后台 AltBeacon。因此这不是一个有效的替代品。

解决方案是发现已经已知的服务 UUID。因此 AltBeacons(中心)扫描其他已知通用 UUID 的 AltBeacons(外围),这个通用 UUID 是所有 AltBeacons 都已知的。当它们找到 AltBeacon(外围)时,它们连接到该外围设备,并使用服务和特性获得该外围设备的具体 UUID。需要注意的是,我们使用两个不同的 UUID。通用 AltBeacon UUID 对于所有 AltBeacon 来说始终相同,使我们能够找到它们以及通过 BLE 区分它们与其他设备。具体 AltBeacon UUID 对于所有 AltBeacon 来说都不同,使我们能够识别和区分每个 AltBeacon。重要的是要知道,外围和中心之间的连接只会发生一次,之后中心 AltBeacon 可以记住外围设备,并且之后只需要检测范围。不需要重新连接(更节省电量)。

版本

0.3

变更日志

0.3

  • 现在可以检测任何 AltBeacon,无需事先知道位置。
  • 对范围报告进行了一些修复

安装

将源文件夹复制到您的Xcode项目。或者通过cocoapods安装

pod 'AltBeacon', :git => 'https://github.com/CharruaLabs/AltBeacon.git'

使用方法

源代码内部有一个演示项目,展示了如何使用AltBeacon。请查看。

否则请查看以下说明。请记住添加后台模式:充当蓝牙LE附件

定义AltBeacon的UUIDS。在实际项目中,您将自动生成这些并存储在数据库中,然后进行定位半径过滤。

#define kUuidBeaconOne @"5F22CA05-8F6C-49B6-AEAE-B278FDFE9287"
#define kUuidBeaconTwo @"9F3E9E58-5073-4F78-BD04-87050DAFB604"
#define kUuidBeaconThree @"177383C7-8347-444F-B14E-1581131A16E2"

然后开始创建广播和解广播的beacon。

// Initialize the IBeacon UUDI@
self.beaconOne =  [[AltBeacon alloc ]initWithIdentifier:kUuidBeaconOne clearFoundDevicesInterval:CLEAR_INTERVAL];
self.beaconTwo =  [[AltBeacon alloc ]initWithIdentifier:kUuidBeaconTwo clearFoundDevicesInterval:CLEAR_INTERVAL];
self.beaconThree =  [[AltBeacon alloc ]initWithIdentifier:kUuidBeaconThree clearFoundDevicesInterval:CLEAR_INTERVAL];
[self.beaconOne addDelegate:self];
[self.beaconTwo addDelegate:self];
[self.beaconThree addDelegate:self];

然后让beacon开始检测和广播。

- (void)start:(AltBeacon *)beacon {

    // start broadcasting
    [beacon startBroadcasting];
    [beacon startDetecting];
}

- (void)stop:(AltBeacon *)beacon {

    // start broadcasting
    [beacon stopBroadcasting];
    [beacon stopDetecting];
}

实现代理来接收设备被找到时的信息。您将收到一个字典,以uuid为键,值为一个范围枚举型,其中包括Immediate(立即)、Near(接近)和Far(远离)。范围表示您与检测到的UUIDS的距离有多近。这个回调每秒钟调用一次,找到的uuids列表每隔几秒钟清除一次。您可以在AltBeacon构造函数中定义清除时间。

// Delegate methods
- (void)service:(AltBeacon *)service foundDevices:(NSMutableDictionary *)devices {

    for(NSString *key in devices) {
        NSNumber * range = [devices objectForKey:key];
        if (range.intValue == INDetectorRangeUnknown){
            if ([key  isEqualToString:kUuidBeaconOne]){
                self.labelDisplayResultBeacon1.text = @"";
            }
            else if ([key  isEqualToString: kUuidBeaconTwo]){
                self.labelDisplayResultBeacon2.text =  @"";
            }
            else if ([key  isEqualToString: kUuidBeaconThree]){
                self.labelDisplayResultBeacon3.text = @"";
            }
        }else{

            NSString *result = [self convertToString:range];
            NSString *beaconName = @"";
            if ([key  isEqualToString:kUuidBeaconOne]){
                beaconName = @"Beacon one!";
                self.labelDisplayResultBeacon1.text = [NSString stringWithFormat:@"%@ %@ %@ %@", beaconName, @"was found",result, @"meters away"];
            }
            else if ([key  isEqualToString: kUuidBeaconTwo]){
                beaconName = @"Beacon two!";
                self.labelDisplayResultBeacon2.text = [NSString stringWithFormat:@"%@ %@ %@ %@", beaconName, @"was found",result, @"meters away"];
            }
            else if ([key  isEqualToString: kUuidBeaconThree]){
                beaconName = @"Beacon three!";
                self.labelDisplayResultBeacon3.text = [NSString stringWithFormat:@"%@ %@ %@ %@", beaconName, @"was found",result, @"meters away"];
            }
        }
    }
}

其他事项

请注意,此库正在开发中,请随时贡献并提及设计替代方案和可能性。请联系我们:[email protected]

Martin Palatnik -> 电子邮件: [email protected] Twitter: @mpalatnik

历史记录

AltBeacon的早期版本工作机制 quite 不同。由于我们仍在评估当前版本的性能,我们在此还添加了早期版本的解释。

以前的解决方案是直接一次性搜索多个特定的AltBeacon UUIDS,而不是先搜索一个通用UUID。技巧是使用CoreLocation并在数据库中存储所有AltBeacon的位置,然后定义几个km的半径以过滤掉大多数。然后在那个半径内寻找AltBeacon。我们的实验表明,您一次可以最多扫描7个UUIDS。如果您扫描的更多,则CentralManager会错误地返回一些不实际存在的UUIDS。以下调用的列表,如果包含少于7个UUIDS,将正确找到它们。

NSDictionary *scanOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey:@(YES)};
[centralManager scanForPeripheralsWithServices:uuidsToDetect options:scanOptions];

考虑到寻找您正在扫描的AltBeacons需要几百毫秒,一分钟内可以扫描几百个beacon。此外,如果您使用CoreLocation和数据库将AltBeacon的数量限制在几公里的半径内,则这种方法相当可扩展。

与此早期版本的一个重要问题是,当一个以上的应用程序同时使用BLE堆栈在后台广告时,扫描的AltBeacon会错误地报告找到的内容。

许可协议

MIT