バーコード、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 で始まるものもあります。
これにより、バイト配列の変換で大きな問題が発生します。16 進文字列が unsigned long 型に解析され、先頭のゼロが削除されるためです。これらの RFID カード ID をデータベースに保存するために、別のアプリケーションで別の USB RFID リーダーのセットを使用しますが、これらの USB リーダーは先行ゼロを取得できます。
したがって、UID の先頭のゼロが削除されるモバイル アプリケーションを使用すると競合が発生します。これは、API に渡されたデータがデータベースに対してチェックされ、ゼロがないために一致と見なされないためです。
イベント ハンドラで LineaPro が受信したすべてのデータを確認しましたが、そのバイト配列がカードの UID を保持する唯一のものであるため、UID の 10 進数表現を使用している限り、方法はありません。次の場合を除いて、モバイル アプリがゼロが必要かどうかを判断します。
おそらく、RFID 規格の中には、UID の 10 進数表現の桁数に特定の制限を設けているものがありますか? たとえば、このタイプのカードの 10 進数の桁数が常に偶数または特定の数である場合、必要に応じて文字列に余分なゼロを埋め込むことができます。
LineaPro は単に十分なデータを提供していません。その場合、私はおそらく失敗しています。