Чтение тега NDEF через APDUAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Чтение тега NDEF через APDU

Сообщение Anonymous »

Для контекста я создаю приложение для Android, которому необходимо прочитать текстовое сообщение NDEF с карты NFC типа A. Я хочу прочитать это через свои системы торговых точек на базе Android, которые требуют выполнения команд PICC и APDU (поэтому я не могу использовать библиотеку Android NDEF по умолчанию).
Чтобы записать в Тег NFC, я просто использую NFC Tools в магазине Google Play. Вы увидите, что я написал в теге «123456789», но на самом деле мой код читает «1234567123456789123456789». Я надеюсь, что это имеет смысл, и кто-то увидит, что происходит не так. Спасибо!
Код:

Код: Выделить всё

  private fun extractNdef(tag: Tag): String? {
val nfcA = NfcA.get(tag) ?: return null

nfcA.use {
nfcA.connect()

// Read blocks 4-8
val allData = StringBuilder()
for (block in 4..8) {
val response = try {
val rawResponse = nfcA.transceive(byteArrayOf(0x30.toByte(), block.toByte()))
rawResponse.joinToString("") { "%02x".format(it) }
} catch (e: IOException) {
Log.e("NFC", "Failed to read block $block", e)
return null
}
allData.append(response)
Log.d("NFC", "Block $block Data: $response")
}

val ndefData = allData.toString()
Log.d("NFC", "Combined NDEF Data: $ndefData")

return parseNdefData(ndefData)
}
}

fun parseNdefData(hexData: String): String {
// Convert hex data to bytes
val bytes = hexData.chunked(2).map { it.toInt(16).toByte() }.toByteArray()

// Search for the text record identifier and language code prefix
val textRecordType = 0x54.toByte() // "T" for text records in NDEF
val langCodeLength = 3 // Length of 'T' + length of "en" (2 bytes)

// Locate and decode the text content
val contentBuilder = StringBuilder()
for (i in bytes.indices) {
if (bytes[i] == textRecordType && i + langCodeLength < bytes.size) {
// Start extracting bytes after 'T' and "en" prefix (language code)
val textContentBytes = bytes.drop(i + langCodeLength + 1)
.takeWhile { it != 0xFE.toByte() && it != 0x00.toByte() } // Stop at `FE` or padding `00`

// Convert to string and filter only ASCII digits
contentBuilder.append(
textContentBytes
.toByteArray()
.toString(Charsets.UTF_8)
.filter { it.isDigit() }
)
}
}
return contentBuilder.toString()
}
Журналы:

Код: Выделить всё

2024-10-29 12:27:25.226 27321-27339 NFC                     com.passentry.nfc_reader_libraries   D  Block 4 Data: 0310d1010c5402656e31323334353637
2024-10-29 12:27:25.238 27321-27339 NFC                     com.passentry.nfc_reader_libraries   D  Block 5 Data: 0c5402656e313233343536373839fe00
2024-10-29 12:27:25.253 27321-27339 NFC                     com.passentry.nfc_reader_libraries   D  Block 6 Data: 6e313233343536373839fe0000000000
2024-10-29 12:27:25.266 27321-27339 NFC                     com.passentry.nfc_reader_libraries   D  Block 7 Data: 343536373839fe000000000000000000
2024-10-29 12:27:25.284 27321-27339 NFC                     com.passentry.nfc_reader_libraries   D  Block 8 Data: 3839fe00000000000000000000000000
2024-10-29 12:27:25.285 27321-27339 NFC                     com.passentry.nfc_reader_libraries   D  Combined NDEF Data: 0310d1010c5402656e313233343536370c5402656e313233343536373839fe006e313233343536373839fe0000000000343536373839fe0000000000000000003839fe00000000000000000000000000
2024-10-29 12:27:25.349 27321-27339 MainActivity            com.passentry.nfc_reader_libraries   D  Pass ID: 1234567123456789123456789
Тег NFC
Изображение
Изображение


Подробнее здесь: https://stackoverflow.com/questions/791 ... g-via-apdu
Ответить

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

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

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

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

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