之前我使用过ACR 122,它与Android< 4.1电话。我用它来交换P2P SNEP消息......但是由于手机有4.1,当你把手机放在它上面时,读卡器会开始发出哔哔声并闪烁。有没有其他人发现这种不兼容性?任何解决方案?
答案 0 :(得分:6)
自从Android 4.1 Jelly Bean以来,NFC点对点通信被配置为使用更高的比特率(212 kbps),而早期使用的是106 kbps(在安装了Google Wallet的Android设备中,它总是使用212 kbps )。
我不知道ACR122U是否可以通过javax.smartcardio
支持更高的比特率。内部的NFC芯片(恩智浦的PN532)当然可以做到。 212和424 kbps的低级ISO18092 / ECMA-340协议与106 kbps不同。对于106 kbps,它使用与ISO14443相同的调制,而较高比特率使用与FeliCa相同的调制(参见第7 and 8 of the standard页)。所以我怀疑这不能通过javax.smartcardio
处理。
答案 1 :(得分:4)
此示例只会切换灯光
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取得任何进展,请更新,我也会检查您的代码。
答案 2 :(得分:3)
这有助于在没有卡范围的情况下建立到终端的连接:
terminal.connect("DIRECT");
答案 3 :(得分:1)
我用一个小小的&#34; hack&#34;解决了这个问题。我正在使用带有SAM模块的ACR122U,不知道哪个版本有它的TouchATag阅读器。我发现,当手机不在NFC领域时,读者必须通过这一行:
cardTerminal.connect("*").getBasicChannel();
这是因为您必须在手机进入nfc字段之前将阅读器置于inializer模式,这只有在您发送APDU时才有效!
如果有人在connect()
上未调用cardTerminal
而找到了发送APDU的解决方案。
此问题与较高比特率无关,我设法以424 kbps进行通信。
你可以在googel代码中找到我用这方面的知识编写的NFC API,我还会在那里提供一些文档:
http://code.google.com/p/java-android-beam-api/
非常欢迎评论!
答案 4 :(得分:0)
在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来提高兼容性。)