2

在我写过一次 MifareUltralight 标签后,我已经锁定了特定页面。下次打电话writePage()时,我想先检查该页面的访问条件。如果页面被锁定,我不想调用 write 方法。我怎样才能在 Android 上实现这一点?

4

1 回答 1

0

您需要读取锁定位并分析它们,以确定特定页面是否标记为只读:

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()) 不适用于 MIFARE Ultralight 和 NTAG 产品线中的 EV1 产品(例如 Ultralight EV1 或 NTAG21x),因为它们的扩展锁定字节布局不同。

于 2016-05-08T19:27:34.890 回答