[英]How to Control LED on ACR122 using smartcardio and Java?
我正在嘗試使用 Java(JDK 8、NetBeans 7.4、Windows 10)中的 smartcardio 庫。 我嘗試了許多其他庫,但都沒有成功。
讀卡器(ACS ACR122U)附帶一張 SDK CDROM,但必要的。DLL 不在 CD 上,所以我不能使用 ACS 庫。
由於我的 NFC 設備使用了 nfctools 庫不支持的 EEPROM,因此我無法使用 nfctools。
我的代碼如下:
package myPackage;
import java.util.List;
import javax.smartcardio.*;
public class Blog {
public static void main(String[] args) {
try {
// Display the list of terminals
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
// Use the first terminal
CardTerminal terminal = terminals.get(0);
// Connect with the card
Card card = terminal.connect("*");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();
// Send Red and Green LED ON command
byte[] cmd1 = {(byte)0xFF, // Pseudo-APDU class
0x00, // INS
0x00, // P1
0x00, // P2
9, // Lc - number of bytes in Payload
(byte)0xFF, // First byte of payload - LED/Buzzer cntrl
0x00, // INS
0x40, // P1
0x0F, // P2 - LED state control
0x04, // Lc
0x00, // 4 byte blink duration control
0x00,
0x00,
0x00 };
CommandAPDU apdu1 = new CommandAPDU( cmd1, // Byte array to use
0, // index to start of msg
14 );// msg length
System.out.println( "apdu1: " + apdu1.toString() );
ResponseAPDU answer1 = channel.transmit( apdu1 );
System.out.println("answer1: " + answer1.toString());
// Get Firmware Version of the reader
byte[] cmd2 = {(byte)0xFF, 0x00, 0x00, 0x00, 5, (byte)0xFF, 0x00, 0x48, 0x00, 0x00 };
CommandAPDU apdu2 = new CommandAPDU( cmd2, 0, 10 );
System.out.println( "apdu2: " + apdu2.toString() );
ResponseAPDU answer2 = channel.transmit( apdu2 );
System.out.println("answer2: " + answer2.toString());
System.out.println();
// Disconnect the card
card.disconnect(false);
} catch(CardException e)
{
System.out.println("Problem: " + e.toString());
}
}
}
它失敗並顯示有關“apdu 必須至少有 2 個字節長”的錯誤。
run:
Terminals: [PC/SC terminal ACS ACR122 0]
card: PC/SC card in ACS ACR122 0, protocol T=1, state OK
apdu1: CommmandAPDU: 14 bytes, nc=9, ne=0
Exception in thread "main" java.lang.IllegalArgumentException: apdu must be at least 2 bytes long
at javax.smartcardio.ResponseAPDU.check(ResponseAPDU.java:73)
at javax.smartcardio.ResponseAPDU.<init>(ResponseAPDU.java:67)
at sun.security.smartcardio.ChannelImpl.transmit(ChannelImpl.java:91)
at myPackage.Blog.main(Blog.java:43)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
object apdu1 的長度為 14 個字節,所以我不確定錯誤消息的含義。
第 43 行是ResponseAPDU answer1 = channel.transmit( apdu1 );
如評論 0xff class 的 APDU 命令對卡無效,這用於讓讀卡器解釋 APDU 而不是將其發送到卡。
不是同一個讀者,但這張圖很清楚
所以不要嘗試通過復制 INS、P1、P2 和 Lc 字段來將 APDU 包裝在另一個 APDU 中
// Send Red and Green LED ON command
byte[] cmd1 = {(byte)0xFF, // First byte of payload - LED/Buzzer cntrl
0x00, // INS
0x40, // P1
0x0F, // P2 - LED state control
0x04, // Lc
0x00, // 4 byte blink duration control
0x00,
0x00,
0x00 };
CommandAPDU apdu1 = new CommandAPDU( cmd1, // Byte array to use
0, // index to start of msg
9 );// msg length
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.