Чтобы записать в Тег 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


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