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

问题描述 投票:1回答:1

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

savedPeripherals是一个NSDictionary,其中设备ID是Key,而CBPeripheral是Value。

    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];
        }
    }
}
ios objective-c cbcentralmanager
1个回答
3
投票

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

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

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

  1. 应用程序启动并检索所需的外围设备标识符(例如来自NSUserDefaults)
  2. 申请通过CBPeripheral请求retrievePeripheralsWithIdentifiers
  3. 应用程序向该外围设备发出connect
  4. 如果外围设备当前可见,则立即发生连接并调用委托方法
  5. 如果外围设备当前不可见,则当外围设备变为可见并且将调用委托方法时,将发生连接。

为了实现您需要的功能,您需要使用CBCentralManagerScanOptionAllowDuplicatesKey:YES并保持每个外围设备的年龄。例如,您可以使用以下方法:

  1. 设置字典,由外围标识符键入
  2. 当看到外围设备时,将NSNumber存储在字典中,其值为30,如果需要,还将外围设备存储在表视图的源数组中
  3. 设置NSTimer以每秒触发一次。
  4. 每次定时器触发时,都要浏览字典并减少每个键存储的值
  5. 对于已递减为0的每个值,将其从tableview数组中删除并更新tableview
© www.soinside.com 2019 - 2024. All rights reserved.