Вы используете команду READ SINGLE BLOCK (код команды 0x20
) для чтения из тега ISO/IEC 15693. Стандарт определяет только команду READ SINGLE BLOCK для адресов блоков от 0 до 255. Следовательно, поскольку ваш тэг имеет размер блока 8 байт, эта команда ограничивает вас первым 2 Кб памяти тега.
Чтение за пределами этого адресного пространства не определяется стандартом ISO/IEC 15693. Следовательно, это зависит от типа тега, который вы используете, и поэтому вам следует обратиться к руководству пользователя вашего тега. Некоторые производители тегов преодолеть это адресного пространство ограничение путем определения расширения протокола (см Protocol_Extension_flag в запросе флаги байт команды)
byte[] cmd = new byte[]{
(byte)0x08, //Protocol_Extension_flag=1
(byte)0x20, //READ SINGLE BLOCK
(byte)(address & 0x00FF), (byte)((address>>8) & 0x00FF)
};
Однако, это будет работать только если ваш тег поддерживает это конкретное расширение протокола. В зависимости от типа вашего тега, также возможно, что тег использует другой метод для адресации оставшейся памяти.
Также обратите внимание на то, что некоторые устройства Android не будут работать должным образом с неподписанными командами ISO/IEC 15693. Таким образом, обычно лучше придерживаться адресной версии команд. Адресованный версия выше команды (Addressed_flag набора и UID тега, включенного в команду) хотел бы это:
byte tagId = nfcV.getTag().getId();
byte[] cmd = new byte[]{
(byte)0x28, //Addressed_flag=1, Protocol_Extension_flag=1
(byte)0x20, //READ SINGLE BLOCK
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, // placeholder for UID
(byte)(address & 0x00FF), (byte)((address>>8) & 0x00FF)
};
System.arraycopy(tagId, 0, cmd, 2, 8);
В обоих вышеуказанных случаях, вы можете попробовать вариации Data_rate_flag (второй младший бит флагов байт) и Sub-carrier_flag (младший бит байта флагов), хотя я не уверен, как будут обрабатываться различные устройства Android.
Отправка команды [0x08, 0x20] приводит к исключению «тега было потеряно», что звучит странно для меня, потому что в случае непринятой команды я ожидал возвращаемое значение [0x01, 0x02] («Команда не распознана»,), а не исключение? – Carlo
@CarloCecchi Возможно, вы захотите попробовать установить байт флагов на 0x0A. (И вы можете попробовать адресованную версию команды.) –
Я пробовал все комбинации 0x02, 0x08 и 0x20 бит, но всегда получаю ошибку «Tag was lost», за исключением только 0x02. Не могли бы вы объяснить мне, в чем смысл адресации? Я пропущу этот момент. Спасибо. – Carlo