RFID - 领先的零问题

时间:2013-10-19 19:18:26

标签: c# ios xamarin.ios rfid linea-pro

我正在使用LineaPro 5 peripheral开发一个Xamarin.iOS应用程序,它能够扫描条形码,RFID卡和刷卡磁卡。我有基本的RFID功能,而我关心的Linea数据是卡的UID(字节数组)。

在我们的应用程序中,它与Web服务器交互,我们用来识别这些卡的格式是十进制的,因此我有这个代码将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开头,如下图所示: / p>

RFID card with leading zero

这导致我的字节数组转换出现了很大的问题,因为十六进制字符串被解析为unsigned long类型,并且前导零被删除。我们在一个单独的应用程序中使用另一组USB RFID阅读器,以便将这些RFID卡ID存储到数据库中,尽管这些USB阅读器能够以某种方式获得领先的零点。

因此,当使用移动应用程序时会发生冲突,其中UID的前导零被删除,因为传递给API的数据是针对数据库检查的,因此不会被视为匹配,因为缺少零。

我查看了LineaPro在我的事件处理程序中收到的所有数据,并且该字节数组是唯一保存卡的UID的东西,所以只要我们使用UID的十进制表示,那里移动应用程序无法确定是否应该存在零,除非:

  1. 也许某些RFID标准对UID十进制表示中的位数有特定限制?例如,如果这种类型的卡总是具有偶数或特定数量的十进制数字,我可以在必要时用额外的零填充字符串。

  2. LineaPro根本无法提供足够的数据,在这种情况下,我可能已经搞砸了。

2 个答案:

答案 0 :(得分:1)

您没有足够的信息来解决您的问题。如果ID号总是应该是10位数,那么根据需要使用格式字符串添加前导零是微不足道的。

我想尝试始终将UID填充为带有前导零的10位数,然后通过它运行大量测试值。

正如您所说,如果您的设备从ID的开头删除了有效数据,那么您就会被搞砸。

答案 1 :(得分:1)

我发现我们的USB RFID阅读器使用的具体配置设置,以及从供应商处收到的卡片格式,都应该受到指责。以下是我们与USB读卡器配合使用的配置截图:

The RFID reader configuration causing the issue

我们将它们设置为在读取时强制使用10位长的十进制UID,填充较短的ID并截断较长的ID。我告诉其他开发人员,读取这些ID的正确方法应该是正确的十六进制格式,没有特定的长度,以便支持其他RFID卡类型,而不需要任何硬编码的ID格式。