2017-09-14 104 views
1

一周前我买了一个NFC读卡器(PN532 I2C)和5个NFC标签(NTAG216),目标是为Java创建一个接口,所以我可以在我的项目中使用Java 。该接口按预期工作,但是当我尝试了NTAG216支持的所有命令时,只有READ,WRITE和COMP_WRITE正在工作。这不是由接口造成的,我也在C中尝试过,但结果相同。那么,在我的命令中是否有任何错误,或者libNFC是否阻止了这些命令的执行?
我很抱歉可能英语不好,我希望我的问题仍然可以理解。libNFC是否只支持READ,WRITE和COMP_WRITE

谢谢您的回答,
雅各布


验证码:

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 

回答

1

我没跟libNFC尝试,但我有我的代码相同的问题,所以它可能是相同的修复...

对于NTAG2xx特定功能(GET_VERSION,FAST_READ,READ_CNT,READ_SIG),您需要使用PN532功能 “InCommunicateThru”(的0x42),而不是 “InDataExchange”(0×40)。这仅适用于标准NFC论坛功能(读取,写入)。

+0

当我搜索pn53x.c时,我发现这个: if(pnd-> bEasyFraming)abtCmd [0] = InDataExchange; ... } else { abtCmd [0] = InCommunicateThru;我发现如何禁用easyFraming: nfc_device_set_property_bool(pnd,NP_EASY_FRAMING,false); 所以现在我禁用它(GET_VERSION,FAST_READ,READ_CNT,READ_SIG),其余的将被启用。除了READ_CNT之外,一切都正在工作,现在这会导致RF传输错误,但那对我目前的目的来说确实如此。 – ProbstDJakob

+0

对于READ_CNT,请确保它已在NFC标签上激活,否则将出现错误(NFC_CNT_EN位在ACCESS字节中,在配置页中设置为1) –