使用HCE Android的NDEF消息

时间:2015-03-18 13:03:14

标签: android nfc ndef hce

我想使用Android的HCE功能模拟主机卡。为此我扩展了服务类HostApduService并覆盖了以下方法:

 public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
    if (Arrays.equals(SELECT_APDU, commandApdu)) {
        NdefMessage message = new NdefMessage(new NdefRecord  [] {NdefRecord.createTextRecord("en", "test"});
       return message.toByteArray();
    } else {
        return UNKNOWN_CMD_SW;
    }
}

使用第二个设备可以从HCE服务接收数据。问题是我总是收到“Type A”标签,但我需要一个NDEF消息。

有人能帮助我吗?

2 个答案:

答案 0 :(得分:4)

对于那些坚持此问题的人,我已经阅读了@Michael Roland提出的NFCForum-TS-Type-4-Tag。整个想法是正确的。您所需要做的就是模拟SEND和RECEIVED过程,以将字节数组转换为NDEF消息。我创建了两个存储库,一个存储库总结了有关将字符串转换为NDEF message的整个程序包,另一个存储库是一个iOS Reader NDEF TAG来验证Android HCE是否正确。

祝你好运!

答案 1 :(得分:2)

使用Android HCE模拟检测为NDEF标记的标记并不像发送NDEF消息以响应SELECT APDU那么简单。您需要实施NFC论坛类型4标签操作规范。您可以从NFC Forum website获得该规范。

基本上,您需要为AID D2760000850101注册一个HCE服务,该服务实现了一些读取器用来访问Type 4标签的APDU命令:

  • SELECT NDEF标签应用

    00 A4 04 00 07 D2760000850101 [00]
    
  • SELECT功能容器

    00 A4 00 0C 02 E103
    
  • SELECT NDEF数据文件

    00 A4 00 0C 02 xxyy
    

    其中xxyy是能力容器中指定的NDEF数据文件的文件ID。

  • READ BINARY(用于从能力容器或NDEF数据文件中读取数据,无论当前选择哪个)

    00 B0 xx yy zz
    

    其中xx yy是要读取的偏移量,zz是要读取的字节数。

重要提示:请注意,Android设备模拟的此类NFC论坛类型4标签不能用于在第二台Android设备上自动触发应用程序(至少不可靠?)。将两个Android设备放在一起通常会导致它们建立点对点链接(即使Beam已关闭!)。只有第二台Android设备上的前台应用才能使用NFC阅读器模式API绕过Android Beam并可靠地检测模拟标签。