私は tikitag Web サービス用の古い NFC リーダーを持っています (これは後でtouchatagに改名され、2012 年頃に最終的に放棄されました)。Web サイトが利用できなくなったため、元の tikitag/touchatag ドライバーを見つけることができなくなりました。いくつか検索した結果、この NFC リーダーは一般的な ACS ACR122U USB リーダーであることがわかり、ここから適切なドライバーをインストールしました。私のシステムは Windows 7 (64 ビット) です。
まず、NFC タグへの高レベルの読み取りおよび書き込みアクセスのために、 NFC ツール ライブラリを試しました。サポートされていないタグが検出されたというエラーが表示されました。リーダーにはタグが存在せず、遠く離れていてもタグはありませんでした。hereに示すように、他の開発者もこのライブラリで同じエラーに遭遇したようです。このタグは無限に検出されることに注意してください (したがって、一度検出された後に消えるわけではありません)。
必要な低レベル コードを別のクラスにコピーしました (つまり、NFC ツール ライブラリから独立しています)。このコードは以下にあります (同様のコードはチュートリアルにもあります)。
import java.util.List;
import javax.smartcardio.Card;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;
import org.nfctools.utils.NfcUtils;
public class NdefTest {
public static void main(String[] args) throws Exception {
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
CardTerminal terminal = terminals.get(0);
if (terminal.waitForCardPresent(5000)) {
Card card = terminal.connect("T=0");
System.out.println(NfcUtils.convertBinToASCII(card.getATR().getHistoricalBytes()));
}
}
}
このコードは、NFC ツール ライブラリを使用した場合とまったく同じ「ファントム」タグを検出します。したがって、この問題は NFC ツール ライブラリとは無関係のようです (エラー レポートに対するライブラリ開発者の回答によると)。何か不足しているか、問題がインストールされているドライバー、NFC リーダー ハードウェア、または javax.smartcardio の未修正のバグに関連している (可能性の高い順にリストされています)。
前述のドライバーをアンインストールし、Windows 7 に適切なドライバー (「Microsoft Usbccid Smartcard Reader (WUDF)」と呼ばれる) を独自にインストールさせてみましたが、上記と同じエラーが発生します。私は 1 つしか持っていないので、他のリーダーは試していません。
(注:Windowsデバイスの概要にあるこのNFCリーダーの名前は、「ACS ACR122」または関連するものではなく、「CCID USBリーダー」です。これが重要かどうかはわかりませんが、言及したいと思いました。)
誰かがこの問題に遭遇し、それを解決できましたか?
アップデート
OK、シミュレートされたタグが検出された後、CLF コマンドをリーダーに送信しようとしました。つまり、接続された PICC の ATS を取得します ( ACR122U マニュアルの p. 11 ):
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
// (this is the correct terminal)
CardTerminal terminal = terminals.get(0);
if (terminal.waitForCardPresent(5000)) {
Card card = terminal.connect("*");
CardChannel channel = card.getBasicChannel();
// (I tried both 0x00 and 0x01 as P1, as well as 0x05 for Le)
CommandAPDU getAts = new CommandAPDU(0xFF, 0xCA, 0x00, 0x00, 0x04);
ResponseAPDU response = channel.transmit(getAts);
System.out.println(response.getSW1());
System.out.println(response.getSW2());
}
しかし、エラー応答コード (0x63 0x00) が引き続き表示されます。私が間違っている可能性があることについてのアイデアはありますか?