Чтение нескольких тегов NFC одновременно на Android
Новый 2.3.3 SDK включает улучшенную поддержку NFC, и я хотел бы написать приложение, основанное на этом. В конечном счете, я хотел бы иметь возможность считывать данные из нескольких тегов, которые одновременно вводят поле, но Android только запускает первый, который входит в поле, - последующие игнорируются.
Из чтения спецификации NFC (ISO/IEC 14443-3) для тегов, которые я использую (Mifare Classic), я должен был бы отправить команду "halt" в тег, что приведет к прекращению ответа, и позвольте мне прочитать следующий тег в поле. Android не поддерживает команду halt непосредственно в любом из подклассов TagTechnology
, поэтому я попытался отправить ее непосредственно с помощью transceive(new byte[] {0x50, 0x00})
. Это выдает a IOException
, при этом сообщение "transceive failed".
По общему признанию, я делаю все это из основного потока, который я понимаю, это плохая идея, но я просто хочу как можно проще протестировать концепцию.
Возможно ли одновременно связываться с несколькими тегами в поле? Что я делаю неправильно?
Ответы
Ответ 1
К сожалению, на данный момент вам не представляется возможным, если вы не сделаете довольно продвинутый хакер, что почти никогда не будет хорошей идеей:)
Возможно, вы могли бы остановить карту, если вы отправите правильные байты в transceive()
, как вы сейчас пытаетесь сделать. Но так как остановка (точнее, HLTA, которую вы пытаетесь отправить) является командой ISO14443-3A, это не будет работать через интерфейс MifareClassic, который использует "зашифрованный" канал. Непосредственная передача через интерфейс NfcA, к сожалению, также не работает с текущим стеком.
Даже если вы можете заставить карту остановиться, это не приведет к тому, что чип NFC в телефоне возобновит опрос новых тегов - поскольку вы "обходите" стек.
Ответ 2
В зависимости от моего короткого опыта вы не можете работать с несколькими тегами.
Если в поле есть два тега, вы не получаете идентификатор из тега, он имеет двоичный нуль.
Поэтому я предполагаю, что на данный момент вы можете получить доступ только к одному тегу и не более чем в поле.
Ответ 3
У вас был успех при отправке других команд с использованием трансиверов, таких как блок чтения (0x30, 0x (блок)) или аутентификация секторальных команд? Просто подумайте, что вы, возможно, захотите убедиться, что вы правильно используете трансивер.