试图使用ACR122连接到com.android.npp,但得到错误说[NFCSTATUS_INVALID_STATE]

问题描述:

我一直在使用javax.cardio包来从我的Nexus S通过ACR122U接收NDEF消息。我创建了一个Android Beam应用程序,它发送一个简单的文本“Hello!”当意图过滤NDEF_DISCOVERED标记时。当使用TgGetData(0x86可以)命令我似乎得到:试图使用ACR122连接到com.android.npp,但得到错误说[NFCSTATUS_INVALID_STATE]

NfcP2pLinkManager(7588): Sending ndef via SNEP 
NFC JNI(7588): Socket not connected 
NFC JNI(7588): LLCP Link deactivated 
NFC JNI(7588): LLCP Connect request failed 
NfcService(7588): LLCP Link Deactivated message. Restart polling loop. 
NFC JNI(7588): phLibNfc_Llcp_Close() returned 0x0001[NFCSTATUS_INVALID_PARAMETER] 
NfcP2pLinkManager(7588): Failed to connect over SNEP, trying NPP 
NdefPushClient(7588): about to create socket 
NfcP2pLinkManager(7588): LLCP deactivated. 
NdefPushClient(7588): about to connect to service com.android.npp 
NFC JNI(7588): phLibNfc_Llcp_ConnectByUri() returned 0x0011[NFCSTATUS_INVALID_STATE] 
NdefPushClient(7588): couldn't send tag 
NdefPushClient(7588): exception: 
NdefPushClient(7588): java.io.IOException 
NdefPushClient(7588): at 
com.android.nfc.nxp.NativeLlcpSocket.connectToService(NativeLlcpSocket.java:47) 

我下面的ACR122的APDU工作流程基本上是:

1) TgInitAsTarget = 0xD4, 0x8c 
2) TgGetData = 0xD4, 0x86 
3) TgSetData = 0xD4, 0x85, 0x81 
4) TgGetData = 0xD4, 0x86 

有谁知道为什么我不能连接到“ com.android.npp“服务的Nexus S?

我发现了为什么我的问题正在发生。一旦我通过TgGetData接收到来自手机的第一组字节,就不需要发送CONNECT APDU。在第一个字节流之后,发送一个CC APDU或一个CONNECTION COMPLETE。对于那些谁需要帮助,APDU的应该是:

1) TgInitAsTarget 0xD4 0x8C 
2) TgGetData 0xD4 0x86 
3) TgSetData (CC) 0xD4 0x8E - no need to send the service name. Simple the DSAP-CC-SSAP bytes. That's it. 
4) TgGetData 0xD4 0x86 - you should get your data in this byte stream. 
5) TgRelease 0xD4 0x8E 

记住:您必须切换你从手机四周得到您的TgSetData使用DSAP和SSAP。祝你好运!

+0

请你可以复制/粘贴你的通信的所有字节序列?我花了一个星期的时间尝试从我的手机发送一个NDEF消息到我的ACR122U阅读器,但一直不可能:( – OverMind 2017-03-06 14:07:17

+0

@OverMind,因为我从这个项目中移除了,我不再有这些序列了,我会快速浏览我的档案找到它们,当时我正在研究Nexus S,因此这些序列对于您的手机和/或操作系统可能不一定相同。 – codedawg82 2017-03-07 22:15:49

请参阅this ACP122的核电厂实施如何实现。

+0

这个人有我非常相似的代码。我使用了以下ADPU: (字节)0xd4,(字节)0x8e --- TgSetData (字节)0x05,(字节)0x21,(字节)0x06,(字节)0x0f, (字节)0x63,(字节) 0x6f,(字节)0x6d,(字节)0x2e,(字节)0x61, (字节)0x6e,(字节)0x64,(字节)0x72,(字节)0x6f,(字节)0x69, (字节)0x64,(字节)0x2e,(字节)0x6e,(字节)0x70,(字节)0x70 这连接到服务,我收到ndefmessage,但它仍然没有完成梁。它抛出了一个名为“NdefPushServer:错误格式化的NDEF消息,忽略”的错误 - 一个IOException,我怀疑梁失败了。任何想法为什么? – codedawg82 2012-03-03 21:50:57

+0

难道是你的“你好!”消息未封装在NDEF消息中(即使用文本RTD)? – 2012-03-04 20:03:13

+0

我试图从我的手机收到Hello消息,Android SDK足以提供API转换为NDEF。我已经使用了Nexus的Nexus和其他Nexus,并且信息正确。我想知道是否需要为手机可以连接的ACR本身创建一个com.android.npp服务...我说这是由于以下调试行的唯一原因 - NdefPushClient(7588):about连接到服务com.android.npp – codedawg82 2012-03-05 00:35:08