今日は実際に検出時間を大幅に改善することができました。「NFCウィザード」からそのWebページを見ていたところ、カードの取り外しを非常に高速に検出できることに気付きました。このjavascriptWebページは、Javaアプレットを介してリーダーと通信するため、実際には私が持っている以上のものを使用していません。
NFC Wizardの作成者であるSpringCardは、実際には、そのページの[その他のリソース]>[Java]および[SpringCardPC / SC SDK(ZIPアーカイブ)]で、同様のアプリケーションの完全なドキュメントとソースコードを提供しています。
彼らのコードを閲覧していると、カードで操作を行った後、card.disconnect(false);
関数を使用していることに気づきました(使用しようとしましcard.disconnect(true);
たが、以前と同じ結果になりました...不運)。
だからここに私がしていることがあります:
import java.util.Date;
import javax.smartcardio.*;
public class NewMethod {
private long connectTime = -1;
private long disconnectTime = -1;
private TerminalFactory factory;
private CardTerminals terminalList;
private CardTerminal ct;
public NewMethod() throws CardException{
factory = TerminalFactory.getDefault();
terminalList = factory.terminals();
ct = terminalList.list().get(0);
}
public long waitForCardPresent(){
try {
ct.waitForCardPresent(0);
} catch (CardException e) { }
return new Date().getTime();
}
public long waitForCardAbsent(){
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e1) { }
try{
ct.connect("*").disconnect(false);
}
catch(Exception e) {
return new Date().getTime();
}
}
}
public void run(){
while(true){
connectTime = waitForCardPresent();
disconnectTime = waitForCardAbsent();
System.out.println((disconnectTime-connectTime));
}
}
public static void main(String[] args){
NewMethod nm;
try {
nm = new NewMethod();
nm.run();
} catch (CardException e) {
e.printStackTrace();
}
}
}
(スレッド部分はオプションですが、スレッド部分の有無にかかわらず同じ結果が得られたので、プロセッサの消費を少し節約することを好みました)
これが私がスレッド化されたバージョンで得た時間です:531, 437, 656, 657, 735, 657, 547, 844, 15, 766, 859, 563, 765, 562, 422, 437, 563, 562, 562, 672, 672, 16, 547, 546, 672, 15, 344
そしてここでスレッド化されていないバージョンで:984, 547, 796, 656, 796, 718, 656, 812, 625, 781, 813, 547, 797, 532, 407, 609, 719, 328, 469, 328, 0, 546, 625, 0, 843, 703
結果が非常に不安定であることに気付くかもしれません(そして実際にはスレッドバージョンではかなり良いです)。これは私がリーダーに対してカードをタップする方法から来るかもしれませんが、これが唯一の理由ではないと思います。
今は十分に良さそうです。アプリケーションで実際に使用するときに、あまり大きな変動が生じないことを願っています。