蓝牙核心框架回调例程peripheralManagerIsReadyToUpdateSubscribers:未被调用

时间:2013-09-23 12:35:50

标签: objective-c ios7 core-bluetooth bluetooth-lowenergy xcode5

我正在试图弄清楚如何触发某些回调。 在外设peripheralManager:central:didSubscribeToCharacteristic:上被正确调用,它将一个数据块(第一个中的两个)发送到中心,并按预期在peripheral:didUpdateValueForCharacteristic:error:中接收它。

现在剩下一个块应该根据Apple's test application在外围设备的回调peripheralManagerIsReadyToUpdateSubscribers:中发送。

我已经过测试和验证,并且在那里工作正常。这有点可疑但是根据文档它只应该在外围管理器的updateValue:forCharacteristic:onSubscribedCentrals:失败时被调用。

如何让外围设备发送剩余的块?我可以为您提供代码,但它几乎完全相同(我使用的是NSData数据块而不是一个大的NSData,例如示例)对于我链接到的示例应用程序,我更好奇的是回调链如何工作以及需要为不同的选择器触发的内容。

2 个答案:

答案 0 :(得分:3)

我设法通过使用peripheralManagerIsReadyToUpdateSubscribers:中的循环(从sendDataperipheralManagerIsReadyToUpdateSubscribers:调用)来触发peripheralManager:central:didSubscribeToCharacteristic:

- (void)sendData {
    BOOL success = YES;
    while (success && ([_outgoingDataQueue count] > 0)) {
        NSData *chunk = [_outgoingDataQueue peek];
        success = [self.peripheralManager updateValue:chunk
                                    forCharacteristic:self.characteristic
                                 onSubscribedCentrals:nil];
        if (success) {
            [_outgoingDataQueue dequeue];
        }
    }
}

这不是将数据作为块发送到中心的正确方法。

答案 1 :(得分:3)

您正在做的是正常的操作方式。外围设备管理器处理数据发送并根据当前设置实现流量控制。例如。如果您使用指示而不是通知,则每次更新都必须由接收方确认,然后才能再次发送。

另一方面,通知与UDP数据包类似。他们可能迷路了。为了确保数据无错误地到达,您需要实现额外的控制流管理。

总而言之,你做得对。