CoreBluetooth,使用CBAdvertisementDataServiceUUIDsKey:来宣传上次更新的时间

时间:2014-01-30 19:56:59

标签: ios bluetooth-lowenergy core-bluetooth

我正在开发一个与点对点共享信息的应用。两种设备同时充当中心和外围设备。

当iOS设备A连接到iOS设备B时,它们会交换信息,然后中心断开连接,并再次开始扫描。如果设备获取任何新信息,我想使用反映更新时间的新序列日期(和deviceID)更新CBAdvertisementDataServiceUUIDsKey中的第二个服务UUID。通过这种方式,其他iOS设备可以从广告中判断出它们是否应该连接。更新广播的代码如下。它产生的UUID是有效的,但是一旦我修改广告,我的中心就不再找到外围设备了。我知道广告是缓存的,但我假设删除服务并重新添加它,我可以解决这个问题。

-(void)updateBroadcast{
    [self.peripheralManager stopAdvertising];
    if (self.pmIsConnected) {
        NSLog(@"PM connected->Can't update advertising");
        dispatch_async(dispatch_get_main_queue(), ^{
            [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateBroadcast) userInfo:nil repeats:YES];
        });
        return;
    }else{
        [self.peripheralManager removeService:self.infoService];
        [self setupInfoService];
        [self startBroadcasting];

        NSArray *services=@[self.tNetService.UUID,[self createAdvertiseUUID];
        NSDictionary *advertisingDict = 
              @{CBAdvertisementDataLocalNameKey:self.deviceNameKey,
                CBAdvertisementDataServiceUUIDsKey:services};
        [self.peripheralManager startAdvertising:advertisingDict];
    }

}

是否可以更新此密钥?或者我犯了其他错误?

1 个答案:

答案 0 :(得分:1)

如果不尝试重现您的代码,我会有一些观察

  • 不要太乱用服务数据库,因为堆栈很容易腐败
  • 添加和删除服务是异步操作,您应该等待回调以确认您的操作
  • 在修改广告数据之前使用stopAdvertising(尽管如果它对您有效,这可能不是绝对必要的)
  • 在您开始扫描时尝试将CBCentralManagerScanOptionAllowDuplicatesKey选项设置为@YES并查看您是否注意到广告中的更新

广告和托管服务不一定必须相同。它们实际上可能完全不同。因此,更新服务数据库不是更改广告的必要条件。

您的用例对我来说并不完全清楚,但我觉得您想要实现多种聊天或类似的东西。有一个question on this earlier,我解释说通过广告实施广播不是一个特别好的主意。如果广告相对不经常变化,那么它可能会起作用,但我不会将我的解决方案建立在这种方法上。如果您的对等端数量相对较少,则多路连接器连接框架可能更适合您的需求,但基于IP的解决方案将扩展得最好。