CBCentralManager获取iOS中广告蓝牙LE设备的动态列表

时间:2016-04-03 01:54:05

标签: ios objective-c cbcentralmanager

我正在开展一个项目,通过特定的UUID显示所有蓝牙LE设备的列表。在方法didDiscoverPeripheral中,我保存了已发布的广告外围设备。扫描外围设备时,我使用选项dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO]。我有一个NSTimer每30秒唤醒一次,以更新已发现的外围设备列表,看看是否所有外围设备仍然是广告。我使用retrievePeripheralsWithIdentifiers方法传递了NSUUID已发现和保存的外围设备数组。该方法应返回仍为广告的CBPeripherals数组。但是它返回了我作为参数传递的所有外围设备的原始数组,并且它永远不会排除不再做广告的外围设备。我不正确地使用这种方法吗?

savedPeripheralsNSDictionary,其中设备ID是密钥,CBPeripheral是值。

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:30
                                target:self
                                selector:@selector(updateActivePeripherals:)
                                userInfo:nil
                                repeats:YES];

    -   (void) updateActivePeripherals:(NSTimer *)timer
    {
        NSMutableArray *peripherals = [[NSMutableArray alloc]init];
        if (self.savedPeripherals.count > 0)
        {
            for(id key in self.savedPeripherals)
            {
                CBPeripheral *item = [self.savedPeripherals objectForKey:key];
                NSString *identifier=[NSString stringWithFormat:@"%@", [[item identifier] UUIDString]];
                NSUUID *id=[[NSUUID alloc]initWithUUIDString:identifier];

                if (id)
                    [peripherals addObject:id];
            }

        }

        if (peripherals.count > 0)
        {
            NSArray *list =[_centralManager retrievePeripheralsWithIdentifiers:peripherals];
        }
    }
}

1 个答案:

答案 0 :(得分:3)

documentation并未声明retrievePeripheralsWithIdentifiers将返回仍然可见/广告的外围设备。相反,它说它返回:

  

中央管理员能够匹配的外围设备列表   提供标识符。

即使外围设备当前不可见,中央管理器也将返回已知的外围设备。这是为了允许应用程序在可见时自动连接到特定外围设备。工作流程如下:

  1. 应用程序启动并检索所需的外围设备标识符(例如来自NSUserDefaults)
  2. 通过CBPeripheral
  3. 申请retrievePeripheralsWithIdentifiers
  4. 应用程序向该外围设备发出connect
  5. 如果外围设备当前可见,则立即发生连接并调用委托方法
  6. 如果外围设备当前不可见,那么当/如果外围设备变得可见并且将调用委托方法时,连接将会很愉快。
  7. 为了实现您需要的功能,您需要使用CBCentralManagerScanOptionAllowDuplicatesKey:YES并针对每个外围设备保持年龄。例如,您可以使用以下方法:

    1. 设置字典,由外围标识符
    2. 键入
    3. 当看到外围设备时,将NSNumber存储在值为30的字典中,并在必要时将外围设备存储在表视图的源数组中
    4. 设置NSTimer以每秒触发一次。
    5. 每次计时器触发时,都要浏览字典并减少每个键存储的值
    6. 对于已递减为0的每个值,将其从tableview数组中删除并更新tableview