2016-01-20 77 views
0

能夠通過藍牙連接到多個iOS設備,作爲1個主設備和4個從設備工作。從中央同時向多個外設傳輸數據BLE

數據傳輸通過下面的代碼

[peripheral.peripheral writeValue:currentData forCharacteristic:peripheral.characteristic type:CBCharacteristicWriteWithoutResponse]; 

到外設但這製成擁抱數據丟失,但也較快。

然後用下面的代碼試圖不丟失數據

[peripheral.peripheral writeValue:currentData forCharacteristic:peripheral.characteristic type:CBCharacteristicWriteWithResponse]; 

試圖在同一時間(同時)

for (Peripheral * peripheral in self.connectedPeripherals) { 
[peripheral.peripheral writeValue:currentData forCharacteristic:peripheral.characteristic type:CBCharacteristicWriteWithResponse]; 
} 

數據傳輸的一個數據到多個外圍傳遞由一個好像一旦第一個外設接收到數據後第二個外設得到數據進行延時。

想要同時傳輸數據並同時反映到所有外設。

回答

0

當您使用響應傳輸數據時,每次發送數據包時都必須等待收到確認。當您傳輸沒有響應的數據時,確認沒有被髮回,所以吞吐量更高。但是,正如您正確指出的那樣,在沒有響應的情況下傳輸數據時,可能會丟失數據。這種數據丟失是由於內部iOS緩衝區的溢出發生的,該緩衝區在您撥打- writeValue:forCharacteristic:type:及其實際離開之間持有數據。如果您想防止數據丟失,則可以執行以下任一操作。

  1. 不要將太多的數據寫入緩衝區,因爲如果緩衝區溢出,它會被靜靜地丟棄。我的實驗表明,正常情況下這個緩衝區的大小約爲3kb(iPhone 6,iOS9,1外設)。對於其他設備,幾個連接的外圍設備和/或雙向傳輸此尺寸可能會更小。所以,如果你有要發送給4個外圍設備的1 kb數據,並通過迭代調用- writeValue:forCharacteristic:type:來完成,您肯定會面臨數據丟失問題。
  2. 執行一個協議,請求重新發送錯過的數據包,如果數據丟失的情況下用於沒有響應的寫入特性。
  3. 使用響應編寫,但將數據儘可能分成大塊。正如我前面所說的,確認在每個數據包之後被髮回,但是這些數據包可能具有不同的大小。使用iOS8/iOS9,您可以期望在單個數據包中發送最多155個字節的有效負載。所以如果你需要發送例如300字節,最好將它們分成2個150字節的塊,而不是15個20字節的塊。順便說一下,當你想寫回應並提交一個超過155字節的值時,iOS會爲你分割它,但在這種情況下,你將不會收到回調'
    • peripheral:didWriteValueForCharacteristic:error:數據交付後。