Я разрабатываю приложение 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, как на этом рисунке:
Это вызывает огромную проблему с преобразованием моего массива байтов, поскольку шестнадцатеричная строка разбирается в беззнаковый длинный тип, а ведущий ноль отбрасывается. Мы используем другой набор USB-считывателей RFID в отдельном приложении, чтобы хранить идентификаторы этих RFID-карт в базе данных, хотя каким-то образом эти USB-считыватели могут считывать ведущий ноль.
Следовательно, возникает конфликт при использовании мобильного приложения, в котором ведущий ноль UID отбрасывается, поскольку данные, передаваемые в API, проверяются на соответствие базе данных и затем не считаются совпадением из-за отсутствия нуля.
Я просмотрел все данные, полученные LineaPro в моем обработчике событий, и этот массив байтов - единственное, что содержит UID карты, поэтому, пока мы используем десятичное представление UID, нет никакого способа для мобильного приложения, чтобы определить, должен ли там стоять ноль, за исключением следующих случаев:
Возможно, в некоторых стандартах RFID есть определенные ограничения на количество цифр в десятичном представлении UID? Например, если у этого типа карты всегда есть четное или определенное количество десятичных цифр, я могу при необходимости дополнить строку дополнительным нулем.
LineaPro просто не предоставляет достаточно данных, и в этом случае я, вероятно, облажался.