同时,我还需要了解Android NFC API如何支持Desfire,因为据我所见,它仅能完全支持Classic。 http://developer.android.com/reference/android/nfc/tech/package-summary.html
MIFARE DESFire符合ISO 14443-4标准。在Android中,对于ISO 14443-4(因此是MIFARE DESFire),支持由IsoDep
类完成。你可以使用该类的transceive()
方法发送任何DESFire命令。
此外,DESFire可以配置为符合NFC Forum类型4标签规范。在这种情况下,Android将自动读取标签上的任何NDEF消息并将其分派到一个意图中。因此,当扫描特定标签时,你可以使你的应用程序自动启动。(Android也可以格式化DESFire芯片以包含NDEF,并将NDEF数据写入其中。)
用移动NFC设备替代DESFire卡是另一回事。当前可用的Android设备上的卡模拟是由连接到NFC芯片的嵌入式安全元素完成的。Android应用程序不能模拟卡(也没有API可供此操作),安全元素也无法模拟DESFire芯片。此外,没有开放的API可让应用程序从一个应用程序中访问安全元素。
Android NFC应用程序与另一个设备(而不是卡)之间通过NFC进行通信的唯一方式是使用Android Beam。然而,这是一种与卡和读卡器之间使用的不同协议。
NFC的回答很好,但有点过时,所以我决定添加更新。
从KitKat(4.4)开始,您现在可以模拟没有安全元素的卡片。
它被称为基于主机的卡片仿真(Hce),有了它,您可以仿真ISO 14443类型A的卡片。就像Desfire卡一样。
有两个小细节:
读卡器必须在轮询“卡”后立即发出ISO SELECT(aid),其中包含您选择的固定应用程序ID(aid)。此AID必须在您的应用程序清单中注册。 Android将拦截此ISO SELECT,读取aid,并仅在匹配清单中的aid时调用您。 然后您可以交换任何内容,甚至不需要是ISO APDU(ISO 14443封装由Android完成)。因此,例如,如果您想要,甚至可以仿真Desfire的挑战响应身份验证(0xA0 key_num、0xAF challenge、0xAF response、0x00 session_key)
您不能依赖UID(但您不会这样做,对吧?这是一个坏习惯,因此没有人这样做...对吧? :)),因为它是随机的,并且不断变化(当然,不是在单个会话内,但是...)
我们正在模拟我们的Desfire卡片,唯一需要做的更改是从最初的Desfire选择应用程序(0x5A)切换到ISO SELECT(0x00 0xA4 0x04)。
仿真身份验证(挑战响应)可能有些棘手,但我们已经以“另一种方式”(使用NFC读取Desfire卡)完成了它,因此对我们来说很容易。
如果您依赖卡UID进行身份验证...现在是更改它的好时机 :)
根据您的情况,我认为Android SDK已经足够解决您的问题了。
您的案例有两个部分:
第一部分:
您唯一需要担心的是读取DESFire卡。如果DESFire卡中的信息以NDEF格式存储,则事情会更加容易。
Ndef
是SDK中的一个类,可用于检索NdefMessage
类型的信息,然后您可以将检索到的信息保存到您的存储设施中,无论是本地数据库、远程数据库还是仅在应用程序内存中。
以上是在假设卡未受保护的情况下。如果受保护,则必须使用transceive
函数进行原始字节通信交互。这将解锁其余信息的读取。从这里,您可以读取NDEF记录。
第二部分:
我的建议是跳过模拟卡方面。您最终会遇到难题。
如果已有解决方案中读取卡的设备连接到了安卓设备,那么Android Beam就是最好的选择。这其实就是安卓应用程序之间的通信!安卓已经完成了大部分工作,所以你只需要做一些简单的工作。
卡上的信息可以存储为ndef消息并通过beam发送,或者你可以创建一个自定义对象并将其发送出去。