【问题标题】:Formatting a Mifare Ultralight to NDEF throw IO Exception将 Mifare Ultralight 格式化为 NDEF 会引发 IO 异常
【发布时间】:2016-03-14 10:40:20
【问题描述】:

我想使用以下代码格式化一张从未使用过的 MIFARE Ultralight 卡:

NdefFormatable formatable = NdefFormatable.get(tag);
if (formatable != null) {
    String result = "Afifly";
    try {
        formatable.connect();

        try {
            formatable.format(new NdefMessage(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)));
        } catch (Exception e) {
            // let the user know the tag refused to format
            System.out.println("error ");//+getStackTrace(e));
            result = "Fail 1";
        }
    } catch (Exception e) {
        // let the user know the tag refused to connect
        System.out.println("eeeerrror 2"+e);
        result = "Fail 2";
    } finally {
        try {
            formatable.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return;
}

但是在调用formatable.format(...)方法时总是抛出一个IOException(没有任何有意义的消息)。

我尝试了其他几张卡片,结果都一样。但是,这些卡可以使用 NXP TagWriter 进行格式化。

我已找到问题/答案“Formatting a Mifare Ultralight C to NDEF”,但此解决方案不适用于我。我仍然得到相同的 IOException。

标签的前四页(0-3页)包含以下字节:

04 F1 E9 94 42 AB 4A 80 23 48 00 00(清除所有锁定位) 00 00 00 00(无能力容器)

因此,标签为空且未锁定。

【问题讨论】:

  • tag.getTechList()列举了哪些技术? IOException 是否包含任何消息 (e.getMessage())?在尝试使用format(...)之前,标签第3-5页的内容是什么?
  • 列举了3个技术人员:android.nfc.tech.NfcAandroid.nfc.tech.MifareUltraLightandroid.nfc.tech.NdefFormatablee.getMessage()打印出null
  • 当我阅读它时,它给了我一个包含值 4 -15 -23 -108 66 -85 74 -128 35 72 and 6 zero 的字节数组,所以如果它是 4 字节页面,它在第 3 页上给了我 35 72 0 0 并且在 4 和 5 上只有 0 。 .. 当我致电MifareUltralight.get(tag).readPages(0) 时,每张未格式化的卡上都有不同的文字
  • 标签确实是空的并且没有被锁定,所以如果您的 Android 设备支持该标签类型的格式,格式应该正常工作。您可以尝试的另一件事是使用不同的 NDEF 消息(例如,一些包含非空记录的消息)。如果这不起作用,您的设备平台可能不支持使用NdefFormatable 格式化该标签类型,即使它错误地提供了NdefFormatable 标签技术。不幸的是,确实存在这样的设备。如果是这种情况,我建议您手动执行格式化程序。
  • 感谢您的回答。我尝试使用非空记录但没有成功......如果我的设备平台不支持格式化,为什么格式化在与 tagwriter 的应用程序相同的设备上工作?他们正在使用 NdefFormatable 的其他东西?那是什么?

标签: android format nfc mifare ndef


【解决方案1】:

在空的 MIFARE Ultralight 标签上调用 NdefFormatable.format() 时获得 IOException 的最可能原因是您的设备不支持“格式化”(即初始化为 NFC Forum Type 2 标签)该类型的标签。如果是这样的话,你甚至看到NdefFormatable技术显然是一个错误。

在这种情况下,您唯一的选择是手动执行格式化过程(有关详细信息,请参阅 NFC 论坛类型 2 标签操作规范)。这也是各种标签编写应用程序(例如 NXP TagWriter)所做的。对于 MIFARE Ultralight (MF0ICU1) 标记(不要尝试将其用于较大的标记!),这样的事情会起作用:

NfcA nfcA = NfcA.get(tag);
if (nfcA != null) {
    try {
        nfcA.connect();
        nfcA.transceive(new byte[] {
            (byte)0xA2,  // WRITE
            (byte)0x03,  // page = 3
            (byte)0xE1, (byte)0x10, (byte)0x06, (byte)0x00  // capability container (mapping version 1.0, 48 bytes for data available, read/write allowed)
        });
        nfcA.transceive(new byte[] {
            (byte)0xA2,  // WRITE
            (byte)0x04,  // page = 4
            (byte)0x03, (byte)0x00, (byte)0xFE, (byte)0x00  // empty NDEF TLV, Terminator TLV
        });
    } catch (Exception e) {
    } finally {
        try {
            nfcA.close();
        } catch (Exception e) {
        }
    }
}

【讨论】:

  • @Phoenix 感谢您发现并纠正复制粘贴错误(错误的页码)。不知道为什么您的编辑被拒绝了...
  • 您知道如何在格式化卡片后刷新标签技术列表,无需再次触摸吗?格式化成功,但我无法立即在卡片上写字,因为标签与格式化之前的技术列表相同,要刷新它,我需要取出卡片并将其戴上以使用良好的技术列表检测它。 ..
  • @Phoenix 不,这根本不可能(有一些邪恶和不稳定的技巧,如禁用和重新启用 NFC 发现,但甚至不要尝试这样做......)如果你需要立即编写 NDEF 消息,您还需要使用低级命令编写该消息。您可以通过将 NDEF 消息填充到(当前为空)NDEF TLV 中来做到这一点。
  • 谢谢,但我最终决定使用nfcA.transceive() 编写自己的六进制位,以免对 ndefMessage 感到尴尬……感谢您的应用程序帮助我看到了我在上面写的内容!
  • 抱歉“愚蠢”的评论,但它可以用来“模拟”Mifare Ultralight 卡吗?因此,例如,使用 .connect() 向阅读器发送数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
相关资源
最近更新 更多