libNFC 是否仅支持 READ、WRITE 和 COMP_WRITE
Does libNFC only support READ, WRITE and COMP_WRITE
一周前我买了一个 NFC Reader (PN532 I2C) 和 5 个 NFC 标签 (NTAG216),目标是为 Java 创建一个接口,所以我可以使用 Java 为我的项目。接口按预期工作,但是当我尝试 NTAG216 支持的所有命令时(NTAG216 data sheet 第 32 页),只有 READ、WRITE 和 COMP_WRITE 工作。这不是接口造成的,我也在C中试过,结果一样。那么,我的命令中是否有任何错误,或者 libNFC 是否以任何方式阻止了这些命令的执行?
对不起,我的英语可能不好,我希望我的问题仍然可以理解。
感谢您的回答,
雅各布
代码:
public class Main {
public static void main(String[] args) {
System.load(new File("libNFC-JavaInterface.so").getAbsolutePath());
Context context = new Context();
Device device = new Device(context);
Target target = new Target();
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106), null,
target);
int[] response;
System.out.print("UID: ");
try {
System.out.printf("%014X", getUID(device));
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Version: ");
try {
response = getVersion(device);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Read: ");
try {
response = read(device, 0x08);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Fast Read: ");
try {
response = fastRead(device, 0x08, 0x11);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Write: ");
try {
write(device, 0x08, new int[] {0x41, 0x42, 0x43, 0x44});
System.out.print("SUCCESSFUL");
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Compatibility Write: ");
try {
compatibilityWrite(device, 0x09, new int[] {0x45, 0x46, 0x47, 0x48});
System.out.print("SUCCESSFUL");
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Read cnt: ");
try {
response = readCnt(device);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Read sig: ");
try {
response = readSig(device);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
target.free();
device.close();
context.exit();
}
public static long getUID(Device device) throws NFCException {
int[] response = read(device, 0x00);
return (long) response[0] << 48 | (long) response[1] << 40 | (long) response[2] << 32
| (long) response[4] << 24 | (long) response[5] << 16 | (long) response[6] << 8
| (long) response[7] << 0;
}
public static int[] getVersion(Device device) throws NFCException {
int[] response = new int[8];
device.transceiveBytes(new int[] {0x60}, response, -1);
return response;
}
public static int[] read(Device device, int startPage) throws NFCException {
int[] response = new int[16];
device.transceiveBytes(new int[] {0x30, startPage & 0xFF}, response, -1);
return response;
}
public static int[] fastRead(Device device, int startPage, int endPage) throws NFCException {
int[] response = new int[((endPage &= 0xFF) - (startPage &= 0xFF) + 1) * 4];
device.transceiveBytes(new int[] {0x3A, startPage, endPage}, response, -1);
return response;
}
public static void write(Device device, int startPage, int[] data) throws NFCException {
int[] command = new int[6];
command[0] = 0xA2;
command[1] = startPage & 0xFF;
for (int i = 0; i < data.length; i++) {
command[2 + i] = data[i] & 0xFF;
}
device.transceiveBytes(command, new int[0], -1);
}
public static void compatibilityWrite(Device device, int startPage, int[] data)
throws NFCException {
int[] command = new int[18];
command[0] = 0xA0;
command[1] = startPage & 0xFF;
for (int i = 0; i < data.length; i++) {
command[2 + i] = data[i] & 0xFF;
}
device.transceiveBytes(command, new int[0], -1);
}
public static int[] readCnt(Device device) throws NFCException {
int[] response = new int[3];
device.transceiveBytes(new int[] {0x39, 0x02}, response, -1);
return response;
}
public static int[] readSig(Device device) throws NFCException {
int[] response = new int[32];
device.transceiveBytes(new int[] {0x3C, 0x00}, response, -1);
return response;
}
}
然后输出:
UID: 04675362D55681
Version: error libnfc.driver.pn532_i2c Application level error detected (127)
FAILED
Read: 41424344454647480000000000000000
Fast Read: error libnfc.driver.pn532_i2c Application level error detected (127)
FAILED
Write: SUCCESSFUL
Compatibility Write: SUCCESSFUL
Read cnt: error libnfc.driver.pn532_i2c Application level error detected (127)
FAILED
Read sig: error libnfc.driver.pn532_i2c Application level error detected (127)
FAILED
我没有尝试使用 libNFC,但我的代码遇到了同样的问题,所以它可能是相同的修复...
对于NTAG2xx的特定功能(GET_VERSION、FAST_READ、READ_CNT、READ_SIG),需要使用PN532功能"InCommunicateThru"(0x42 ) 而不是 "InDataExchange" (0x40)。此功能仅适用于标准 NFC 论坛功能(读取、写入)。
一周前我买了一个 NFC Reader (PN532 I2C) 和 5 个 NFC 标签 (NTAG216),目标是为 Java 创建一个接口,所以我可以使用 Java 为我的项目。接口按预期工作,但是当我尝试 NTAG216 支持的所有命令时(NTAG216 data sheet 第 32 页),只有 READ、WRITE 和 COMP_WRITE 工作。这不是接口造成的,我也在C中试过,结果一样。那么,我的命令中是否有任何错误,或者 libNFC 是否以任何方式阻止了这些命令的执行?
对不起,我的英语可能不好,我希望我的问题仍然可以理解。
感谢您的回答,
雅各布
代码:
public class Main {
public static void main(String[] args) {
System.load(new File("libNFC-JavaInterface.so").getAbsolutePath());
Context context = new Context();
Device device = new Device(context);
Target target = new Target();
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106), null,
target);
int[] response;
System.out.print("UID: ");
try {
System.out.printf("%014X", getUID(device));
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Version: ");
try {
response = getVersion(device);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Read: ");
try {
response = read(device, 0x08);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Fast Read: ");
try {
response = fastRead(device, 0x08, 0x11);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Write: ");
try {
write(device, 0x08, new int[] {0x41, 0x42, 0x43, 0x44});
System.out.print("SUCCESSFUL");
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Compatibility Write: ");
try {
compatibilityWrite(device, 0x09, new int[] {0x45, 0x46, 0x47, 0x48});
System.out.print("SUCCESSFUL");
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Read cnt: ");
try {
response = readCnt(device);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
System.out.print("Read sig: ");
try {
response = readSig(device);
for (int i = 0; i < response.length; i++) {
System.out.printf("%02X", response[i]);
}
} catch (NFCException e) {
device.selectPassiveTarget(new Modulation(ModulationType.NMT_ISO14443A, BaudRate.NBR_106),
null, target);
System.out.print("FAILED");
}
System.out.println();
target.free();
device.close();
context.exit();
}
public static long getUID(Device device) throws NFCException {
int[] response = read(device, 0x00);
return (long) response[0] << 48 | (long) response[1] << 40 | (long) response[2] << 32
| (long) response[4] << 24 | (long) response[5] << 16 | (long) response[6] << 8
| (long) response[7] << 0;
}
public static int[] getVersion(Device device) throws NFCException {
int[] response = new int[8];
device.transceiveBytes(new int[] {0x60}, response, -1);
return response;
}
public static int[] read(Device device, int startPage) throws NFCException {
int[] response = new int[16];
device.transceiveBytes(new int[] {0x30, startPage & 0xFF}, response, -1);
return response;
}
public static int[] fastRead(Device device, int startPage, int endPage) throws NFCException {
int[] response = new int[((endPage &= 0xFF) - (startPage &= 0xFF) + 1) * 4];
device.transceiveBytes(new int[] {0x3A, startPage, endPage}, response, -1);
return response;
}
public static void write(Device device, int startPage, int[] data) throws NFCException {
int[] command = new int[6];
command[0] = 0xA2;
command[1] = startPage & 0xFF;
for (int i = 0; i < data.length; i++) {
command[2 + i] = data[i] & 0xFF;
}
device.transceiveBytes(command, new int[0], -1);
}
public static void compatibilityWrite(Device device, int startPage, int[] data)
throws NFCException {
int[] command = new int[18];
command[0] = 0xA0;
command[1] = startPage & 0xFF;
for (int i = 0; i < data.length; i++) {
command[2 + i] = data[i] & 0xFF;
}
device.transceiveBytes(command, new int[0], -1);
}
public static int[] readCnt(Device device) throws NFCException {
int[] response = new int[3];
device.transceiveBytes(new int[] {0x39, 0x02}, response, -1);
return response;
}
public static int[] readSig(Device device) throws NFCException {
int[] response = new int[32];
device.transceiveBytes(new int[] {0x3C, 0x00}, response, -1);
return response;
}
}
然后输出:
UID: 04675362D55681
Version: error libnfc.driver.pn532_i2c Application level error detected (127)
FAILED
Read: 41424344454647480000000000000000
Fast Read: error libnfc.driver.pn532_i2c Application level error detected (127)
FAILED
Write: SUCCESSFUL
Compatibility Write: SUCCESSFUL
Read cnt: error libnfc.driver.pn532_i2c Application level error detected (127)
FAILED
Read sig: error libnfc.driver.pn532_i2c Application level error detected (127)
FAILED
我没有尝试使用 libNFC,但我的代码遇到了同样的问题,所以它可能是相同的修复...
对于NTAG2xx的特定功能(GET_VERSION、FAST_READ、READ_CNT、READ_SIG),需要使用PN532功能"InCommunicateThru"(0x42 ) 而不是 "InDataExchange" (0x40)。此功能仅适用于标准 NFC 论坛功能(读取、写入)。