【问题标题】:locationManager:didRangeBeacons method not detecting BLE DevicelocationManager:didRangeBeacons 方法未检测到 BLE 设备
【发布时间】:2013-11-24 21:59:32
【问题描述】:

我正在使用 Nordic BLE nRF8001 开发套件来测试 CoreBluetooth。使用 CBCentralManager 的方法(例如 didDiscoverPeripheral()、didConnectPeripheral() 等)我的 iPhone 5 能够检测到 Nordic 设备的广告并正常连接。但是,我没有收到来自新 locationManager 范围或 regionMonitoring 方法的任何响应。下面我将解释我的设置:

1.) 首先,我使用传入的外围设备(我的北欧设备)在 didDiscoverPeripheral() 委托方法中从我的北欧设备中检索了我的 NSUUID。我为我的北欧设备创建了一个自定义服务,所以假设这个外围设备是北欧设备。要检索我使用的 NSUUID:

    NSUUID *uuid = [peripheral identifier];  
    NSString *uuidString = [uuid UUIDString]; //uuidString = 9A8D4C73-152D-BBDA-E4C2-9CE952654645

2.) 接下来我为我的 Nordic 设备创建一个信标区域并创建一个 CLLocationManager:

    self.locationManagerBeacon = [[CLLocationManager alloc] init];
    [self.locationManagerBeacon setDelegate:self];
    NSUUID *myUUID = [[NSUUID alloc] initWithUUIDString:@"9A8D4C73-152D-BBDA-E4C2-9CE952654645"];
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:myUUID
                                                      identifier:@"nordicRegion"];
    self.beaconRegion.notifyEntryStateOnDisplay = YES;

3.) 现在我开始监视信标区域

[self.locationManagerBeacon startRangingBeaconsInRegion:self.beaconRegion];

4.) 问题:locationManager:didRangeBeacons:inRegion 被调用,但信标区域始终为空。

问题: Nordic BLE 设备是否需要以某种方式进行配置,以便新的 locationManager 信标方法能够检测到它(例如 BLE 广告频率、功率级别等)?如果是这样,有人可以指出我的文档。

感谢您的帮助!

【问题讨论】:

  • 那么,愚蠢的问题:您使用的是真正的 iBeacon 吗?或者只是一个任意的 BTLE 设备?只有广播 iBeacon 配置文件的 BTLE 设备才会真正被视为“iBeacon”。
  • 我想知道您是否可以分享您的配置/配置文件/示例代码,以将 nrf8001 广告设置为 iBeacon。

标签: ios iphone bluetooth ibeacon


【解决方案1】:

我一直认为,要使用信标测距,您必须首先启动信标监控:

[theLocManager startMonitoringForRegion: region1];
[theLocManager startRangingBeaconsInRegion: region1];

该代码对我来说很好用(另外,和你一样,我也设置了 notifyEntryStateOnDisplay = YES)。

尝试一下,看看它是否有所作为。如果做不到这一点,我会说你广播的 BLE 数据包有问题,作为信标广告。

您也可以尝试下载 Apple 的 AirLocate 演示(它会侦听信标并将您的 iOS 设备变成信标。)您可以使用 AirLocate 来查看它是否将您的自定义 BLE 设备识别为信标。如果是,则使用 AirLocate 作为信标进行传输,并查看您的代码是否识别它。

【讨论】:

  • BLE 广告数据包结构是问题所在——很好的调用。对于其他有此问题的人,请参阅此post
【解决方案2】:

我发现有时使用空字符串(@"")作为标识符会导致同样的问题

region = [[CLBeaconRegion alloc] initWithProximityUUID:UUID identifier:[UUID UUIDString]];

希望对你有帮助

Z.

【讨论】:

    【解决方案3】:

    感谢 Duncan 对“BLE 数据包中有问题”的评论。我正在使用我不久前购买的一些 Estimote 信标。我也得到了一个空数组。当我使用 Estimote iOS 应用程序连接到他们时,它显示 Estimote 操作系统已经过时了。我使用该应用程序更新信标,它们开始在阵列中为我显示。

    【讨论】:

      【解决方案4】:

      根据我的经验,如果您按照 Duncan 的说明进行操作,可能会出现一些问题,但仍然无法正常工作:

      • 如果您监控多个区域,您创建的CLBeaconRegion 需要具有唯一标识符。如果它们不是唯一的,则将调用 didRangeBeacons 将清空数组信标。
      • 您不应在 dispatch_async 块中调用 startMonitoringForRegionstartRangingBeaconsInRegion
      • 如果仍然失败,请检查您的 centralManagerDidUpdateState 实现,当您看到 CBCentralManagerStatePoweredOn 时重置监控。

      【讨论】:

        猜你喜欢
        • 2022-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 2021-11-09
        相关资源
        最近更新 更多