1

我正在使用LineaPro 5 外围设备开发 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 开头,如下图所示:

前导零的 RFID 卡

这会导致我的字节数组转换出现巨大问题,因为十六进制字符串被解析为无符号长类型,并且前导零被丢弃。我们在单独的应用程序中使用另一组 USB RFID 阅读器,以便将这些 RFID 卡 ID 存储到数据库中,尽管这些 USB 阅读器能够以某种方式获取前导零。

因此,在使用移动应用程序时会发生冲突,其中 UID 的前导零被丢弃,因为传递给 API 的数据会根据数据库进行检查,然后由于缺少零而被认为不匹配。

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

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

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

4

2 回答 2

1

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

我想说尝试总是用前导零将 UID 填充到 10 位数字,然后通过它运行大量测试值。

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

于 2013-10-19T19:36:28.157 回答
1

我发现我们的 USB RFID 阅读器使用的特定配置设置,以及从供应商处收到的卡片格式,都是罪魁祸首。这是我们与 USB 阅读器一起使用的配置的屏幕截图:

导致问题的 RFID 读取器配置

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

于 2013-10-21T17:58:20.397 回答