我是灯塔编程的新手。
我在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);
}
这总是给我空值.. 什么是错的。 请帮忙......
答案 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