首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式检测NFC芯片的内存大小/页号

如何以编程方式检测NFC芯片的内存大小/页号
EN

Stack Overflow用户
提问于 2015-02-20 11:01:14
回答 2查看 1.5K关注 0票数 1

除了探测特定的页号和检查是否存在特定的页号之外,以编程方式检测NFC芯片(MIFARE、Ultralight或NTAGxxx)的内存大小或页数的最简单方法是什么?

在返回的ATR中是否有一个特定的字节,或者存储在芯片内存的受保护区域中,以指示它是特定的NTAGxxx芯片,还是页面计数或字节计数?

EN

回答 2

Stack Overflow用户

发布于 2018-11-27 23:08:11

我认为,从被接受的答案看,下面的代码是有意义的,

代码语言:javascript
复制
int numberOfPages = 0;
int tagType = ulTag.getType();
if(tagType == MifareUltralight.TYPE_ULTRALIGHT) {
    numberOfPages = 16;
} else if(tagType == MifareUltralight.TYPE_ULTRALIGHT_C) {
    numberOfPages = 47;
}

getMaxTransceiveLength()是检索最大字节数,可以用收发信机(byte[])发送。Transceive命令使用前3个字节分别用于标志、命令和页号。

我们需要检查下面的代码是否有效?

代码语言:javascript
复制
int totalBytes = ulTag.getMaxTransceiveLength() + 3;
int totalPages =  totalBytes / ulTag.PAGE_SIZE;
票数 0
EN

Stack Overflow用户

发布于 2020-01-16 14:21:09

对于MIFARE超轻,您可以以这种方式检查版本。

代码语言:javascript
复制
public static final int OFFSET_128_BYTE =  0x025;
public static final int OFFSET_48_BYTE  =  0x010;

public static int checkType(MifareUltralight mrfid){
    int cfgOffset = -1;
    byte[] response = null;
    byte[] writeResponse = null;
    try {
        response = mrfid.transceive(new byte[]{
                (byte) 0x60 // GET_VERSION
        });
    } catch (TagLostException tle) {
        Utility.log("setPasswordAndEnable GET_VERSION, TagLostException ... ");
        return cfgOffset;
    } catch (IOException ioe) {
        Utility.log("setPasswordAndEnable GET_VERSION, IOException ... ");
        return cfgOffset;
    }
    if ((response != null) && (response.length >= 8)) {
        // success
        if ((response[0] == (byte) 0x00) && (response[1] == (byte) 0x04)) {
            // tag is from NXP
            if (response[2] == (byte) 0x03) {
                // MIFARE Ultralight
                if ((response[4] == (byte) 0x01) && (response[5] == (byte) 0x00)) {
                    // MIFARE Ultralight EV1 (V0)
                    switch (response[6]) {
                        case (byte) 0x0B:
                            // MF0UL11
                            cfgOffset = OFFSET_48_BYTE;
                            break;
                        case (byte) 0x0E:
                            // MF0UL21
                            cfgOffset = OFFSET_128_BYTE;
                            break;

                        default:
                            // unknown
                            break;
                    }
                }
            }
        }
    }
    return cfgOffset;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28627394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档