ACR1252 Эмуляция Felica

Я использую устройство ACR1252, подключенное к ноутбуку с Windows, и пытаюсь имитировать карту с тегом URL. Мне удалось отправить тег, используя режим эмуляции Mifare (способ, который @michael-roland описал в разделе "Доступ к режиму эмуляции карты на USB-NFC-Reader"). Но, к сожалению, чтение тега нестабильно для Android-устройств (чтение происходит только один раз за 15 попыток). Решил попробовать эмуляцию карты Felica. Согласно документации ACR1252 байт для NFCMode в команде должен быть изменен:

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

Команда записи указывается как: Формат команды данных эмуляции карты записи

Но, похоже, этого недостаточно, потому что у Фелики другая структура памяти. Мой телефон с 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

Фелике я вижу это

1 ответ

Получил ту же проблему. Я решил это, отправив блок атрибутов 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];

Затем объединяют их вместе и отправляют на считыватель с управляющей командой.

Другие вопросы по тегам