3

実際のカードを「接続」せずに javax.smartcardio を使用して APDU を NFC リーダー (ACR1222L など) に送信することは可能ですか? 私のAPI調査によると、Cardから取得し、CardTerminalの接続から取得したCardChannelを使用してのみAPDUを送信できます。ただし、NFC リーダーにカードがないときに接続しようとすると、CardException が発生します。一部のリーダーでは、周辺機器は標準の APDU を使用して制御されます。このように、ACR1222 の前のカードが提示された周辺機器を制御できないようです。または、 javax.smartcardio に何か不足していますか?

4

3 に答える 3

0

私の調査に従って、私は自分で部分的に答えます。Card クラスには transmitControlCommand メソッドがあります。ただし、APDUが「controlCode」および「command」バイト配列にどのように変換されるかはわかりません。カードが接続されていなくても、プロトコルとして「direct」を指定して connect メソッドを使用すると、CardTerminal から Card オブジェクトを取得できます。何らかの理由で、「ダイレクト」は Windows JVM 1.6 では機能しますが、Mac では機能せず、報告によると Linux JVM では機能しません。

于 2012-09-05T18:41:09.937 に答える
0

わかりました、もうすぐです。これは将来の世代へのメッセージです :-) transmitControlCommand メソッドには、アクセスしたい「機能」に関連する controlCode が必要です。ACS 仕様によると、ACS 周辺機器を制御するための私の機能は、コード 3500 (10 進数) の ESCAPE です。ただし、制御コードは次の複合体です。

FILE_DEVICE_SMARTCARD = 0x310000 コマンド = 3500 * 4

例: IOCTL_SMARTCARD_ESCAPE_COMMAND controlCode = 0x310000 + 3500 * 4 の結果

これで、ACS 122x 端末がコマンドを受け入れるようになります。各端末には、周辺機器を制御するための異なるコマンドがある場合があることに注意してください。

クレジット: Adrian Stabiszewski (https://github.com/grundid/nfctools)

于 2012-09-10T07:14:11.397 に答える
0

別の観察結果によると、ESCAPE コマンドの場合、controlCode は 3500 である必要があります。ACR 1222 のドキュメントによると、L エスケープ コマンドは、カードが接続されていない場合でもリーダーの周辺機器を制御するのに役立ちます。コマンド バイト シーケンスは、「プレーン オールド」APDU です。これは、ACS が提供する Android USB ライブラリを使用して機能することが証明された理論に基づいています。奇妙なことに、標準の PCSC ドライバーは 3500 (0xDAC) コマンドを好みません。ACS からの Mac の PCSC ドライバーは、connect("direct") を好みません。したがって、今のところ、ACR1222L を制御するための Java アプレットは発生しません。:(

于 2012-09-09T17:51:07.830 に答える