Прежде всего вы должны проверить, защищен ли тег чтением auth0, я бы порекомендовал этот фрагмент кода:
boolean isTagProtected() {
MifareUltralight mu = MifareUltralight.get(tag);
boolean passExist;
try {
mu.connect();
byte[] answer = mu.readPages(227);
byte auth0 = answer[3];
String text = String.format("%02x", auth0);
Toast.makeText(context, text, Toast.LENGTH_LONG).show();
passExist = auth0 < (byte) 0xEB;
mu.close();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(context, "cannot make authentication", Toast.LENGTH_SHORT).show();
passExist = true;
}
return passExist;
}
, если тег не защищен, вы можете установить новый пароль с помощью этого кода :
private static final byte[] SET_PACK_VALUE = {(byte) 0xA2, (byte) 0xE6, (byte) 0x11, (byte) 0x11, (byte) 0x00, (byte) 0x00};
private static final byte[] SET_PASSWORD = {(byte) 0xA2, (byte) 0xE5, (byte) 0x75, (byte) 0x6C, (byte) 0x66, (byte) 0x30};
private static final byte[] SET_AUTH0_VALUE = {(byte) 0xA2, (byte) 0xE3, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xA1};
if (isTagProtected()) {
Toast.makeText(context, "The tag is already Locked", Toast.LENGTH_LONG).show();
} else {
NfcA nfcaTag = NfcA.get(maintag);
try {
nfcaTag.connect();
nfcaTag.transceive(SET_PACK_VALUE);
nfcaTag.transceive(SET_PASSWORD);
nfcaTag.transceive(SET_AUTH0_VALUE);
nfcaTag.close();
Toast.makeText(context, "The tag is locked", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(context, "Error happend", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
если тег защищен, вы можете авторизовать его, чтобы иметь возможность читать и записывать теги всего за один сеанс.
Вот как очистить пароль:
private final byte[] pwd_auth = new byte[]{(byte) 0x1b,
//here write your pass (4 bytes)
};
public static final byte[] RESET_PACK_VALUE = {(byte) 0xA2, (byte) 0xE6, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
public static final byte[] RESET_AUTH0_VALUE = {(byte) 0xA2, (byte) 0xE3, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xFF};
MifareUltralight mfu = MifareUltralight.get(maintag);
try {
byte[] answer;
mfu.connect();
answer = mfu.transceive(pwd_auth);
mfu.transceive(MainActivity.RESET_AUTH0_VALUE);
mfu.transceive(MainActivity.RESET_PACK_VALUE);
mfu.close();
Toast.makeText(context, "The Password is deleted", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(context, "Error happend , wrong pass", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
другими словами, вы пытаетесь аутентифицировать тег, у которого нет пароля. Вы должны установить пароль, а затем подтвердить его подлинность.
более общие сведения: ![tag tech](https://i.stack.imgur.com/iF95E.png)
вот более подробная информация о технологии тегов: четыре параметра, которые вам необходимо измените некоторые из них, когда вы имеете дело с паролем:
PWD 32-битный пароль, используемый для защиты доступа к памяти. Считывание PWD всегда возвращает 00000000h.
PACK 16-битное подтверждение пароля, используемое в процессе аутентификации пароля. Чтение PACK всегда возвращает 0000h
AUTH0 Адрес страницы сектора 0, с которого требуется аутентификация по паролю для доступа к пользовательской памяти с точки зрения NFC, в зависимости от бита NFC_PROT. Если для AUTH0 задан адрес страницы больше, чем EBh, защита паролем фактически отключена. Область, защищенная паролем, начинается со страницы AUTH0 и заканчивается на странице EBh.
AUTHLIM объяснять здесь не нужно.
PS: я использую NT3H2111_2211 и вам следует прочитать ссылку от Андрея в комментариях, чтобы точно знать, где вы должны написать PACK, PWD и AUTH0.