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 UUID和iBeacon 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
方法。
我是信标编程新手。
我在 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 UUID和iBeacon 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
方法。