1

バーコード、RFID カード、スワイプ磁気カードをスキャンできるLineaPro 5 ペリフェラルを使用して、Xamarin.iOS アプリケーションを開発しています。基本的な RFID 機能は動作しています。Linea から送られてくるデータは、カードの UID (バイト配列) です。

Web サーバーと対話するアプリケーションでは、これらのカードを識別するために使用する形式は 10 進数です。したがって、UID バイト配列を必要な 10 進数文字列に変換する次のコードがあります。

// 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 規格が異なるさまざまなカードがあります。そのうちの 1 つ (現時点では確認できませんが、Mifare Classic 標準だと思います) は常に、この特定の RFID カード プロバイダーからの 10 桁の数字ですが、次の図のように、数字の 0 で始まるものもあります。

先行ゼロ付き RFID カード

これにより、バイト配列の変換で大きな問題が発生します。16 進文字列が unsigned long 型に解析され、先頭のゼロが削除されるためです。これらの RFID カード ID をデータベースに保存するために、別のアプリケーションで別の USB RFID リーダーのセットを使用しますが、これらの USB リーダーは先行ゼロを取得できます。

したがって、UID の先頭のゼロが削除されるモバイル アプリケーションを使用すると競合が発生します。これは、API に渡されたデータがデータベースに対してチェックされ、ゼロがないために一致と見なされないためです。

イベント ハンドラで LineaPro が受信したすべてのデータを確認しましたが、そのバイト配列がカードの UID を保持する唯一のものであるため、UID の 10 進数表現を使用している限り、方法はありません。次の場合を除いて、モバイル アプリがゼロが必要かどうかを判断します。

  1. おそらく、RFID 規格の中には、UID の 10 進数表現の桁数に特定の制限を設けているものがありますか? たとえば、このタイプのカードの 10 進数の桁数が常に偶数または特定の数である場合、必要に応じて文字列に余分なゼロを埋め込むことができます。

  2. LineaPro は単に十分なデータを提供していません。その場合、私はおそらく失敗しています。

4

2 に答える 2

1

問題を解決するのに十分な情報がありません。ID 番号が常に 10 桁であると想定されている場合、必要に応じてフォーマット文字列を使用して先行ゼロを追加するのは簡単です。

UID を先行ゼロで常に 10 桁にパディングしてから、多数のテスト値を実行してみてください。

あなたが言うように、デバイスが ID の先頭から有効なデータをドロップしている場合、あなたはうんざりしています。

于 2013-10-19T19:36:28.157 に答える
1

USB RFID リーダーで使用される特定の構成設定と、ベンダーから受け取ったカードのフォーマットが原因であることがわかりました。以下は、USB リーダーで使用する構成のスクリーンショットです。

問題の原因となっている RFID リーダーの構成

読み取り時に 10 桁の 10 進数の UID を強制するように設定し、短い ID をパディングし、長い ID を切り捨てます。ハードコーディングされた ID 形式なしで他の RFID カード タイプをサポートするために、これらの ID を読み取る適切な方法は、特定の長さのない適切な 16 進数形式にする必要があることを他の開発者に通知しました。

于 2013-10-21T17:58:20.397 に答える