背景として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_Target
UID を指定してコマンドを使用して次のカードを選択します。
ただし、カードを選択するたびに、返される 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
}
}
}