import android.annotation.SuppressLint
import android.nfc.tech.NfcV
import android.util.Log
import java.io.IOException
import java.util.*
/**
*
* NfcV mNfcV = NfcV.get(tag); mNfcV.connect(); NfcVUtil
* mNfcVutil = new NfcVUtil(mNfcV); 取得UID mNfcVutil.getUID();
* 读取block在1位置的内容 mNfcVutil.readOneBlock(1); 从位置7开始读2个block的内容
* mNfcVutil.readBlocks(7, 2); 取得block的个数 mNfcVutil.getBlockNumber();
* 取得1个block的长度 mNfcVutil.getOneBlockSize(); 往位置1的block写内容
* mNfcVutil.writeBlock(1, new byte[]{0, 0, 0, 0})
*/
@SuppressLint("NewApi")
class NfcvUtil2 @SuppressLint("NewApi") public constructor(val mNfcV: NfcV) {
/** UID数组行式 */
private val ID: ByteArray = mNfcV.tag.id
val uID: String
var dSFID: String? = null
private set
var aFI: String? = null
private set
/** block的个数 */
private var blockNumber = 0
/** 一个block长度 */
private var oneBlockSize = 0
/** 信息 */
private lateinit var infoRmation: ByteArray
/**
* 取得标签信息
*/
@Throws(IOException::class)
private fun getInfoRmation(): ByteArray {
val cmd = ByteArray(10)
cmd[0] = 0x22.toByte() // flag
cmd[1] = 0x2B.toByte() // command
System.arraycopy(ID, 0, cmd, 2, ID.size) // UID
infoRmation = mNfcV.transceive(cmd)
blockNumber = infoRmation[12].toInt()
oneBlockSize = infoRmation[13].toInt()
aFI = printHexString(byteArrayOf(infoRmation[11]))
dSFID = printHexString(byteArrayOf(infoRmation[10]))
return infoRmation
}
fun getBlockNumber(): Int {
return blockNumber + 1
}
fun getOneBlockSize(): Int {
return oneBlockSize + 1
}
/**
* 读取一个位置在position的block
*
* @param position
* 要读取的block位置
* @return 返回内容字符串
* @throws IOException
*/
@Throws(IOException::class)
fun readOneBlock(position: Int): String? {
val cmd = ByteArray(11)
cmd[0] = 0x22.toByte()
cmd[1] = 0x20.toByte()
System.arraycopy(ID, 0, cmd, 2, ID.size) // UID
cmd[10] = position.toByte()
val res = mNfcV.transceive(cmd)
if (res[0].toInt() == 0x00) {
val block = ByteArray(res.size - 1)
System.arraycopy(res, 1, block, 0, res.size - 1)
//return printHexString(block);
Log.e("block1", block.contentToString())
return printHexString(block)
}
return null
}
/**
* 读取从begin开始end个block begin + count 不能超过blockNumber
*
* @param begin
* block开始位置
* @param count
* 读取block数量
* @return 返回内容字符串
* @throws IOException
*/
@Throws(IOException::class)
fun readBlocks(begin: Int, count: Int): String {
var count = count
if (begin + count > blockNumber) {
count = blockNumber - begin
}
val data = StringBuffer()
for (i in begin until count + begin) {
data.append(readOneBlock(i))
}
return data.toString()
}
/**
* 将byte[]转换成16进制字符串
*
* @param data
* 要转换成字符串的字节数组
* @return 16进制字符串
*/
private fun printHexString(data: ByteArray): String {
return String(data, Charsets.US_ASCII)
}
/**
* 将数据写入到block,
*
* @param position
* 要写内容的block位置
* @param data
* 要写的内容,必须长度为blockOneSize
* @return false为写入失败,true为写入成功
* @throws IOException
*/
@Throws(IOException::class)
fun writeBlock(position: Int, data: ByteArray): Boolean {
val cmd = ByteArray(15)
cmd[0] = 0x22.toByte()
cmd[1] = 0x21.toByte()
System.arraycopy(ID, 0, cmd, 2, ID.size) // UID
// block
cmd[10] = 0x02.toByte()
// value
System.arraycopy(data, 0, cmd, 11, data.size)
val rsp = mNfcV.transceive(cmd)
return rsp[0].toInt() == 0x00
}
/**
* 初始化
*
* @param mNfcV
* NfcV对象
* @throws IOException
*/
init {
val uid = ByteArray(ID.size)
var j = 0
for (i in ID.indices.reversed()) {
uid[j] = ID[i]
j++
}
uID = printHexString(uid)
getInfoRmation()
}
Parcelable parcelable = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Tag tag1 = (Tag)parcelable;
NfcV nfcV = NfcV.get(tag1);
nfcV.connect();
Log.e("nfcv11", "---" + nfcV);
NfcvUtil2 nfcVUtil = new NfcvUtil2(nfcV);
Log.e("nfcv11", "" + nfcVUtil.readBlocks(0, nfcVUtil.getBlockNumber()));