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