Nfc ACR1252 Felica仿真

Nfc ACR1252 Felica仿真,nfc,apdu,ndef,acr1252,Nfc,Apdu,Ndef,Acr1252,我正在使用连接到windows笔记本电脑的ACR1252设备,并尝试模拟带有URL标记的卡。我能够使用Mifare仿真模式(如@michael roland在中所述)发送标记。但不幸的是,对于android设备,标签的读取并不稳定(15次尝试只读取一次)。我决定试试费利卡牌。根据ACR1252的文件,必须更改命令中NFCMode的字节: NfcMode 1 byte. NFC Device Mode. 01h = MIFARE Ultralight Card 03h = FeliCa C

我正在使用连接到windows笔记本电脑的ACR1252设备,并尝试模拟带有URL标记的卡。我能够使用Mifare仿真模式(如@michael roland在中所述)发送标记。但不幸的是,对于android设备,标签的读取并不稳定(15次尝试只读取一次)。我决定试试费利卡牌。根据ACR1252的文件,必须更改命令中NFCMode的字节:

 NfcMode 1 byte. NFC Device Mode. 
 01h = MIFARE Ultralight Card
 03h = FeliCa Card Emulation Mode
write命令的指定方式如下:

但这似乎还不够,因为费利卡有不同的记忆结构。我的android手机读取标签,但无法识别NDEF消息的内容。有人知道如何更改消息以使其可识别吗?非常感谢您的建议

当我发送

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


对费利卡来说,我看到这个

也有同样的问题。我通过发送tag3属性块和NDEF消息解决了这个问题

如何构造属性块检出

关于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];
然后将它们组合在一起,并通过控制命令发送给读卡器