2
在我寫了一次MifareUltralight標籤後,我已經鎖定了特定頁面。當我下次撥打writePage()
時,我想首先檢查該頁面的訪問條件。如果頁面被鎖定,我不想調用寫入方法。我怎麼能在Android上實現這一點?在Android上檢查MifareUltralight NFC標籤的訪問條件
在我寫了一次MifareUltralight標籤後,我已經鎖定了特定頁面。當我下次撥打writePage()
時,我想首先檢查該頁面的訪問條件。如果頁面被鎖定,我不想調用寫入方法。我怎麼能在Android上實現這一點?在Android上檢查MifareUltralight NFC標籤的訪問條件
您將需要閱讀的鎖位,以便對它們進行分析,以找出是否某些網頁被標記爲只讀:
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
}
}
你寫在標籤之前然後,您可以使用此方法:
int pageNumber = ...
byte[] pageData = ...
if (!isPageLocked(tag, pageNumber)) {
tag.writePage(pageNumber, pageData);
}
注意的是,上述方法(isPageLocked()
)不會因爲擴展鎖字節佈局EV1產品在MIFARE超輕和NTAG產品線(例如超輕EV1或NTAG21x)工作對他們來說是不同的。