我之前使用过 ACR 122,它与 Android < 4.1 的手机完美配合。我用它来交换 P2P SNEP 消息...但是由于手机是 4.1,当您将手机放在阅读器上方时,阅读器开始发出哔哔声和闪烁。有没有其他人发现这种不兼容?有什么解决办法吗?
5 回答
从 Android 4.1 Jelly Bean 开始,NFC 点对点通信被配置为使用更高的比特率 (212 kbps),而之前它使用的是 106 kbps(在安装了 Google Wallet 的 Android 设备中,它始终使用 212 kbps)。
不知道ACR122U能否通过javax.smartcardio
. 里面的NFC芯片(NXP的PN532)当然可以做到。212 和 424 kbps 的低级 ISO18092/ECMA-340 协议不同于 106 kbps。对于 106 kbps,它使用与 ISO14443 相同的调制方式,而更高的比特率使用与 FeliCa 相同的调制方式(参见标准的第 7 页和第 8页)。所以我怀疑这无法通过javax.smartcardio
.
很高兴看到其他人在这方面工作。您可以通过“直接”连接到阅读器。学分转到 Peter Kmet:javax.smartcardio 无卡传输到 NFC USB 读卡器
此示例将仅切换灯光
TerminalFactory factory;
List<CardTerminal> terminals;
factory = TerminalFactory.getDefault();
terminals = factory.terminals().list();
terminal = terminals.get(0);
byte[] response = null;
byte[] command = new byte[] { (byte) 0xff, (byte) 0x00, (byte) 0x40, (byte) 0xd0, (byte) 0x04,
(byte) 0x05, (byte) 0x05, (byte) 0x02, (byte) 0x01 };
int controlCode = 0x310000 + 3500 * 4;
Card card = null;
card = terminal.connect("DIRECT");
response = card.transmitControlCommand(controlCode, command);
如果您在 Jelly Bean 方面取得任何进展,请更新,我也会检查您的代码。
这有助于在范围内没有卡的情况下连接到终端:
terminal.connect("DIRECT");
我用一个小“黑客”解决了这个问题。我正在使用带有 SAM 模块的 ACR122U,不知道哪个版本有这个,它是 TouchATag 阅读器。我发现阅读器必须通过这条线,当手机不在 NFC 领域时:
cardTerminal.connect("*").getBasicChannel();
这是因为您必须在手机进入 nfc 字段之前将阅读器置于初始化模式,而这只有在您可以发送 APDU 时才有效!
如果有人找到无需调用connect()
.cardTerminal
这个问题与更高的比特率无关,我设法获得了 424 kbps 的通信。
您可以在 googel 代码中找到我用这些知识编写的 NFC API,我还将在那里提供一些文档:
http://code.google.com/p/java-android-beam-api/
非常欢迎评论!
在 Java 语言中,您可以使用:
1)nfctools:https ://github.com/grundid/nfctools 。它适用于 Android 4.0、4.1、4.2、4.3、4.4。
2) http://code.google.com/p/ismb-snep-java。它适用于 Android 4.0 和 Android 4.4(但不适用于 4.1、4.2、4.3)。为了在 4.4 中支持三星设备,需要对协议进行一些更改(可以从 nfctools 获取,但最好使用 nfctools 来增加兼容性)。