我正在开发一个连接到HID 5022读卡器的Java应用程序。我需要的是读取PACS位(原始Wiegand数据)。
我在这个问题上也有同样的问题,我也可以看到PACS探测应用程序的数据:
不幸的是,所提供的答案并不适用于我。
这就是我从PACS探测器得到的信息:
我已经尝试了在Omnikey 5023指南中找到的命令,令人惊讶的是它返回了一些数据,但这不是我所需要的。
该命令是:
commandAPDU = new CommandAPDU(new byte[] { (byte) 0xFF, (byte) 0x70, (byte) 0x07, (byte) 0x6B, (byte) 0x07,
(byte) 0xA0, (byte) 0x05, (byte) 0xBE, (byte) 0x03, (byte) 0x80, (byte) 0x01, (byte) 0x04, (byte) 0x00 }); // Read PACS 5023它返回以下内容:
9E020003//我需要000000310BC 53938
任何帮助都是非常感谢的,因为我是新的智能卡开发。提前谢谢。
发布于 2019-07-02 21:30:30
您从读取器获得的响应APDU是不受支持的专用命令的错误代码。
您将需要一个安全会话来使用OMNIKEY 5022或OMNIKEY 5023读取器访问PACS位数据。
除非您为这个阅读器提供了适当的文档,否则我可能会坚持使用卡片序列号(UID,CSN),并使用Java包装器(用于PC/SC (或pcsclite) )连接读取器和卡片。
然后发出(通过SCardTransmit(FFCA0000 APDU) )获取UID (32966202F8FF12E0),该UID显示在来自https://PACSprobe.com的示例输出中。
至于Java:使用智能心脏库。这是本地PC/SC的一个很好的包装器
将安全通道协议移植到Java上需要做很多工作。打电话给第三方图书馆可能更容易。
发布于 2020-04-07 22:53:46
我能够使用javax.smartcardio,并使用如下代码获取Wiegand数据。最后,您可以看到设施代码和卡号是打印出来的。
TerminalFactory terminalFactory = TerminalFactory.getDefault();
CardTerminals cardTerminals = terminalFactory.terminals();
List<CardTerminal> terminalList = cardTerminals.list();
CardTerminal cardTerminal = terminalList.get(0);
cardTerminal.waitForCardPresent(10 * 1000); // wait 10 seconds
Card card = cardTerminal.connect("*");
System.out.println("Card: " + card);
CardChannel channel = card.getBasicChannel();
byte[] aid = { (byte) 0xA0, (byte) 0x05, (byte) 0xA1, (byte) 0x03, (byte) 0x80, (byte) 0x01, (byte) 0x04 };
CommandAPDU apdu = new CommandAPDU(0xFF, (byte) 112, (byte) 7, (byte) 107, aid, 256);
ResponseAPDU r = channel.transmit(apdu);
byte[] bytesOut = r.getBytes();
int num1 = (int) bytesOut[3];
if (bytesOut.length - 6 != num1)
System.out.println("problem");
int numberOfBitsShifted = (int) bytesOut[4];
int num2 = num1 - 1;
byte[] newBytesArr = Arrays.copyOfRange(bytesOut, 5, 5 + num2);
if (newBytesArr.length != num2)
System.out.println("problem");
ByteBuffer wrapped = ByteBuffer.wrap(newBytesArr);
int num = wrapped.getInt();
int first26 = num >> 6;
int withoutParity = first26 >> 1;
int cardNumber = withoutParity & 0xffff;
int facilityCode = (withoutParity >> 16) & 0xff;
System.out.println(facilityCode);
System.out.println(cardNumber);https://stackoverflow.com/questions/56834108
复制相似问题