0

背景としてIn_List_Passive_Target、PN532 のユーザー マニュアルに指定されているコマンドを使用して、端末フィールドのすべてのカードの UID を取得しました。また、ACR122U の疑似コマンドFF 00 00 00 04を使用して、これらのコマンドを PN532 に送信しています。

>>  FF 00 00 00 04 D4 4A 01 00           # In_List_Passive_Target (1)
<<  D5 4B 01 01 00 04 08 04 3E 58 A7 D1  # Response including UID (1)
>>  FF 00 00 00 04 D4 4A 01 00           # In_List_Passive_Target (2)
<<  D5 4B 01 01 00 04 08 04 9E 69 A7 D1  # Response including UID (2)
>>  FF 00 00 00 04 D4 4A 01 00           # In_List_Passive_Target (3)
<<  D5 4B 00                             # No more cards in field (3)

これができたので、これらを1つずつ選択したいと思います。In_Deselectこれを行うには、使い終わったときにカード ( ) を停止し、そのIn_List_Passive_TargetUID を指定してコマンドを使用して次のカードを選択します。

ただし、カードを選択するたびに、返される ATR を知りたいと思います。カードを切断してから新しいカードを作成しても、端末によって作成されたカード オブジェクトは常に同じカード (したがって同じ ATR を返す) であるため、これは Java スマート カード IO API では困難であることがわかっています。これは、PN532 端末コマンドを介してカードと通信する場合In_Data_Exchange、それが正しい別のカードであることを考えると奇妙です (Card オブジェクトを介してアクセスできる古いカードではありません)。どのタイプのカードか (Mifare Classic、Desfire、Ultralight など) を検出できるように ATR が必要です。

カードを収集するために作成した関数は次のとおりです。

public static void getCardsInField()
    {
        cardList = new ArrayList<AbstractCard>();
        Boolean loop = true;

        // Card already connected to the terminal
        byte[] firstCardUID = transmitADPUCommand(GET_ADDRESS);
        MifareClassic firstCard = new MifareClassic(cardChannel, firstCardUID);
        cardList.add(firstCard);

        System.out.println(firstCard);
        System.out.println(readable(card.getATR().getBytes()));

        while(loop)
        {
            byte[] inDeselectResponse = transmitADPUCommand(IN_DESELECT); // Deselect current card
            byte[] inListPassiveTargetsResponse = transmitADPUCommand(IN_LIST_PASSIVE_TARGETS); // Select a new card

            System.out.println(">>  " + readable(IN_LIST_PASSIVE_TARGETS));
            System.out.println("<<  " + readable(inListPassiveTargetsResponse));

            // Trying to create a new card object for new card
            try
            {
                card.disconnect(true);
                card = cardTerminal.connect("*");
                cardChannel = card.getBasicChannel();
            }
            catch (CardException e)
            {
                e.printStackTrace();
            }

            if (Arrays.equals(inListPassiveTargetsResponse, IN_LIST_PASSIVE_TARGET_RESPONSE_NO_TARGETS)) // no more targets
            {
                loop = false;
            }
            else
            {
                byte[] loopCardUID = extractUID(inListPassiveTargetsResponse);
                MifareClassic loopCard = new MifareClassic(cardChannel, loopCardUID);
                cardList.add(loopCard);

                System.out.println(loopCard);
                System.out.println(readable(card.getATR().getBytes())); // this should be different ATR but it is the old cards atr
            }
        }
    }
4

1 に答える 1