Mifare Ultralight: блокировка определенных страниц
По этой ссылке я получил ссылку ( Mifare Ultralight C Lock), чтобы сделать все страницы тега Mifare Ultralight доступными только для чтения.
Я могу успешно написать сообщение о теге Mifare Ultralight на Android. Теперь я хочу заблокировать страницы с 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 ответ
Байты блокировки MIFARE Ultralight используют один бит для блокировки одного блока. Кроме того, они содержат 3 блокирующих бита, которые управляют состоянием блокировки самих байтов блокировки.
Байт 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*/
});
Обратите внимание, что вместо mifare.transceive()
Вы также можете просто использовать mifare.writePage()
:
mifare.writePage(2, new byte[] {
(byte)0x00, (byte)0x00, (byte)0xF0, (byte)0x00 /* DATA = lock pages 4..7*/
});
Имейте в виду, что биты блокировки программируются один раз. Следовательно, как только бит блокировки установлен в логическое 1 (т. Е. Заблокирован), он не может быть обращен в логический 0 (т. Е. Разблокирован).
Это также позволяет вам установить один бит блокировки за раз. Например, чтобы установить страницу i
LOCKED (где 3 <= i <= 15!!!), что-то вроде этого должно работать:
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)
});