- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个应用程序以从 NFC 读取器 (ACR122U-A9) 设备读取 NFC 标签 UID。我使用 JAVA 和 javax.smartcardio API 来检测 NFC 阅读器和读取 NFC 标签。
该应用程序的功能是在 NFC 读取器设备与 PC 连接或断开连接时显示通知。然后,如果设备已连接并且 NFC 标 checkout 现,则显示 NFC 标 checkout 现的通知。我试图找到基于事件的 api 来实现上述功能,但找不到,所以我对 NFC 读取器设备和 NFC 标签使用了 Java 计时器和轮询。
以下是我的示例 JAVA 代码,用于 NFC 设备和标签的轮询。
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;
/**
*
* @author sa
*/
public class NFC_Test {
/**
* @param args the command line arguments
*/
static Timer timer;
public static void main(String[] args) {
try {
timer = new Timer(); //At this line a new Thread will be created
timer.scheduleAtFixedRate(new NFC_Test.MyTask(), 0, 1000);
} catch (Exception ex) {
Logger.getLogger(NFC_Test.class.getName()).log(Level.SEVERE, null, ex);
}
}
static class MyTask extends TimerTask {
public void run() {
///////////////////This fix applied after reading thread at http://stackoverflow.com/a/16987873/1411888
try {
Class pcscterminal =
Class.forName("sun.security.smartcardio.PCSCTerminals");
Field contextId = pcscterminal.getDeclaredField("contextId");
contextId.setAccessible(true);
if (contextId.getLong(pcscterminal) != 0L) {
Class pcsc =
Class.forName("sun.security.smartcardio.PCSC");
Method SCardEstablishContext = pcsc.getDeclaredMethod(
"SCardEstablishContext", new Class[]{Integer.TYPE});
SCardEstablishContext.setAccessible(true);
Field SCARD_SCOPE_USER =
pcsc.getDeclaredField("SCARD_SCOPE_USER");
SCARD_SCOPE_USER.setAccessible(true);
long newId = ((Long) SCardEstablishContext.invoke(pcsc, new Object[]{Integer.valueOf(SCARD_SCOPE_USER.getInt(pcsc))})).longValue();
contextId.setLong(pcscterminal, newId);
}
} catch (Exception ex) {
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
TerminalFactory factory = null;
List<CardTerminal> terminals = null;
try {
factory = TerminalFactory.getDefault();
terminals = factory.terminals().list();
} catch (Exception ex) { //
Logger.getLogger(NFC_Test.class.getName()).log(Level.SEVERE,null, ex);
}
if (factory != null && factory.terminals() != null && terminals
!= null && terminals.size() > 0) {
try {
CardTerminal terminal = terminals.get(0);
if (terminal != null) {
System.out.println(terminal);
if (terminal.isCardPresent()) {
System.out.println("Card");
} else {
System.out.println("No Card");
}
} else {
System.out.println("No terminal");
}
terminal = null;
} catch (Exception e) {
Logger.getLogger(NFC_Test.class.getName()).log(Level.SEVERE,null, e);
}
factory = null;
terminals = null;
Runtime.getRuntime().gc();
} else {
System.out.println("No terminal");
}
}
}
}
以上代码在 Windows 操作系统中运行良好,但当我在 MAC 操作系统上运行它时,应用程序可以完美运行 5-10 秒,但随后它突然崩溃并出现以下内存错误。
java(921,0x10b0c3000) malloc: *** mmap(size=140350941302784) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Java Result: 139
我在互联网上搜索过,但找不到任何关于上述内存错误的信息。我还包含了内存管理代码,以便在定时器中使用对象时通过为其分配 NULL 值来释放对象。
我用过http://ludovicrousseau.blogspot.com/2010/06/pcsc-sample-in-java.html供引用
最佳答案
我相信这是我在 OS X 上的 64 位 Java 上尝试使用 libj2pcsc.dylib 追踪错误时遇到的错误之一。另请参阅 smartcardio thread on discussions.apple.com和我的 email to security-dev .基本上,问题在于 DWORD*
在 OS X 上应该是指向 32 位数字的指针,但 Sun 的库假定它是指向 64 位数字的指针。然后它取消对该值的引用并尝试 malloc 一个该大小的缓冲区,该缓冲区的高 32 位可能包含垃圾。请参阅 source of pcsc.c 中的 Java_sun_security_smartcardio_PCSC_SCardListReaders
可能的解决方法:
Terminals.list()
的调用要非常保守(间歇性崩溃),不要相信 Terminal.isCardPresent()
的结果,Terminals.waitForChange(long)
,或 CardTerminal.waitForCard(boolean, long)
。我的同事意识到他可以使用反射调用 TerminalImpl.SCardGetStatusChange(long, long, int[], String[])
以获得正确的结果。这是我们过去常做的。非常痛苦!javax.smartcardio
的不同实现。我知道两个:我自己的 jnasmartcardio和 intarsys/smartcard-io .不过,我还没有在 NFC 卡上尝试过自己的库,但欢迎任何错误报告和补丁。关于java - 使用 JAVA 智能卡 API 读取 NFC 标签不适用于 MAC OS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20071532/
我正在尝试通过 java smartcardio 读取印度政府标准的“Scosta”智能卡我使用的代码是 package com.example.smartcardreader; import jav
下面的代码适用于 2 个不同的加密智能卡库(certum cryptoCertum3PKCS.dll 和 cencert enigmap11.dll ),但在提供用于 100%正确 有人知道我做错了什
有没有人有阅读 eVRC(电子车辆登记卡)和 JAVA 中的 APD U 命令的经验? 任何例子都会有用。 提前致谢。 最佳答案 我强烈建议您使用 javax.smartcardio 库。请注意,在后
我正在将一个旧项目迁移到 Java,但我遇到了一些有关智能卡访问的问题。由于缺乏文档,我不得不自己寻找解决方法,所以我希望你们能帮助我。 我有一张智能卡和一个用于访问卡功能的 dll 库(中间件)。使
我刚刚开始了解一些智能卡,并且正在使用 pyscard 进行练习。 所以我有 2 个问题(我使用的是 Visa 预付卡): 1)我在网上看到有人说有一个方法可以知道你的卡可以使用哪些选择方式,通过他的
Closed. This question needs debugging details。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。 6个月前关闭。
我正在使用 BouncycaSTLe 来管理我的项目的加密功能。我设法使用 CMS 进行加密和解密,其中两个 key 都存储在我的文件系统中(.cert 和 .p12)。 这是我实际使用的两个函数:
我正在尝试使用 CredMartialCredential 和 LogonUser 为使用智能卡的用户帐户获取访问 token 。有两个帐户可以使用智能卡进行身份验证(描述(有点)here)。 通过关
我们尝试在 iPhone 上连接 PIV 智能卡。我们已经加载了必要的库并且可以发送命令。使用获取数据和获取响应命令的组合,我们能够从智能卡检索所有相关证书。我们现在尝试发送通用身份验证命令来签署一些
我在使用智能卡签署 PDF 文档时遇到问题。它适用于不合格的证书,但不适用于合格的证书。我正在使用 SunPKCS11 提供程序。这是 CryptoTech 卡。这是代码的一部分,我尝试在该提供程序上
我正在为 ISO 7816 卡编写智能卡程序,我需要更新记录。我用JAVA和javax.smartcardio编写程序图书馆。 我使用以下命令选择文件:ins = 0xA4 我可以使用此命令读取记录:
我正在开发用于读取 EMV 卡的智能卡读卡器。我正在处理一张万事达卡,我试图读取特定记录。结果显示读数很好,但是当我解析结果时,它们似乎不遵循 TLV 标准,其中结果采用 Tag/Template-L
我有一个网络服务器服务,客户端请求智能卡计算并获得结果。在服务器正常运行期间,可用的智能卡数量可能会减少或增加,例如,我可以从读卡器中物理添加或移除智能卡(或许多其他事件......如异常等)。 智能
[我的设置] RDP 客户端 (Win7) ------------------RDP------------------------ -> 带智能卡的远程服务器 (Win2k8R2) 我发现无数的答
我可以毫无问题地从智能卡发送大部分数据。我注意到出于某种原因我总是需要删除 APDU 中的前 6 个字节才能获取真实数据。 但是,当发送一个特定数据时,很难知道该数据在 APDU 中的位置。 这是Ja
我也在使用 C++(Windows API)和 Java 的 SmartCard API。 我在删除操作系统后获取 ATR 时遇到问题。我的申请是为了从智能卡中删除操作系统。当操作系统被删除时,卡的
我正在编写一个Java程序,它使用USB证书(智能卡)进行加密和签名。我有一个共享库(Windows 上为 .dll,Linux 上为 .so),它为硬件实现了 PKCS11。 我正在搜索现有的解决方
我目前可以正确使用 pyscard 与我的智能卡通信,但是当 apdu 大小超过 255 字节时,我需要接收命令的剩余字节。 用什么方法获取 pyscard 中的剩余字节?根据我的理解,sw2 应该是
我必须调用服务器上的脚本(php、jsp - 什么都行)。但是此服务器受客户端身份验证保护。现在我可以使用 P12-Keystore 来完成它。代码: private void install
我正在尝试在 ACOS5-64 智能卡和 OMNIKEY 3121 读卡器上创建 AES 256 key ,使用 python 中的 PKCS11(使用 PyKCS11 库)。到目前为止,所有“标准”
我是一名优秀的程序员,十分优秀!