Вот краткое описание моей настройки:
Настройка:
Приложение Android использует NFC-V для связи с тегом.
Запись определенного выходного тока в назначенный блок тега (в данном случае блок 5).
Использование адресных команд для обеспечить надежную связь между различными устройствами Android.
Реализованы повторные попытки повторного подключения в случае сбоя соединения или потери тега.
Проблема:
Я продолжаю сталкиваться с исключением «Тег потерян», хотя я реализовали механизмы повторного подключения и повтора. Проблема возникает, когда я пытаюсь записать в блок, а тег перемещается или теряет соединение во время процесса.
Соответствующий код:
Это функция, которую я использую для записи выходной ток на метку NFC-V:
Код: Выделить всё
@SuppressLint("SetTextI18n")
fun writeToNfcTag(tag: Tag) {
val nfcV = NfcV.get(tag)
val tagUid = tag.id // Retrieve the UID of the NFC tag
if (nfcV != null) {
var retries = 0
val maxRetries = 5
var success = false
while (retries < maxRetries && !success) {
try {
// Reconnect to the tag if the connection is lost
reconnectNfcTag(nfcV)
val outputCurrent = setCurrentValue.text.toString().toIntOrNull() ?: 0
// Convert the output current to bytes (big-endian)
val outputCurrentBytes = byteArrayOf(
(outputCurrent shr 8 and 0xFF).toByte(),
(outputCurrent and 0xFF).toByte()
)
// Write to Block 5 (output current) using addressed command
val blockAddress = 0x20 // Block 5 stores output current
val writeSuccess = writeSingleBlock(nfcV, blockAddress, outputCurrentBytes, tagUid)
if (writeSuccess) {
Log.d("ProgramFragment", "Output Current successfully written: $outputCurrent mA")
nfcInstructions.text = "Write successful. Output current updated to $outputCurrent mA."
success = true // Mark success
} else {
throw IOException("Write failed")
}
} catch (e: IOException) {
Log.e("ProgramFragment", "Error writing to NFC-V tag, retrying...", e)
retries++
nfcInstructions.text = "Write failed. Retrying... ($retries/$maxRetries)"
} finally {
try {
nfcV.close()
} catch (e: IOException) {
Log.e("ProgramFragment", "Error closing NFC-V connection", e)
}
}
}
if (!success) {
nfcInstructions.text = "Write failed after $maxRetries attempts. Please try again."
}
(activity as MainActivity).isWritingNfc = false
} else {
Log.e("ProgramFragment", "NFC-V not supported on this tag")
nfcInstructions.text = "NFC-V is not supported on this tag. Please use a compatible tag."
(activity as MainActivity).isWritingNfc = false
}
}
// Helper function to write a single block using addressed command
fun writeSingleBlock(nfcV: NfcV, blockAddress: Int, dataBlock: ByteArray, tagUid: ByteArray): Boolean {
val cmd = byteArrayOf(
0x60.toByte(), // FLAGS
0x21.toByte(), // WRITE_SINGLE_BLOCK
*tagUid, // UID of the tag
(blockAddress and 0xFF).toByte() // Block address
)
val fullCmd = cmd + dataBlock // Append the data block to the command
return try {
nfcV.transceive(fullCmd)
true // Successfully written
} catch (e: IOException) {
Log.e("ProgramFragment", "Write failed for block $blockAddress", e)
false
}
}
// Helper function to reconnect to the tag
fun reconnectNfcTag(nfcV: NfcV, retries: Int = 5): Boolean {
var attempts = 0
while (attempts < retries) {
try {
if (!nfcV.isConnected) {
nfcV.connect()
}
return true // Successfully reconnected
} catch (e: IOException) {
attempts++
Log.e("NFC", "Error reconnecting to NFC tag, attempt $attempts", e)
}
}
return false // Failed to reconnect after retries
}
- Реализация повторных попыток для обоих соединений и попытки записи (до 5 повторов).
- Повторное подключение к метке NFC перед каждой операцией записи.
- Использование адресных команд с UID тега для обеспечения надежности на всех устройствах.
Как предотвратить исключение «Потеря тега» при записи данных в тег NFC-V и есть ли дальнейшая оптимизация Могу ли я реализовать повышение надежности операции записи?
Подробнее здесь: https://stackoverflow.com/questions/789 ... ng-address