0

我試圖根據OnCharacteristicWrite回調條件同步寫入下一個數據包以實現最大吞吐量。但由於某種原因,它會在1-2秒的時間後在非常初始時停止觸發OnCharacteristicWrite回調,即使我重新發送數據包,它也永遠不會被調用。如果我爲每個數據包添加延遲,但是我不想添加任何延遲來實現最大吞吐量,那麼它工作得很好。Android BLE回調OnWriteCallback在幾秒後停止

有什麼辦法可以在不增加任何延遲的情況下實現最大吞吐量?

另外,每個連接間隔究竟發送多個數據包意味着什麼(以及是否有任何方法可以通過外設實現)?

+0

你有什麼Android設備/操作系統版本? – Emil

+0

Android 4.4.2 kitkat –

+0

@Emil我的BLE版本是4.2。但我沒有得到如何發送每conn間隔多個數據包。根據每個數據包收到onCharacteristicWrite回調的時間,我正在逐個發送數據包。但是經過一段時間(約300個onCharacteristicWrite回調狀態0成功的數據包之後),回調突然停止,即使在數據包重發時也不會觸發。所以我在兩個數據包之間添加了一個8ms的延遲,它將所有數據包成功寫入回調狀態爲0,但這實際上降低了吞吐量。有沒有更好的方法來實現這一點? –

回答

1

如果您使用Write Without Response(請參閱https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#setWriteType(int)),您將能夠每個連接間隔發送多個數據包。

Android KitKat不幸的是,當你用「無響應寫入」發送多個數據包時,流量控制失效。如果您嘗試使用較新的Android設備,它應該可以正常工作。

如果writeCharacteristic方法返回true,則表示它已將您的數據包傳遞給藍牙進程。您可以在https://android.googlesource.com/platform/frameworks/base/+/fe2bf16a2b287c3c748cd6fa7c14026becfe83ff/core/java/android/bluetooth/BluetoothGatt.java#1081的源代碼中查看確切的邏輯。基本上,如果特徵具有寫屬性,則gatt對象有效,並且當前沒有其他未決的GATT操作正在進行,則返回true。

當寫入響應到達(用於寫入響應)或藍牙堆棧就緒並且有緩衝區空間來接受新數據包(用於無響應寫入)時,onCharacteristicWrite回調將發送狀態= 0。

我最近在這裏寫了一篇文章,您可以閱讀:onCharacteristicWrite and onNotificationSent are being called too fast - how to acquire real outgoing data rates?

如果您想爲KitKat提供簡單的解決方法,您可以將10個數據包寫爲Write Without Response,然後將第11個數據包寫爲Response With,然後從Write Without Responses開始。這應該給你體面的表現。

+0

感謝您的詳細信息。我能夠在短時間內寫入沒有響應的數據包,但要檢查數據完整性,我會循環備份BLE的Tx和Rx引腳,並檢查OnCharacteristicChange回調並讀取相同特性後是否收到相同的數據。我根據這個數據比較發送下一個數據包。但是基於具有相同特性的OnCharacteristicChanges讀取數據包似乎是非常緩慢的過程。我還可以使用兩種不同的特性用於寫/發送和其他讀取和如何?謝謝! –