Какой тип байта мы отправляем с помощью IsoDep.transceive(byte[] data)?

Я пишу приложение для Android для чтения бесконтактной карты (SpringCard в режиме эмуляции карты через мой компьютер) с протоколом ISO-DEP.

Когда я использую метод IsoDep.transceive(byte[] data), я всегда получаю IOException, но моя бесконтактная карта успешно принимает мои байты и отправляет ответ (я вижу это в журнале программы эмуляции карты).

Вопрос в том, нужно ли отправлять байт данных определенного формата (например, APDU) для метода приемопередатчика?

package com.example.nfccardreader;

import java.io.IOException;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.IsoDep;
import android.nfc.tech.NfcA;
import android.os.Bundle;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

    private NfcAdapter mAdapter;
    private PendingIntent mPendingIntent;

    private final byte[] DATA = { 
            (byte) 0xFF,
            (byte) 0xFA
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        resolveIntent(getIntent());
        mAdapter= NfcAdapter.getDefaultAdapter(this);
        mPendingIntent= PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    }

     @Override
     protected void onResume() {
         super.onResume();
         mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
     }

     @Override
     protected void onPause() {
         super.onPause();
         if (mAdapter != null) {
             mAdapter.disableForegroundDispatch(this);
         }
     }

     private void resolveIntent(Intent intent) {
         String action= intent.getAction();

        if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)){
             Tag tag= intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
             communication(tag);
        } else {
             //log error
        }
     }

     private void communication(Tag tag) {
         byte[] received= null;
         IsoDep card= IsoDep.get(tag);
         try {
             card.connect();
             received= card.transceive(DATA);
         } catch (IOException e) {
             //log error
         } finally {
             try {
                 card.close();
             } catch (IOException e) {
                 //log error
             }
         }
     }

     @Override
     public void onNewIntent(Intent intent) {
         setIntent(intent);
         resolveIntent(intent);
     }

}

person a.cee    schedule 13.01.2014    source источник
comment
Этот пост должен быть полезен: [Чтение данных из тега NFC (IsoDep)][1] [1]: stackoverflow.com/questions/16815007/   -  person Sara    schedule 13.09.2014
comment
Этот пост должен быть полезен: [Чтение данных из тега NFC (IsoDep)][1] [1]: stackoverflow.com/questions/16815007/   -  person Sara    schedule 13.09.2014


Ответы (2)


Нет никаких ограничений на формат массива байтов, который вы отправляете (и получаете) с помощью IsoDep.transceive().

Поскольку ваш тег является эмулируемым, он может немного медленнее реагировать. Вы можете попробовать увеличить время ожидания, используя setTimeout()< /а>.

person NFC guy    schedule 14.01.2014

Да, вы должны отправлять APDU в методе transceive(), но это зависит от типа карты, которую вы эмулируете. Попробуйте заменить DATA на

    public static byte[] GET_RANDOM = { 
        (byte) 0x00, // CLA Class        
        (byte) 0x84, // INS Instruction
        (byte) 0x00, // P1  Parameter 1
        (byte) 0x00, // P2  Parameter 2
        (byte) 0x08  // LE  maximal number of bytes expected in result
    };

Если эмулируемая карта соответствует ISO 14443, будут возвращены случайные данные. Эмулированные карты часто реагируют медленно. Вы можете попробовать прочитать его с помощью приложения для Android, такого как NFC TagInfo, чтобы проверить, хорошо ли он работает.

person ldemay    schedule 14.01.2014
comment
спасибо, моя эмулированная карта больше не соответствует стандарту ISO 14443. - person a.cee; 14.01.2014
comment
-1 Транспортный протокол ISO/IEC 14443-4 (ISO-DEP) не подразумевает поддержку/требование APDU ISO/IEC 7816-4. По крайней мере, набор микросхем NXP и стек NFC не требуют использования APDU поверх ISO-DEP (хотя у меня нет информации о стеке чипа Broadcom/NFC). - person Michael Roland; 15.01.2014
comment
Да, извиняюсь, я перепутал 7816 и 14443. Кстати, я не вижу, когда нам нужно использовать что-то другое, кроме APDU, для связи с пружинной картой в режиме эмуляции. - person ldemay; 15.01.2014