2015-12-17 2 views

Répondre

0

Vous auriez besoin de lire les bits de verrouillage et de les analyser afin de savoir si des pages spécifiques sont marquées en lecture seule:

boolean isPageLocked(MifareUltralight tag, int page) { 
    if (page < 2) { 
     // UID pages 
     return true; // pages 0..1 are always read-only 
    } else if (page < 3) { 
     // static lock bytes page 
     final byte[] data = tag.readPages(page); 
     final int lockBits = ((data[2] & 0x0ff) << 8) | (data[3] & 0x0ff); 
     if ((lockBits & 0x007) == 0x007) { 
      return true; 
     } else { 
      // page is partially writable 
      return false; 
     } 
    } else if (page < 16) { 
     // OTP and user data (lockable through lockbits in page 2) 
     final byte[] data = tag.readPages(page); 
     final int lockBits = ((data[2] & 0x0ff) << 8) | (data[3] & 0x0ff); 
     return (lockBits & (1<<page)) != 0; 
    } else if (page < 40) { 
     // extended user data (lockable through lockbits in page 40) 
     // valid for MIFARE Ultralight C and NTAG203 (not applicable for EV1 products!) 
     final byte[] data = tag.readPages(40); 
     final int lockBits = ((data[0] & 0x0ff) << 8) | (data[1] & 0x0ff); 

     final int relPage = (page - 16)/4; 

     if (relPage < 3) { 
      return (lockBits & (1<<(relPage+9))) != 0; 
     } else { 
      return (lockBits & (1<<(relPage+10))) != 0; 
     } 
    } else { 
     return false; // unknown 
    } 
} 

Vous pouvez ensuite utiliser cette méthode avant de vous écrire à l'étiquette:

int pageNumber = ... 
byte[] pageData = ... 
if (!isPageLocked(tag, pageNumber)) { 
    tag.writePage(pageNumber, pageData); 
} 

Notez que la méthode ci-dessus (isPageLocked()) ne fonctionnerait pas pour les produits EV1 dans les gammes de produits Ultraléger MIFARE et NTAG (par exemple Ultraléger EV1 ou NTAG21x) depuis la mise en page des octets de verrouillage étendus est différent pour eux.