安卓 NFC 不能向 Mifare DesFire 卡写入数据

3

我正在尝试使用Galaxy S3将一些数据写入Mifare DesFire卡,代码如下:

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",意思是长度错误,文件仍然保持不变,只有0。 最后编辑:我只需创建一个新的字节数组:
wrapMessage(0x3d, rest of the bytes in the list @nemo recommended)

最终它起作用了。我用上述能工作的版本替换了旧版本。


你不能那样打印result字节数组。你需要循环遍历每个字节并一个一个地打印。 - NFC guy
请查阅您的文档,了解错误代码0x9E的含义。 - NFC guy
感谢您的快速回复。9E代表参数错误。 - İsmet Alkan
请查看您的文档以获取WriteData命令的确切细节。 - NFC guy
这就是我找不到的,字节的确切排列方式。我会尝试使用此链接中的字节:http://pastebin.com/UtQQZ1xN - İsmet Alkan
显而易见的问题:您确定该文件可写且您拥有正确的密钥吗? - Nikolay Elenkov
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个字节,但这在此不重要。

我认为你应该按照以下方式制作一个具有WriteCmd所需数据的新数组:

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

需要向由fileList [0]标识的文件写入2个字节(0x41和0x41)。

编辑:更新偏移量,顺序为LSB到MSB。


谢谢你的努力。我尝试了你提供的字节流,得到了67 00作为结果字节。然而,文件仍然只有0。 - İsmet Alkan
有任何错误吗?同样的错误?你读了规格说明书吗?能否更新一下问题? - nemo
根据规范,0x67 是“长度错误”的错误代码。我可能在长度的字节顺序上弄错了,请尝试调整并报告是否有效,谢谢 :) - nemo
尝试了0x2 MSB->LSB,但没有成功。你能写下你要找的规格吗? - İsmet Alkan
非包装消息不会带你到任何地方。我想让你测试我刚写的wrapMessage调用并报告结果。还要检查你正在编辑的文件是否是正确类型的。有可能你正在尝试编辑一个特殊的文件。 - nemo
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接