3

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

peripheralManagerIsReadyToUpdateSubscribers:根据Apple 的测试应用程序,现在还剩下一个应该在外围设备的回调中发送的块。

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

如何让外围设备发送剩余的块?我可以为您提供代码,但它与我链接到的示例应用程序几乎相同(我使用的是一组 NSData 块而不是像示例中那样的一个大 NSData),我对回调链的工作原理更加好奇以及要触发不同的选择器需要准备什么。

4

2 回答 2

3

我设法peripheralManagerIsReadyToUpdateSubscribers:通过使用循环sendData(从peripheralManagerIsReadyToUpdateSubscribers:and调用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];
        }
    }
}

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

于 2013-09-23T14:47:22.977 回答
3

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

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

总而言之,你做对了。

于 2013-09-23T19:52:19.827 回答