2016-11-25 79 views
1

我尝试写一些数据到恩智浦ICODE SLIx的SL2S2002标签(ISO 15693)通过NfcV对象命令:写多个块命令使用WRITE多个块故障转移NfcV

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(指示“未知错误”)。以前,我能够使用命令READ MULTIPLE BLOCKS从同一个标签成功读取数据。

我试图调用NfcV对象上getMaxTransceiveLength()并且该值是253

+0

您试图写入什么特定标记产品?鉴于您在之前的文章中指出了标签UID值“e004015057da807b”,我猜测它是恩智浦ICODE SLIX SL2S2xx2,对不对? –

+0

恩智浦ICODE SLIX SL2S2002 – ibrahim

回答

2

ISO/IEC 15693定义了WRITE多个块命令作为可选的命令。标签芯片(或者实际上它的制造商)实施这个命令取决于它。对于您的情况,恩智浦ICODE SLIX SL2S2xx2(就像所有(最?)ICODE SLI/SLIX标签一样)不支持WRITE MULTIPLE BLOCKS命令。因此,该标签返回错误代码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); 
}