3

次の行を使用して、GalaxyS3を使用してMifareDesFireカードにデータを書き込もうとしています。

private byte[] wrapMessage (byte command, byte[] parameters) throws Exception {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();

    stream.write((byte) 0x90);
    stream.write(command);
    stream.write((byte) 0x00);
    stream.write((byte) 0x00);
    if (parameters != null) {
        stream.write((byte) parameters.length);
        stream.write(parameters);
    }
    stream.write((byte) 0x00);

    return stream.toByteArray();
}

boolean isoDepWrite(Tag tag) {
      IsoDep idTag = IsoDep.get(tag);
      idTag.setTimeout(5000);

      String info = "";
      DesfireProtocol dfp = new DesfireProtocol(idTag);
      try {
          idTag.connect();
          info += "Connected to IsoDep Tag...\n";

          int[] appList = dfp.getAppList();
          dfp.selectApp(appList[0]);
          info += "Selected app no: " + appList[0] + "..\n";

          int[] fileList = dfp.getFileList();
          info += "Selected file no: " + fileList[0] + "\n";

          byte[] params = {(byte)fileList[0], 
                           (byte)0x0, (byte)0x0, (byte)0x0, 
                           (byte)0x2, (byte)0x0, (byte)0x0,
                           (byte)0x41, (byte)0x41};
          byte[] message = wrapMessage((byte) 0x3d, params);

          byte[] result = idTag.transceive(message);
          info += "Result bytes: " + convertByteArrayToHexString(result) + "\n";

          toast(info);
          return true;
      } catch (IOException e) {
          info += "Could not connect to IsoDep Tag...\n";
      } catch (Exception e) {
          info += "Error messages: " + e.getMessage() + " -- " + e.getLocalizedMessage() + "\n";
      }

      toast(info);
      return false;
  }

コミュニケーション後に得られる情報は次のとおりです。

Connected to IsoDep tag...
Selected app no: 1109742 // that shows I connected to an Application
Transceieve result bytes: 91 9e  // PARAMETER ERROR

そのアプリケーションのファイルに接続して読み取ることはできますが、書き込もうとした後、ファイルにはバイトとして0が含まれています。0x9EはPARAMETER_ERRORなので、バイトのラッピング/ライニング、バイトのサンプル、またはこれに関するアイデアで何か間違ったことをしていますか?

編集: @nemoが推奨するバイトを試しました:

{0x3d, fileList[0], 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x41, 0x41}

これで、結果バイトとして「67 00」が返されます。これは、 LENGTH ERRORを意味し、ファイルは同じままで、0のみです。

最後の編集:私は単に次の方法で新しいバイト配列を作成しました:

wrapMessage(0x3d, rest of the bytes in the list @nemo recommended)

そして、それはついに機能しました。上記の作業で古いものを変更しました。

4

1 に答える 1

3

コマンドを間違えたと思いますがWrite、これは暗闇の中でのショットです。

DESFireの公式ドキュメント(検索してみてくださいM075031)によると、WriteData次のように定義されています。

WriteData(FileNo, Offset, Length, Data)

バイトストリームとして、これは次のようになります。

WriteCmd FileNo  Offset (3 byte)  Length (3 byte)  Data (0 to 52 byte)
[0x3D]   [0x00]  [0x00 0x00 0x00] [0x00 0x00 0x00] [0x00 ... 0x00]

52バイトより59バイト多く書き込むことも可能ですが、ここでは重要ではありません。

IMOは、次のようにWriteCmdに必要なデータを使用して新しい配列を作成する必要があります。

{0x3d, fileList[0], 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x41, 0x41}

で識別されるファイルに2(0x2)バイト(0x41および0x41)を書き込む必要がありますfileList[0]

編集:オフセットを更新しました。順序はLSBからMSBです。

于 2012-12-15T01:10:40.390 に答える