Получение исключения «Потеря тега» при записи в тег NFC-V в Android (с использованием адресных команд)Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Получение исключения «Потеря тега» при записи в тег NFC-V в Android (с использованием адресных команд)

Сообщение Anonymous »

Я работаю над приложением для Android, в котором мне нужно записать данные в тег NFC-V. Я использую метод transceive() для записи отдельных блоков в тег NFC, но во время процесса записи постоянно сталкиваюсь с исключением «Потеря тега». Я реализовал повторные попытки и гарантировал, что соединение устанавливается перед каждой попыткой записи, но проблема не устранена.
Вот краткое описание моей настройки:
Настройка:
Приложение 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»