当前位置: 首页 > 知识库问答 >
问题:

Mifare Ultralight:锁定特定页面

慕容越泽
2023-03-14

我从这个链接(Mifare Ultralight C Lock)获得了参考,使Mifare Ultralight标签上的所有页面都是只读的。

我可以在Android上成功地在Mi的Ultralight标签上写入消息。现在我想锁定第4到7页(或任何特定页面)。上面的链接只显示了如何锁定所有页面。我如何锁定特定页面?

此代码锁定所有页面:

mifare.transceive(new byte[] {
    (byte)0xA2,  /* CMD = WRITE */
    (byte)0x02,  /* PAGE = 2    */
    (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF  /* DATA = lock pages 3..15*/
});
public static boolean writeOnMifareUltralight(Context _context, Tag tag,String pageData, int i) {
    byte[]result;
    MifareUltralight mifare = null;
    try {

        mifare = MifareUltralight.get(tag);
        mifare.connect();
        mifare.writePage(i, pageData.getBytes(Charset.forName("US-ASCII")));

        mifare.transceive(new byte[] {
            (byte)0xA2,  /* CMD = WRITE */
            (byte)0x02,  /* PAGE = 2    */
            (byte)0x00, (byte)0x00, (byte)0xFF, (byte)0xFF/* DATA = lock pages 3..15*/
        });
    } catch (Exception ex) {
        ex.printStackTrace();
        Log.d("mtw", ex.getMessage());
        // return false;
    } finally {
        try {
            mifare.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    return true;
}

共有1个答案

孙朝明
2023-03-14

MIFARE Ultralight 的锁定字节使用一个位来锁定一个块。此外,它们还包含 3 个块锁定位,用于控制锁定字节本身的锁定状态。

> < li>

字节2(第2页):位3-7是第3-7页的锁定位。因此,位3锁定页3,位4锁定页4,等等。低三位是块锁定位。位0锁定页面3的锁定位,位1锁定页面4-9的锁定位,位2锁定页面10-15的锁定位。

字节3(第2页):位0-7是第8-15页的锁定位。因此,位0锁定第8页,位1锁定第9页等。

因此,例如,要锁定第 4-7 页,您可以使用以下命令:

mifare.transceive(new byte[] {
    (byte)0xA2,  /* CMD = WRITE */
    (byte)0x02,  /* PAGE = 2    */
    (byte)0x00, (byte)0x00, (byte)0xF0, (byte)0x00 /* DATA = lock pages 4..7*/
});

请注意,除了< code>mifare.transceive()之外,您还可以简单地使用< code>mifare.writePage():

mifare.writePage(2, new byte[] {
    (byte)0x00, (byte)0x00, (byte)0xF0, (byte)0x00 /* DATA = lock pages 4..7*/
});

请记住,锁定位是一次性可编程的。因此,一旦锁定位设置为逻辑 1(即 LOCKED),它就不能反转为逻辑 0(即解锁)。

这也允许您一次设置一个锁定位。例如,要设置页面iLOCKED(其中3

mifare.transceive(new byte[] {
    (byte)0xA2,  /* CMD = WRITE */
    (byte)0x02,  /* PAGE = 2    */
    (byte)0x00, (byte)0x00, (byte)((1<<i) & 0x0FF), (byte)(((1<<i)>>>8) & 0x0FF)
});
 类似资料:
  • 问题内容: 我尝试弄清楚当我需要固定(页面锁定)内存时,CUDA(或OpenCL实现)是否能说明问题。 我尝试查看了和的值,并且都保持为0且从未上升(报告也为0)。我曾经使用过页面锁定内存,并且值按预期上升。 因此,此行为的两个可能原因可能是: 我没有从CUDA API获得页面锁定的内存,而cudaSuccess是伪造的 CUDA绕开了页面锁定内存的OS计数器,因为CUDA对Linux内核做了一些

  • 问题内容: 我在这里思考:如果您有2个线程执行需要同步的FAST操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好的方法吗? 非阻塞的意思是: while(true){如果(checkAndGetTheLock())中断;} 如果您有太多线程在锁中循环,我唯一想到的就是饥饿(CPU耗尽)。 如何平衡一种方法与另一种方法? 问题答案: 以下是 Java Concurrency in Pract

  • 问题内容: 我有一个Web应用程序,并且正在使用Oracle数据库,并且有一种基本上像这样的方法: 现在没有任何类型的同步,因此n个线程当然可以自由地访问此方法,当2个线程都进入此方法都进行检查并且当然还没有任何东西时,就会出现问题,然后它们都可以提交事务并创建一个重复的对象。 我不想在数据库中使用唯一的密钥标识符来解决此问题,因为我认为我不应该抓住它。 我也不能在提交之前进行检查,因为不仅要进行

  • 我有一个消息线程用于发送消息缓冲区。一旦成功,每个消息就会排队发送,然后特征就会写入下一条消息。characeeristic还设置为,因此在特征写调用之间消息缓冲区队列非常快(大约0-7毫秒)。 有时我会在中得到一个状态为8的回调,设备超出范围。但这种情况并不总是发生。 消息线程代码:

  • 我想为strerror\u r调用创建线程本地缓冲区,并编写自己的线程安全字符*my\u strerror(int),它将使用线程本地缓冲区并调用strerror\r。 当阅读R. Stevens在Unix环境高级编程中关于pthread_getspecific()的例子时,我觉得差异-为什么在下面的例子中使用互斥锁? 书中的例子:

  • 我看不出有什么区别。我读到了这篇文章:actual-use-of-lockinterruptbly-for-a-reentrantlock 想测试一下。代码如下: 这里是Inturrept班 控制台输出: 正如回答中提到的“这与常规锁()相同。但如果另一个线程中断,等待的线程lockInterruptbly()将抛出InterruptedException。”即使它是锁着的。lock()或lock