Write Multiple Blocks 命令在 NfcV 上失败
Write Multiple Blocks command failed over NfcV
我正在尝试通过 NfcV
对象使用 WRITE MULTIPLE BLOCKS 命令将一些数据写入 NXP ICODE SLIX SL2S2002 标签 (ISO 15693):
private void writeTagData(Tag tag) throws Exception {
int offset = 0;
int blocks = 19;
String _writedata = "1hello34567850000071234561815064150220161603201016022018112233445552031033";
byte[] data = _writedata.getBytes(StandardCharsets.UTF_8);
data = Arrays.copyOfRange(data, 0, 4 * blocks );
byte[] id = tag.getId();
boolean techFound = false;
for (String tech : tag.getTechList()) {
if (tech.equals(NfcV.class.getName())) {
techFound = true;
NfcV nfcvTag = NfcV.get(tag);
try {
nfcvTag.connect();
} catch (IOException e) {
Toast.makeText(this, "IO Exception", Toast.LENGTH_LONG).show();
return;
}
try {
byte[] cmd = new byte[] {
(byte)0x20,
(byte)0x24,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)(offset & 0x0ff),
(byte)((blocks - 1) & 0x0ff)
};
System.arraycopy(id, 0, cmd, 2, 8);
byte[] cmd_plus_data = new byte[88];
System.arraycopy(cmd, 0, cmd_plus_data, 0, cmd.length);
System.arraycopy(data, 0, cmd_plus_data, 12, data.length);
byte[] response = nfcvTag.transceive(cmd_plus_data);
String strResponse = Common.toHexString(response);
} catch (IOException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
try {
nfcvTag.close();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
}
}
}
transceive(...)
方法的响应是 010f
(表示 "Unknown Error")。以前,我能够使用命令 READ MULTIPLE BLOCKS 从同一标签成功读取数据。
我试图在 NfcV
对象上调用 getMaxTransceiveLength()
,结果值为 253。
ISO/IEC 15693 将 WRITE MULTIPLE BLOCKS 命令定义为可选命令。由标签芯片(或实际上是其制造商)来执行此命令。
在您的情况下,NXP ICODE SLIX SL2S2xx2(就像所有(大多数?)ICODE SLI/SLIX 标签一样)不支持 WRITE MULTIPLE BLOCKS 命令。因此,标签 returns 错误代码为 0x0F。 ICODE SLIX SL2S2xx2 数据表定义在不支持命令的情况下返回此错误代码。
相反,SL2S2xx2 支持 WRITE SINGLE BLOCK (0x21) 命令。您可以在循环中使用该命令来写入所有数据:
byte[] cmd = new byte[] {
/* FLAGS */ (byte)0x20,
/* COMMAND */ (byte)0x21,
/* UID */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
/* OFFSET */ (byte)0x00,
/* DATA */ (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, 4 * i, cmd, 11, 4);
byte[] response = nfcvTag.transceive(cmd);
}
我正在尝试通过 NfcV
对象使用 WRITE MULTIPLE BLOCKS 命令将一些数据写入 NXP ICODE SLIX SL2S2002 标签 (ISO 15693):
private void writeTagData(Tag tag) throws Exception {
int offset = 0;
int blocks = 19;
String _writedata = "1hello34567850000071234561815064150220161603201016022018112233445552031033";
byte[] data = _writedata.getBytes(StandardCharsets.UTF_8);
data = Arrays.copyOfRange(data, 0, 4 * blocks );
byte[] id = tag.getId();
boolean techFound = false;
for (String tech : tag.getTechList()) {
if (tech.equals(NfcV.class.getName())) {
techFound = true;
NfcV nfcvTag = NfcV.get(tag);
try {
nfcvTag.connect();
} catch (IOException e) {
Toast.makeText(this, "IO Exception", Toast.LENGTH_LONG).show();
return;
}
try {
byte[] cmd = new byte[] {
(byte)0x20,
(byte)0x24,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
(byte)(offset & 0x0ff),
(byte)((blocks - 1) & 0x0ff)
};
System.arraycopy(id, 0, cmd, 2, 8);
byte[] cmd_plus_data = new byte[88];
System.arraycopy(cmd, 0, cmd_plus_data, 0, cmd.length);
System.arraycopy(data, 0, cmd_plus_data, 12, data.length);
byte[] response = nfcvTag.transceive(cmd_plus_data);
String strResponse = Common.toHexString(response);
} catch (IOException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
try {
nfcvTag.close();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
}
}
}
transceive(...)
方法的响应是 010f
(表示 "Unknown Error")。以前,我能够使用命令 READ MULTIPLE BLOCKS 从同一标签成功读取数据。
我试图在 NfcV
对象上调用 getMaxTransceiveLength()
,结果值为 253。
ISO/IEC 15693 将 WRITE MULTIPLE BLOCKS 命令定义为可选命令。由标签芯片(或实际上是其制造商)来执行此命令。
在您的情况下,NXP ICODE SLIX SL2S2xx2(就像所有(大多数?)ICODE SLI/SLIX 标签一样)不支持 WRITE MULTIPLE BLOCKS 命令。因此,标签 returns 错误代码为 0x0F。 ICODE SLIX SL2S2xx2 数据表定义在不支持命令的情况下返回此错误代码。
相反,SL2S2xx2 支持 WRITE SINGLE BLOCK (0x21) 命令。您可以在循环中使用该命令来写入所有数据:
byte[] cmd = new byte[] {
/* FLAGS */ (byte)0x20,
/* COMMAND */ (byte)0x21,
/* UID */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
/* OFFSET */ (byte)0x00,
/* DATA */ (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, 4 * i, cmd, 11, 4);
byte[] response = nfcvTag.transceive(cmd);
}