2

我正在使用连接到 Windows 笔记本电脑的 ACR1252 设备并尝试模拟带有 URL 标签的卡。我能够使用 Mifare 仿真模式(@michael-roland 在Accessing card-emulation mode on USB-NFC-Reader中描述的方式)发送标签。但不幸的是,对于 android 设备,标签的读取并不稳定(读取仅发生 15 次尝试)。我决定尝试 Felica 卡仿真。根据 ACR1252 的文档,必须更改命令中 NFCMode 的字节:

 NfcMode 1 byte. NFC Device Mode. 
 01h = MIFARE Ultralight Card
 03h = FeliCa Card Emulation Mode

写命令指定如下: 写卡仿真数据命令格式

但似乎这还不够,因为 Felica 有不同的内存结构。我的 android 手机读取标签但无法识别 NDEF 消息的内容。有人知道如何更改消息以使其可识别吗?任何建议都将受到高度赞赏。

当我发送

E0 00 00 60 1C 01 03 00 18 E1 10 06 00 03 0F D1 01 0B 55 01 67 6F 6F 67 6C 65 2E 63 6F 6D FE 00 00

给费利卡,我看到了这个在此处输入图像描述

4

1 回答 1

0

遇到了同样的问题。我通过发送 TAG 3 属性块然后发送 NDEF 消息解决了这个问题。

如何构造属性块查看http://apps4android.org/nfc-specifications/NFCForum-TS-Type-3-Tag_1.1.pdf#page=23&zoom=100,117,344

关于 NDEF 消息,它需要没有 TLV 块包装器。

NdefRecord[] records = {
            createTextRecord("en", value)
    };
    NdefMessage message = new NdefMessage(records);

    byte[] ndefMessage = message.toByteArray();

    StringBuilder hexMessage = new StringBuilder();
    for (byte b : ndefMessage) {
        hexMessage.append(String.format("%02X", b));
    }

对于属性块:

byte[] type3AttributeBlock = {
            (byte) 0x10, // version
            (byte) numberOfBlocks[3], // number of blocks
            (byte) numberOfBlocks[3], // blocks to update
            (byte) 0x00, // H blocks available
            (byte) 0x09, // L block available
            (byte) 0x00, // byte 5 unused
            (byte) 0x00, // byte 6 unused
            (byte) 0x00, // byte 7 unused
            (byte) 0x00, // byte 8 unused
            (byte) 0x00, // writeF (00: finished)
            (byte) 0x00, // RW flag (00: read only)
            (byte) messageLengthBytes[1], // ln upper
            (byte) messageLengthBytes[2], // ln middle
            (byte) messageLengthBytes[3], // ln lower
            (byte) 0x00, // H checksum
            (byte) 0x00, // L checksum
    };

    byte[] checkSum = calculateCheckSum(type3AttributeBlock, 14);

    type3AttributeBlock[14] = checkSum[2];
    type3AttributeBlock[15] = checkSum[3];

然后将它们组合在一起并通过控制命令发送给阅读器。

于 2021-02-14T09:08:43.540 回答