2016-08-25 12 views
1

Я новичок в Xamarin и Android. У меня есть тег NFC, в частности ST M24LR64E, с данными по нему. Я вижу блоки данных с помощью приложения ST в Google Play. В моем приложении Xamarin я не могу отправить сообщение тегу, не получая исключение TagLostException. Я могу запросить идентификатор тега без проблем, но, пытаясь прочитать один блок данных, я получаю исключение. Любое направление было бы признательным.NFC-V «Tag Lost» исключение с тегом Xamarin и ST M24LR

byte[] response = new byte[] { 0x0A }; 

byte[] cmd = new byte[] 
{ 
    (byte) 0x26, 
    (byte) 0x01, 
    0x00 
}; 
response = nfcv.Transceive(cmd); 

byte[] single = new byte[] 
{ 
    (byte) 0x40, // FLAGS 
    (byte) 0x20, // READ_SINGLE_BLOCK 
    0, 0, 0, 0, 0, 0, 0, 0, 
    (byte) (0 & 0x0ff) 
}; 
Array.Copy(id, 0, single, 2, 8); 
response = nfcv.Transceive(single); 

Transceive() Первый нормально, и я вижу 10 байт возвращается. Как только я попытаюсь прочитать блок данных, я получаю исключение TagLostException.

+0

Вы, кажется, скопировали команду READ_SINGLE_BLOCK из моего ответа (см. [Здесь] (http://stackoverflow.com/a/38783006/2425802)). К сожалению, байт байта, используемый в этом ответе, был неправильным. Вы должны использовать 0x20 (вместо 0x40), чтобы указать адресную версию. Я предполагаю, что 'id' содержит идентификатор UID, полученный из' tag.GetId() '(или' nfcv.GetTag(). GetId() '). –

+0

Также Android уже выполняет запрос INVENTORY, поэтому нет необходимости переиздавать его. Вы можете получить всю информацию, полученную Android через запрос инвентаризации от объекта 'NfcV'. –

+0

Спасибо @MichaelRoland - но изменение флага на 0x20 все еще вызывает исключение тега. – AndySousa

ответ

1

С технологией тегов NfcV TagLostException может указывать на то, что читатель больше не может связываться с тегом или что команда привела к ошибке.

В соответствии с его manual, то M24LR64E поддерживает только расширенную версию (расширение протокола установлен флаг) команды READ_SINGLE_BLOCK:

Protocol_extension_flag должен быть установлен в 1 для M24LR64E-R, для правильной работы. Если значение параметра Protocol_extension_flag равно 0, M24LR64E-R отвечает кодом ошибки.

Следовательно, ваша версия команды READ_SINGLE_BLOCK несовместима с тегом. Вам необходимо установить флаг расширения протокола и предоставить 16-разрядный номер блока. Вариант, который должен работать в:

int blockNumber = 0; 
byte[] readSingleBlock = new byte[] { 
     (byte) 0x28, // Flags: Addressed (bit 5), Protocol Extension (bit 3) 
     (byte) 0x20, // Command: READ_SINGLE_BLOCK 
     0, 0, 0, 0, 0, 0, 0, 0, // placeholder for UID 
     (byte) (blockNumber & 0x0ff), 
     (byte) ((blockNumber >> 8) & 0x0ff) 
}; 
byte[] id = nfcv.GetTag().GetId(); 
Array.Copy(id, 0, readSingleBlock, 2, 8); 
response = nfcv.Transceive(readSingleBlock); 

Поскольку вы использовали (установлен флаг Data_rate) высокая скорость передачи данных с помощью команды INVENTORY, вы также можете использовать высокую скорость передачи данных с помощью команды READ_SINGLE_BLOCK. В этом случае вы должны использовать значение флагов 0x2A (вместо 0x28).

Наконец, вы должны избегать отправки команд против столкновения/перечисления, таких как команда INVENTORY, над любым объектом технологии тегов NfcX. Хотя это может сработать, вы можете сбить с толку внутреннее состояние стека ANDroid NFC, поскольку оно уже выполняет эти команды для вас и отслеживает перечисленные теги (метки). Вы можете получить всю информацию, которую вы бы получить по запросу инвентаря от Tag объекта и NfcV объекта:

  • tag.GetId() дает Вам UID тега.
  • nfcv.GetDsfId() дает вам DSFID тега.
  • nfcv.GetResponseFlags() дает вам байты флагов ответа INVENTORY.
+0

Большое вам спасибо за помощь. Он решил мою проблему, а затем некоторые, заставить ее работать в первый раз, смогли убедить меня, что все это хорошо ... с тех пор расширили ее, чтобы прочитать все данные. еще раз спасибо – AndySousa