Android读取NFC扇形区域数据

这个博客介绍了如何在Android平台上使用NfcV技术进行操作,包括连接NFC标签,获取UID,读取和写入特定块的内容,以及获取块的数量和大小。示例代码详细展示了如何实现这些功能,例如读取从特定位置开始的多个块,并将数据写入指定块。
摘要由CSDN通过智能技术生成
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()));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值