В настоящее время я разрабатываю приложение для Android (на JAVA) для смартфонов NFC. Я пытаюсь связаться с тегом Nfca, но продолжаю получать TagLostException независимо от команды, которую я отправляю через transceive(byte[]). Тег хорошо подключен к устройству.

Вот важный фрагмент кода:

public void onNewIntent(Intent intent) {
    setIntent(intent);

    tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); // get the tag object for the discovered tag

    nfca = NfcA.get(tag); // try and get the instance for this tag
    if(nfca == null) {
        Alert("tag","the tag is not NfcA");
    } else {
        new Thread(new Runnable() {
            @Override
            public void run() {
                handler.sendEmptyMessage(1); //this will call handleMessage function and handle all error
            }
        }).start();
    }
}

final Handler handler = new Handler() {
    //handles the connection with the tag
    @Override
    public void handleMessage(final Message msgs) {
        // try to connect to the NfcA tag
        try {
            nfca.connect();
        } catch(IOException e) {
            Alert("nfca.connect","cannot open connection ><");
        }
        Toast.makeText(NfcaActivity.this, "tag connected", Toast.LENGTH_LONG).show();

    }
};

try {
    //nfca.setTimeout(3000);
    pageBuffer = nfca.transceive(command);                                                                      
} catch(IOException e) {
    Alert("pageBuffer","cannot perform transceive "+ e.toString());
} catch(Exception e) {
    Alert("exception!", e.toString());
}

Я пытаюсь выполнить следующую команду: {00 CA 42 08 00} или {00 A4 00 00 02 3F00}, но получаю те же результаты.

Эти команды работают, когда я использую устройство для чтения смарт-карт и программное обеспечение на моем ПК. Смарт-карта не пуста.

4
Jinbonka 26 Мар 2013 в 18:17

1 ответ

Лучший ответ

Я полагаю, что на карте тоже доступна технология IsoDep? Если это так, вам следует подключиться, используя это. Одна из перечисленных вами команд выглядит как APDU ISO 7816-4 для выбора главного файла. Предполагается, что это будет использоваться с картами ISO 14443-4, что и представляет собой технология IsoDep.

3
NFC guy 26 Мар 2013 в 18:58
Да, на карте также доступна технология IsoDep, и да, я использую команды APDU ISO 7816-4. Могу ли я использовать технологию NFCA для подключения и связи с картой? Если да, то подходит ли ISO 7816-4 для отправки? Или я могу подключиться к нему только с помощью IsoDep?
 – 
Jinbonka
26 Мар 2013 в 19:06
Для ISO 7816-4 вы должны использовать IsoDep (так же, как вы использовали NfcA; просто замените эту строку в своем коде на IsoDep).
 – 
NFC guy
26 Мар 2013 в 19:26
Действительно, мои команды работают с IsoDep, но я хотел использовать NfcA, какие протоколы я должен использовать для этого, если это возможно?
 – 
Jinbonka
26 Мар 2013 в 19:34
NfcA - это уровень протокола ниже IsoDep. Если бы вы использовали NfcA для обмена данными с тегами, вам пришлось бы внедрить ISO 14443-4 в свое приложение (что, вероятно, трудно сделать из-за довольно строгих требований к времени), потому что это протокол, который поддерживает ваш тег. Но в этом нет необходимости, потому что Android предоставляет то, что тег поддерживает с IsoDep.
 – 
NFC guy
27 Мар 2013 в 10:08
1
Попробуйте установить для тайм-аута ответа более высокое значение с помощью setTimeout ().
 – 
NFC guy
15 Дек 2013 в 18:12