J'ai déjà verrouillé des pages spécifiques après avoir écrit une fois sur une balise MifareUltralight. Lorsque j'appelle le writePage()
la prochaine fois, je veux d'abord vérifier les conditions d'accès pour cette page. Si la page est verrouillée, je ne souhaite pas appeler la méthode write. Comment pourrais-je y parvenir sur Android?Vérifiez les conditions d'accès à la page pour les tags NFC MifareUltralight sur Android
2
A
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.