【问题标题】:Updating CentralManagers list of services for a peripheral更新外设的 CentralManagers 服务列表
【发布时间】:2014-09-16 13:16:32
【问题描述】:

我在 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 的新实例,但似乎没有任何效果。有什么想法吗?

【问题讨论】:

  • 要可靠地发现外围设备的服务,您应该连接到它并调用discoverServices。直接检查广告数据并不可靠
  • 其实我是在发现服务。我的问题似乎是我的设备没有发送正确的服务更改特性,因此当我在设备切换到引导加载程序后请求服务时,我仍然会取回旧的服务列表。显然,没有办法清除 iOS 中保存的服务列表。只有当它接收到 Service Changed 特征时,它才会更新它的列表。

标签: ios core-bluetooth cbcentralmanager cbperipheral


【解决方案1】:

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

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

总之,

  1. 连接前不要判断,广告会撒谎,Core蓝牙慎用
  2. 连接后总是发现服务
  3. 注意peripheralDidUpdateName: 回调

【讨论】:

  • 哇。你在这种时候回答问题
  • 我的问题似乎是我的设备没有发送服务更改特征。与大多数其他平台不同,iOS 似乎不允许删除为特定设备保存的服务和特征数据库,并且不会自动重新扫描,除非收到 Service Changed。因此,发现服务只会返回与设备第一次连接时检索到的相同列表。
  • 这是另一种可能性。确实不能以编程方式使缓存失效。但奇怪的是,CB 要求设备发送服务更改。在外围端决定是否必须为特定的中心发送此通知似乎并非易事,因此在实践中,如此强烈地建立在此通知上可能是不合理的。可能值得一个错误报告。希望你能修复固件。
猜你喜欢
  • 2014-07-13
  • 1970-01-01
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多