2013-09-23 76 views
3

我想弄清楚如何使某些回調觸發。 在外圍設備peripheralManager:central:didSubscribeToCharacteristic:被正確調用,它發送一個數據塊(前兩個)到中心,如預期在peripheral:didUpdateValueForCharacteristic:error:中接收數據。藍牙核心框架回調例程peripheralManagerIsReadyToUpdateSubscribers:不叫

現在剩下一塊應該根據Apple's test application在外設的回調peripheralManagerIsReadyToUpdateSubscribers:中發送。

我已經測試和驗證,它在那裏工作得很好。這有點可疑,但根據文檔,只有當外圍管理器的updateValue:forCharacteristic:onSubscribedCentrals:失敗時纔會調用它。

如何讓外設發送剩餘的塊?我可以爲你提供代碼,但它與我鏈接到的示例應用程序幾乎完全相同(我使用的是一組NSData塊而不是一個大的NSData),我更關心的是如何回調鏈作品以及不同選擇者需要採取的行動。

回答

3

我設法通過使用sendData一個循環(從peripheralManagerIsReadyToUpdateSubscribers:peripheralManager:central:didSubscribeToCharacteristic:調用)來觸發peripheralManagerIsReadyToUpdateSubscribers:

- (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]; 
     } 
    } 
} 

這種感覺不像將數據作爲塊發送到中央的正確方式。

3

你在做什麼是正常的操作方式。外設管理器根據當前設置處理數據發送並執行流量控制。例如。如果您使用的是指示而不是通知,則每次更新都必須由接收方確認,然後才能再次發送。

另一方面,通知類似於UDP數據包。他們可能會迷路。爲確保數據無差錯,您需要實施額外的控制流管理。

總而言之,你做得對。

+0

謝謝,我已經設法浸泡,我需要返回每次它不發送一個塊的回調觸發。 – MdaG

+0

@MdaG是的,這在文檔中沒有很好的闡述,示例應用程序本身實際上顯示了非常糟糕的做法。 (將單一功能中的所有功能集中在一起)。我只是認爲,對於您獲得一些反饋意見,您認爲這樣做或多或少是正確的。 – allprog

+0

因此,在一個具有多重特性的非平凡例子中,必須保持一個隊列集合,每個隊列都有一個隊列?或者可能是一個包含將數據與特性相關聯的字典的隊列? – Gorm