didRangeBeacons 没有显示任何信标设备

didRangeBeacons not showing any beacon devices

我是信标编程新手。

我在 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);
}

这总是给我空值.. 怎么了。 请帮忙...

设备未检测到任何信标。 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 代码不是检测信标所必需的,并且在基本信标检测中没有任何作用。

更新:下面提问者的评论很关键:

I am using didDiscoverPeripheral method to find the available BLE devices and to get those UUID and then setting then I am setting startMonitoringForRegion and startRangingBeaconsInRegion. As I am unaware of UUID that is for device

上面的技术是行不通的,因为didDiscoverPeripheral返回的UUID与beacon ProximityUUID没有任何关系,即使两个UUID使用相同的字符串格式表面上看起来很相似。 iOS 中没有 public API 可以在事先不知道的情况下获取信标的 ProximityUUID。 请在此处查看我的博客 post更多信息:http://developer.radiusnetworks.com/2013/10/21/corebluetooth-doesnt-let-you-see-ibeacons.html

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

具有欺骗性,因为它们都使用相同的Version 4 UUID格式,但是Peripheral UUIDiBeacon UUID 是两个完全不同的东西:

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

    您可以将其视为 iPhone 分配给 BLE 设备的临时标识符,这样您就可以在 iPhone[=] 上的核心蓝牙调用 之间识别它44=].

    这是核心蓝牙子系统的一部分,旨在与任何 non-iBeacon BLE 设备一起使用。

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

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

在您的 CLBeaconRegion 中,您需要使用信标的 iBeacon UUID,而不是 Peripheral UUID。请咨询您的信标供应商,了解如何发现您的信标的 iBeacon UUID。大多数供应商只是为他们生产的所有信标分配一个 pre-defined 静态值(但您通常可以将其更改为您自己的值)。

请注意,您需要预先知道 iBeacon UUID 才能发现具有该 UUID 的 iBeacon。没有办法解决这个问题。


我也不太确定你为什么要启动 iBeacon ranging/monitoring 来响应 Core Bluetooth 扫描——除非你有非常具体的原因,否则你不需要这样做。您可以将所有代码移出 didDiscoverPeripheral 方法。