2

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 の新しいインスタンスを作成しようとしましたが、何も機能していないようです。何か案は?

4

1 に答える 1