RFID - ведущая нулевая проблема

Я разрабатываю приложение Xamarin.iOS с использованием периферийного устройства LineaPro 5 , который может сканировать штрих-коды, RFID-карты и считывать магнитные карты. У меня работают основные функции RFID, и данные, поступающие из Linea, которые меня волнуют, - это UID карты (массив байтов).

В нашем приложении, которое взаимодействует с веб-сервером, формат, который мы используем для идентификации этих карт, является десятичным, поэтому у меня есть этот код, который переводит массив байтов UID в нужную нам десятичную строку:

// Handler attached to the RFID Scan event invoked by the LineaPro
void HandleRFIDScanned (DTDeviceDelegate Dispatcher, RFIDScannedEventArgs Arguments)
{
  if ( Arguments == null || Arguments.Data == null || Arguments.Data.UID == null )
    InvalidRFIDScanned ();
  else
  {
    byte[] SerialArray = new byte[Arguments.Data.UID.Length];
    System.Runtime.InteropServices.Marshal.Copy(Arguments.Data.UID.Bytes, SerialArray, 0, SerialArray.Length);
    string Hex = Util.ByteArrayToHexString (SerialArray);
    if ( string.IsNullOrWhiteSpace (Hex) )
      InvalidRFIDScanned ();
    else
    {
      string DecimalSerial = ulong.Parse (Hex, System.Globalization.NumberStyles.HexNumber).ToString ();
      ValidRFIDScanned (DecimalSerial);
    }
  }

  //Disconnecting card so another can be scanned
  NSError RFDisconnectError;
  LineaPRO.Shared.Device.RfRemoveCard (Arguments.CardIndex, out RFDisconnectError);
}

//Byte array to hexadecimal string conversion
public static string ByteArrayToHexString (byte[] Bytes)
{
  StringBuilder hex = new StringBuilder();
  foreach (byte b in Bytes)
    hex.AppendFormat("{0:x2}", b);
  return hex.ToString();
}

Однако я обнаружил очень серьезную проблему с некоторыми выданными нам RFID-картами. У нас есть множество карточек, различающихся стилем и стандартом ISO, которые мобильное приложение должно сканировать. Один из них (я верю в стандарт Mifare Classic, хотя я не могу подтвердить в данный момент) - это всегда десятизначное число от этого конкретного поставщика RFID-карт, хотя некоторые из них начинаются с числа 0, как на этом рисунке:

RFID-карта с нулем в начале

Это вызывает огромную проблему с преобразованием моего массива байтов, поскольку шестнадцатеричная строка разбирается в беззнаковый длинный тип, а ведущий ноль отбрасывается. Мы используем другой набор USB-считывателей RFID в отдельном приложении, чтобы хранить идентификаторы этих RFID-карт в базе данных, хотя каким-то образом эти USB-считыватели могут считывать ведущий ноль.

Следовательно, возникает конфликт при использовании мобильного приложения, в котором ведущий ноль UID отбрасывается, поскольку данные, передаваемые в API, проверяются на соответствие базе данных и затем не считаются совпадением из-за отсутствия нуля.

Я просмотрел все данные, полученные LineaPro в моем обработчике событий, и этот массив байтов - единственное, что содержит UID карты, поэтому, пока мы используем десятичное представление UID, нет никакого способа для мобильного приложения, чтобы определить, должен ли там стоять ноль, за исключением следующих случаев:

  1. Возможно, в некоторых стандартах RFID есть определенные ограничения на количество цифр в десятичном представлении UID? Например, если у этого типа карты всегда есть четное или определенное количество десятичных цифр, я могу при необходимости дополнить строку дополнительным нулем.

  2. LineaPro просто не предоставляет достаточно данных, и в этом случае я, вероятно, облажался.


person William Thomas    schedule 19.10.2013    source источник


Ответы (2)


У вас недостаточно информации для решения вашей проблемы. Если предполагается, что идентификационные номера всегда должны быть 10-значными, использовать строку формата для добавления начальных нулей по мере необходимости является тривиальным делом.

Я бы посоветовал всегда дополнять UID до 10 цифр ведущими нулями, а затем запускать через него большое количество тестовых значений.

Как вы говорите, если ваше устройство сбрасывает действительные данные с начала идентификатора, вы облажались.

person Duncan C    schedule 19.10.2013
comment
Проблема в том, что я не могу гарантировать, что каждая RFID-карта будет содержать 10 цифр. Насколько мне известно, только модели этого производителя имеют 10-значные идентификаторы. - person William Thomas; 20.10.2013

Я обнаружил, что виноваты особые настройки конфигурации, используемые с нашими USB-считывателями RFID, в сочетании с форматом карт, полученных от поставщика. Вот скриншот конфигурации, которую мы используем с USB-ридерами:

Конфигурация считывателя RFID, вызывающая проблему

У нас они настроены на принудительное использование десятичного UID длиной 10 цифр при чтении, добавление более коротких идентификаторов и усечение более длинных. Я проинформировал других разработчиков, что правильный метод чтения этих идентификаторов должен быть в их правильном шестнадцатеричном формате без определенной длины, чтобы поддерживать другие типы карт RFID без каких-либо жестко заданных форматов идентификаторов.

person William Thomas    schedule 21.10.2013