У меня проблема с Core Bluetooth под iOS. Я программирую программу обновления 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, но, похоже, ничего не работает. Любые идеи?
discoverServices
. Прямая проверка рекламных данных ненадежна. - person Paulw11   schedule 25.07.2014