didRangeBeacons没有显示任何信标设备

时间:2015-12-29 06:35:46

标签: objective-c xcode ibeacon

我是灯塔编程的新手。

我在SO上搜索并获得了很多帮助,但仍然坚持了一下。

因为我的didRangeBeacons被调用,但它始终显示信标的空数组。

这是我的didDiscoverPeripheral代码

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:peripheral.identifier.UUIDString];

    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.XXXXXX.beacon"];

    self.beaconRegion.notifyEntryStateOnDisplay = YES;

    [self.locationManager startMonitoringForRegion:self.beaconRegion];
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];

    self.locationManager.delegate = self;
}

这是didRangeBeacons的代码

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
CLBeacon *foundBeacon = [[CLBeacon alloc] init];
    foundBeacon = [beacons firstObject];
NSString *uuid = foundBeacon.proximityUUID.UUIDString;
     NSString *major = [NSString stringWithFormat:@"%@", foundBeacon.major];
     NSString *minor = [NSString stringWithFormat:@"%@", foundBeacon.minor];

     NSLog(@"%@",uuid);
     NSLog(@"%@",major);
     NSLog(@"%@",minor);
}

这总是给我空值.. 什么是错的。 请帮忙......

2 个答案:

答案 0 :(得分:2)

问题是,您正在使用peripheral.identifier作为您正在测距和监控的信标区域的UUID。

它具有欺骗性,因为它们都使用相同的版本4 UUID 格式,但外设UUID iBeacon UUID 是两个完全不同的东西:

  • 外设UUID 标识特定的BLE设备。但是,即使对于BLE相同的设备,其外围设备UUID也会因iPhone而异,并且在iPhone或蓝牙子系统重新启动后也可能会发生变化。

    您可以将其视为iPhone分配给BLE设备的短暂标识符,以便您可以在iPhone上的核心蓝牙通话之间识别它。

    这是核心蓝牙子系统的一部分,适用于任何非iBeacon BLE设备。

  • iBeacon UUID 只是iBeacon设备广播的静态值。对于发现它的所有iPhone来说都是一样的,因为不太可能是Peripheral UUID,这不是iPhone分配的东西,而是信标本身的属性。

    在iOS方面,这是核心位置子系统的一部分,该子系统旨在与iBeacon一起使用。

CLBeaconRegion中,您需要使用信标的iBeacon UUID,而不是外设UUID。有关如何发现信标的iBeacon UUID,请咨询您的信标供应商。大多数供应商只是为他们生成的所有信标分配预定义的静态值(但您通常可以将其更改为您自己的信标)。

请注意您需要事先了解iBeacon UUID 才能发现具有该UUID的iBeacons。没有办法解决这个问题。

我也不确定你为什么要启动iBeacon测距/监控来响应核心蓝牙扫描 - 除非你有一个非常具体的原因,你不需要这样做。您可以从didDiscoverPeripheral方法中移出所有代码。

答案 1 :(得分:0)

设备未检测到任何信标。行foundBeacon = [beacons firstObject];返回Nil,如果您将代码更改为:

,则可以看到这一点
{
CLBeacon *foundBeacon = [beacons firstObject];
if (foundBeacon != Nil) {
   NSString *uuid = foundBeacon.proximityUUID.UUIDString;
   NSString *major = [NSString stringWithFormat:@"%@", foundBeacon.major];
   NSString *minor = [NSString stringWithFormat:@"%@", foundBeacon.minor];

   NSLog(@"%@",uuid);
   NSLog(@"%@",major);
   NSLog(@"%@",minor);
  }
  else {
    NSLog("No beacons detected");
  }
}

目前还不清楚它为什么不检测信标,但最常见的原因是用于开始测距的CLBeacon区域中的标识符与信标发送的标识符不匹配。显示此设置代码可能会有所帮助。

值得注意的是,所显示的didDiscoverPeripheral代码对于检测信标不是必需的,并且在基本信标检测中没有任何作用。

更新:以下提问者的评论至关重要:

  

我正在使用didDiscoverPeripheral方法查找可用的BLE设备并获取那些UUID然后设置然后我设置startMonitoringForRegion和startRangingBeaconsInRegion。因为我不知道用于设备的UUID

上述技术不起作用,因为didDiscoverPeripheral返回的UUID与信标ProximityUUID 无关,即使两个UUID使用相同的字符串格式并且表面看起来相似。 iOS中没有公共API可以在事先不知情的情况下获取信标的ProximityUUID。有关详细信息,请参阅我的博客文章:http://developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html