2

我正在尝试在我的 Android 应用程序中读取 NXP 开发的 NFC 标签。可以使用 Android 读取标签:NXP 的应用程序其他应用程序正确读取它。

确切的标签类型是“ICODE SLI-L (SL2ICS50)”,射频技术是“Type V / ISO 15693”(数据取自这些工作应用程序)。内存由 2 个页面组成,每个页面有 4 个块,每个块有 4 个字节——我只想将整个数据存储在内存中。

NfcV该标签必须使用 Android 的类来处理,标签的数据表可在此处获得,但很难找到任何使用NfcV. 我尝试了一些我自己通过数据表得出的结论,并尝试了我在 Google 中找到的这个 PDF中的通信示例,但没有任何效果。

我的活动中的相应方法(我使用 NFC 前台调度)如下所示:

public void onNewIntent(Intent intent) {
    android.nfc.Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    NfcV tech = NfcV.get(tag);
    try {
        tech.connect();
        byte[] arrByt = new byte[9];
        arrByt[0] = 0x02;
        arrByt[1] = (byte) 0xB0;
        arrByt[2] = 0x08;
        arrByt[3] = 0x00;
        arrByt[4] = 0x01;
        arrByt[5] = 0x04;
        arrByt[6] = 0x00;
        arrByt[7] = 0x02;
        arrByt[8] = 0x00;
        byte[] data = tech.transceive(arrByt);
        // Print data
        tech.close();
    } catch (IOException e) {
        // Exception handling
    }
}

当我将手机放在标签上时,该方法被正确调用,但对象的transceive()方法NfcV总是抛出一个 IOException: android.nfc.TagLostException: Tag was lost.。这是我尝试过的所有字节数组的结果(上面的不太可能正确,但在过去的几天里,我尝试了一堆其他的都导致相同的行为。

根据我在 Internet 上阅读的内容,我得出的结论是,错误的发生是因为我向标签发送了错误的命令——但我就是想不出正确的命令。有任何想法吗?

4

1 回答 1

8

ISO 15693 定义了不同的读取命令,制造商也可以定义专有的读取命令。所有 ICODE 标签都支持 ISO 15693 单块读取命令。您可以按如下方式发送:

public static void processNfcIntent(Intent intent){
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    if(tag != null){
      // set up read command buffer
      byte blockNo = 0; // block address
      byte[] readCmd = new byte[3 + id.length];
      readCmd[0] = 0x20; // set "address" flag (only send command to this tag)
      readCmd[1] = 0x20; // ISO 15693 Single Block Read command byte
      byte[] id = tag.getId();
      System.arraycopy(id, 0, readCmd, 2, id.length); // copy ID
      readCmd[2 + id.length] = blockNo; // 1 byte payload: block address

      NfcV tech = NfcV.get(tag);
      if (tech != null) {
        // send read command
        try {
          tech.connect();
          byte[] data = tech.transceive(readCmd); 
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          try {
            tech.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    }
}
于 2013-03-28T23:26:00.917 回答