在nfc中读取和写入数据的Android应用程序



我是NFC的新手,我正在开发一个android应用程序来读取和写入NFC中的数据,但我遇到了一些问题。

这是我正在使用的代码(写入(:

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
Toast.makeText(this, R.string.message_tag_detected, Toast.LENGTH_SHORT).show();
}
Tag currentTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] id = currentTag.getId();
String myData = "ABCDEFGHIJKL";
for (String tech : currentTag.getTechList()) {
if (tech.equals(NfcV.class.getName())) {
NfcV tag5 = NfcV.get(currentTag);
try {
tag5.connect();
int offset = 0;  
int blocks = 8;  
byte[] data = myData.getBytes();
byte[] cmd = new byte[] {
(byte)0x20,
(byte)0x21, 
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, 
(byte)0x00,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00     
};
System.arraycopy(id, 0, cmd, 2, 8);
for (int i = 0; i < blocks; ++i) {
cmd[10] = (byte)((offset + i) & 0x0ff);
System.arraycopy(data,  i, cmd, 11, 4);
response = tag5.transceive(cmd);
}
}
catch (IOException e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
return;
}
}
}
}

当我在应用TagInfo中读取标签时,输出为:

[00]。41 42 43 44[ABCD]

[01]。42 43 44 45[BCDE]

[02]。43 44 45 46[CDEF]

[03]。44 45 46 47[定义]

[04]。45 46 47 48

[05]。46 47 48 49

[06]。47 48 49 4A[GHIJ]

[07]。48 49 4A 4B

[08]。00 00 00 00[……]

这个输出正确吗?

如果"不是",我哪里错了?

对我来说,这看起来是错误的,但不是NfcV专家只使用NDEF nfc卡。

[00]。41 42 43 44[ABCD]

[01]。45 46 47 48

[02]。49 4A 4B 4C[IJKL]

作为你真正想要做的

我认为问题出在System.arraycopy(data, i, cmd, 11, 4);

您正在从源数据数组中复制4个字节的数据,但仅将起始位置增加1个字节,因此下一个块稍后从字母开始。

我认为System.arraycopy(data, i*4, cmd, 11, 4);会产生你想要的结果。

这样一来,源数据中数组副本的开头将增加已存储的字节数。

由于您有12个字节的数据,每个块存储4个字节,您只需要使用3个块,因此通过设置int blocks = 3;只循环3次,否则您将耗尽数据,无法复制到cmd中,以发送到从arraycopy生成IndexOutOfBoundsException的卡

如果没有4字节的倍数数据,则必须用0填充数据,使其成为4字节的乘积,或者从arraycopy处理IndexOutOfBoundsException以正确复制剩余字节。

最新更新