在 Java 中关闭 NFC reader ( NFC ACR122U) 上的蜂鸣器
Turning off the buzzer on NFC reader ( NFC ACR122U) in Java
我在使用 NFC 卡的 java 程序中使用 ACR122U NFC reader。但默认情况下 reader 在读取卡片时会发出蜂鸣声。我试图通过 NFC reader 文档(在此处找到:http://www.acs.com.hk/download-manual/419/API-ACR122U-2.03.pdf)显示您可以关闭蜂鸣器但没有成功将其关闭。但是我在为它编写 java 方法时遇到了问题。如您所见,我的 class 已经具有与 NFC reader 通信的方法。但是我无法将文档中显示的命令转换为 java 方法。
NFC卡class:
package dataStores;
import java.util.List;
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;
public class NFCcard {
private TerminalFactory factory;
private List<CardTerminal> terminals;
private CardTerminal terminal;
private Card card ;
public CardChannel cardChannel;
public NFCcard() throws CardException {
factory = TerminalFactory.getDefault();
terminals = factory.terminals().list();
terminal = terminals.get(0);
card = terminal.connect("*");
cardChannel = card.getBasicChannel();
cardChannel.transmit( new CommandAPDU(new byte[] { (byte)0xE0, (byte)0x00, (byte)0x00, (byte)0x21, (byte)0x01,(byte)0x77 }));
}
public String getCardID() throws CardException{
String cardID = "";
ResponseAPDU answer=cardChannel.transmit( new CommandAPDU(new byte[] { (byte)0xFF, (byte)0xCA, (byte)0x00, (byte)0x00, (byte)0x00 }));
byte r[] = answer.getData();
for (int i=0; i<r.length; i++)
cardID+=r[i];
return cardID;
}
}
您可以尝试这样的操作:
byte buzzerOn = (byte)0xFF;
byte buzzerOff = (byte)0x00;
byte clazz = (byte)0xFF;
byte ins = (byte)0x00;
byte p1 = (byte)0x52;
byte p2 = buzzerOff;
byte le = (byte)0x00;
byte[] apdu = new byte[]{clazz,ins,p1,p2,le};
ResponseAPDU answer = cardChannel.transmit( new CommandAPDU(apdu));
byte successSW1 = (byte)0x90;
byte successSW2 = (byte)0x00;
if(answer.getSW1() == successSW1 && answer.getSW2() == successSW2){
//done
}else{
//failed
}
响应必须是 90 00
我在使用 NFC 卡的 java 程序中使用 ACR122U NFC reader。但默认情况下 reader 在读取卡片时会发出蜂鸣声。我试图通过 NFC reader 文档(在此处找到:http://www.acs.com.hk/download-manual/419/API-ACR122U-2.03.pdf)显示您可以关闭蜂鸣器但没有成功将其关闭。但是我在为它编写 java 方法时遇到了问题。如您所见,我的 class 已经具有与 NFC reader 通信的方法。但是我无法将文档中显示的命令转换为 java 方法。
NFC卡class:
package dataStores;
import java.util.List;
import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;
public class NFCcard {
private TerminalFactory factory;
private List<CardTerminal> terminals;
private CardTerminal terminal;
private Card card ;
public CardChannel cardChannel;
public NFCcard() throws CardException {
factory = TerminalFactory.getDefault();
terminals = factory.terminals().list();
terminal = terminals.get(0);
card = terminal.connect("*");
cardChannel = card.getBasicChannel();
cardChannel.transmit( new CommandAPDU(new byte[] { (byte)0xE0, (byte)0x00, (byte)0x00, (byte)0x21, (byte)0x01,(byte)0x77 }));
}
public String getCardID() throws CardException{
String cardID = "";
ResponseAPDU answer=cardChannel.transmit( new CommandAPDU(new byte[] { (byte)0xFF, (byte)0xCA, (byte)0x00, (byte)0x00, (byte)0x00 }));
byte r[] = answer.getData();
for (int i=0; i<r.length; i++)
cardID+=r[i];
return cardID;
}
}
您可以尝试这样的操作:
byte buzzerOn = (byte)0xFF;
byte buzzerOff = (byte)0x00;
byte clazz = (byte)0xFF;
byte ins = (byte)0x00;
byte p1 = (byte)0x52;
byte p2 = buzzerOff;
byte le = (byte)0x00;
byte[] apdu = new byte[]{clazz,ins,p1,p2,le};
ResponseAPDU answer = cardChannel.transmit( new CommandAPDU(apdu));
byte successSW1 = (byte)0x90;
byte successSW2 = (byte)0x00;
if(answer.getSW1() == successSW1 && answer.getSW2() == successSW2){
//done
}else{
//failed
}
响应必须是 90 00