BLE通訊中write與writeWithoutResponse的使用
在APP和BLE(藍(lán)牙低功耗)通訊中,write和writeWithoutResponse是兩種發(fā)送數(shù)據(jù)的不同方法。
writeWithoutResponse方法:APP使用writeWithoutResponse方法發(fā)送數(shù)據(jù)時,是將數(shù)據(jù)直接發(fā)送給藍(lán)牙模塊,APP端不需要等待接藍(lán)牙模塊的響應(yīng),可以繼續(xù)向藍(lán)牙模塊發(fā)送下一組數(shù)據(jù)包。這種方式適用于實(shí)時性要求較高的場景,例如傳輸實(shí)時控制指令或傳輸網(wǎng)絡(luò)流媒體數(shù)據(jù)。具體使用方法可以參考安卓APP的代碼:
BluetoothGattCharacteristic characteristic = // 獲取到Characteristic對象
characteristic.setValue(data); // 設(shè)置要發(fā)送的數(shù)據(jù)
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
boolean success = bluetoothGatt.writeCharacteristic(characteristic); // 發(fā)送數(shù)據(jù)
write方法:APP使用write方法發(fā)送數(shù)據(jù)時,是將請求包發(fā)送給藍(lán)牙模塊后,需要等待藍(lán)牙模塊的響應(yīng);藍(lán)牙模塊在接收到數(shù)據(jù)后,需要給APP發(fā)送一個響應(yīng)包以確認(rèn)自己收到APP發(fā)送的請示包。安卓APP具體使用方法如下:
BluetoothGattCharacteristic characteristic = // 獲取到Characteristic對象
characteristic.setValue(data); // 設(shè)置要發(fā)送的數(shù)據(jù)
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
boolean success = bluetoothGatt.writeCharacteristic(characteristic); // 發(fā)送數(shù)據(jù)
// 等待接收方的響應(yīng)
while (waitingForResponse) {
// 監(jiān)聽andoid.bluetooth.device.action.GATT_CHARACTERISTIC_WRITE_STATUS廣播,判斷是否有響應(yīng)
// 處理響應(yīng)邏輯
}
這兩種方法的選擇需要根據(jù)實(shí)際需求來決定,如果APP和藍(lán)牙模塊之間對數(shù)據(jù)的傳輸時延要求較高,可以選擇使用writeWithoutResponse方法;如果需要確保數(shù)據(jù)的可靠性和一致性,可以選擇使用write方法,并在藍(lán)牙模塊收到請求數(shù)據(jù)后進(jìn)行相應(yīng)的響應(yīng)確認(rèn),APP收到藍(lán)牙模塊發(fā)出的響應(yīng)確認(rèn)后可以繼續(xù)發(fā)送下一組數(shù)據(jù)包,這樣就保證了數(shù)據(jù)的可行性和完整性。
如果要發(fā)送的數(shù)據(jù)比較大的話,使用write方式進(jìn)行發(fā)送,發(fā)送時間會變長,體驗也會變得差一些;而使用writeWithoutResponse方式進(jìn)行發(fā)送無需等待藍(lán)牙模塊的響應(yīng),可以持續(xù)發(fā)送,這無疑可以提高傳輸?shù)乃俾?,但可靠性需要依賴藍(lán)牙通訊協(xié)議層,當(dāng)寫入速度超過藍(lán)牙模塊協(xié)議處理速度的時候,會導(dǎo)致丟包的現(xiàn)象發(fā)生;所以這兩種方式的選擇除了依據(jù)使用經(jīng)驗外還需要根據(jù)具體的場景需求來決定。
飛易通自己研發(fā)的藍(lán)牙模塊通訊協(xié)議棧支持兩種寫入方式,同時對不帶響應(yīng)的快速寫入方式進(jìn)行了改進(jìn),能保證在快速寫入數(shù)據(jù)的同時不會有丟包的現(xiàn)象發(fā)生。