更新CentralManagers外围设备的服务列表

时间:2014-07-24 20:02:16

标签: ios core-bluetooth cbcentralmanager cbperipheral

我在iOS下遇到Core Bluetooth问题。我编写了一个OTA更新程序,并遇到了一个奇怪的问题。当我将设备切换到OTAU模式时,它断开连接并在同一设备UUID下通告不同的服务,问题是,当我尝试从新连接的设备中找到服务时,我给出了旧的服务列表,这些服务不再是有效。问题的一个有说服力的部分是CBPeripheral.name值是原始设备名称,但在广告字典中返回didDiscoverPeripheral它是正确的新名称。

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
for (id key in advertisementData) {
    NSLog(@"key: %@, value: %@ \n", key, [advertisementData objectForKey:key]);
}
NSLog(@"Discovered peripheral with identifer: %@, state: %d, name: %@, services: %@",
      [peripheral identifier],
      [peripheral state],
      [peripheral name],
      [peripheral services]);

if (!self.peripherals)
    self.peripherals = [[NSMutableArray alloc] initWithObjects:peripheral,nil];
else
{
    for(int i = 0; i < self.peripherals.count; i++)
    {
        CBPeripheral *p = [self.peripherals objectAtIndex:i];

        if ((p.identifier == NULL) || (peripheral.identifier == NULL))
            continue;

        if ([self UUIDSAreEqual:p.identifier UUID2:peripheral.identifier])
        {
            [self.peripherals replaceObjectAtIndex:i withObject:peripheral];
            NSLog(@"Duplicate UUID found updating...");
            return;
        }
    }
    peripheral.delegate = self;
    [self.peripherals addObject:peripheral];

    NSLog(@"New UUID, adding");
    }
}

这是我所看到的:

  key: kCBAdvDataChannel, value: 38 
  key: kCBAdvDataLocalName, value: Xxxx1000_boot 
  key: kCBAdvDataIsConnectable, value: 1 
  Discovered peripheral with identifer: <__NSConcreteUUID 0x156787d0> 9E7A4F82-29F2-08EF-F6A5-9ADCC0790B7F, state: 0, name: Xxxx1000, services: (null)

通常,对于程序的下一次清理运行,它将显示相反的外围名称的Xxxx_boot和广告名称的Xxxx(广告始终正确)。

我不知道如何清除CBCentralManager中保存的外围信息,我甚至尝试过创建一个新的CentralManager实例,但似乎没有任何效果。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

广告实际上只是一个提示。它几乎可以包含你的鞋子尺码和#34;到托管服务。只需看看iBeacon profile。您永远不应该完全依赖这些数据,Core Bluetooth也不会以任何其他方式使用此信息。

外围设备名称是从外围设备上的相应特性加载的。一旦iOS读取它,它将在CBPeripheral.name属性中使用,并且将简单地忽略通告的名称。重新连接时,名称将自动刷新。

总之,

  1. 在连接之前不要判断,广告可以说谎并且Core Bluetooth小心使用它
  2. 始终在连接后发现服务
  3. 介意peripheralDidUpdateName:回调