2

NXP が開発した NFC タグを Android アプリケーションで読み取ろうとしています。Android でタグを読み取ることができます: NXP のアプリもう 1 つが正しく読み取れます。

正確なタグ タイプは「ICODE SLI-L (SL2ICS50)」で、RF テクノロジは「タイプ V / ISO 15693」です (動作中のアプリから取得したデータ)。メモリは、それぞれ 4 ブロックの 2 ページで構成され、ブロックにはそれぞれ 4 バイトがあります。データ全体をメモリに保存したいだけです。

タグは Android のNfcVクラスで処理する必要があり、タグのデータシートはこちらから入手できますが、 を使用した実際のコード例を見つけるのは困難NfcVです。データシートで結論付けたいくつかのことを自分で試し、Google で見つけたこの PDFの通信サンプルを試しましたが、何も機能しません。

私のアクティビティ (NFC Foreground Dispatch を使用) で対応するメソッドは次のようになります。

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.。これは私が試したすべてのバイト配列の結果です (上記のものはおそらく正しいとは言えませんが、ここ数日で他の多くの配列を試しましたが、すべて同じ動作になりました。

インターネットで読んだところによると、間違ったコマンドをタグに送信したためにエラーが発生したと結論付けましたが、正しいコマンドを思い付くことができませんでした。何か案は?

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 に答える