簡體   English   中英

javax.smartcardio無卡傳輸到NFC USB讀卡器

[英]javax.smartcardio transmit to NFC USB reader without card

是否可以使用javax.smartcardio將APDU發送到NFC讀卡器(例如ACR1222L)而無需實際卡“連接”? 根據我的API調查,您只能使用從Card獲得的CardChannel發送APDU,並且您可以從CardTerminal上的connect獲得。 但是,如果您在NFC讀卡器中沒有卡時嘗試連接,則會收到CardException。 在某些讀卡器上,使用標准APDU控制外圍設備。 這種方式似乎無法控制ACR1222先前卡的任何外圍設備。 或者我在javax.smartcardio中遺漏了什么?

根據我的調查,我會為自己部分回答。 Card類有方法transmitControlCommand。 不知道,APDU如何轉換為“controlCode”和“command”字節數組。 即使沒有連接卡,您也可以使用connect方式從“CardTerminal”獲取Card對象,並使用“direct”作為協議。 出於某種原因,“直接”適用於Windows JVM 1.6,但不適用於Mac,據報道不適用於Linux JVM。

另一個觀察表明,對於ESCAPE命令,controlCode應為3500。 根據ACR 1222 L的文檔,即使沒有連接卡,退出命令也可用於控制閱讀器的外圍設備。 然后,命令字節序列是“普通的”APDU。 這取決於理論證明使用ACS提供的Android USB庫。 奇怪的是,標准PCSC驅動程序不喜歡3500(0xDAC)命令。 來自ACS的Mac的PCSC驅動程序甚至不喜歡連接(“直接”)。 所以現在用於控制ACR1222L的java applet不會發生。 :(

好的,我們差不多了。 這是下一代的消息:-)方法transmitControlCommand需要與您要訪問的“功能”相關的controlCode。 根據ACS規范,我控制ACS外設的功能是ESCAPE,代碼為3500(十進制)。 但是控制代碼是以下復合:

FILE_DEVICE_SMARTCARD = 0x310000 COMMAND = 3500 * 4

例如,結果IOCTL_SMARTCARD_ESCAPE_COMMAND controlCode = 0x310000 + 3500 * 4

現在,您的ACS 122x終端將接受該命令。 注意,每個終端可以具有不同的命令來控制外圍設備。

致謝:Adrian Stabiszewski(https://github.com/grundid/nfctools)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM