バーコード データの取得と理解

バーコード スキャナーのデータを BarcodeScannerReport オブジェクトで取得する方法と、その形式と内容について説明します。

バーコード スキャナーを設定してバーコードをスキャンすると、DataReceived イベントが発生します。 ClaimedBarcodeScanner からこのイベントをサブスクライブする必要があります。 DataReceived イベントから BarcodeScannerDataReceivedEventArgs オブジェクトを渡します。これを使ってバーコード データにアクセスできます。

DataReceived イベントにサブスクライブする

ClaimedBarcodeScanner を取得したら、DataReceived イベントをサブスクライブします。

claimedBarcodeScanner.DataReceived += ClaimedBarcodeScanner_DataReceived;

イベント ハンドラーには ClaimedBarcodeScannerBarcodeScannerDataReceivedEventArgs オブジェクトが渡されます。 このオブジェクトの Report プロパティは BarcodeScannerReport 型であり、これを介してバーコード データにアクセスできます。

private async void ClaimedBarcodeScanner_DataReceived(ClaimedBarcodeScanner sender, BarcodeScannerDataReceivedEventArgs args)
{
    // Parse the data
}

データを取得する

BarcodeScannerReport を取得すると、バーコード データにアクセスして解析することができます。 BarcodeScannerReport には 3 つのプロパティがあります。

  • ScanData: 完全な、生のバーコード データ。
  • ScanDataLabel: デコードされたバーコード ラベル。ヘッダー、チェックサムなどの情報は含まれていません。
  • ScanDataType: デコードされたバーコード ラベルの種類。 使用できる値は BarcodeSymbologies クラスで定義されています。

ScanDataLabel または ScanDataType にアクセスする場合は、まず IsDecodeDataEnabledtrue に設定する必要があります。

claimedBarcodeScanner.IsDecodeDataEnabled = true;

スキャン データの種類を取得する

デコードされたバーコード ラベルの種類を取得する処理はとても簡単です。ScanDataType に対して GetName を呼び出すだけです。

private string GetSymbology(BarcodeScannerDataReceivedEventArgs args)
{
    return BarcodeSymbologies.GetName(args.Report.ScanDataType);
}

スキャン データ ラベルを取得する

デコードされたバーコード ラベルを取得するには、注意が必要な点がいくつかあります。 特定のデータ型にのみエンコードされたテキストが含まれているので、まずその記号を文字列に変換できるかどうかを確認し、ScanDataLabel から取得したバッファーをエンコードされた UTF-8 文字列に変換する必要があります。

private string GetDataLabel(BarcodeScannerDataReceivedEventArgs args)
{
    uint scanDataType = args.Report.ScanDataType;

    // Only certain data types contain encoded text.
    // To keep this simple, we'll just decode a few of them.
    if (args.Report.ScanDataLabel == null)
    {
        return "No data";
    }

    // This is not an exhaustive list of symbologies that can be converted to a string.
    else if (scanDataType == BarcodeSymbologies.Upca ||
        scanDataType == BarcodeSymbologies.UpcaAdd2 ||
        scanDataType == BarcodeSymbologies.UpcaAdd5 ||
        scanDataType == BarcodeSymbologies.Upce ||
        scanDataType == BarcodeSymbologies.UpceAdd2 ||
        scanDataType == BarcodeSymbologies.UpceAdd5 ||
        scanDataType == BarcodeSymbologies.Ean8 ||
        scanDataType == BarcodeSymbologies.TfStd)
    {
        // The UPC, EAN8, and 2 of 5 families encode the digits 0..9
        // which are then sent to the app in a UTF8 string (like "01234").
        return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, args.Report.ScanDataLabel);
    }

    // Some other symbologies (typically 2-D symbologies) contain binary data that
    // should not be converted to text.
    else
    {
        return "Decoded data unavailable.";
    }
}

生のスキャン データを取得する

バーコードから完全な生データを取得するには、ScanData から取得したバッファーを文字列に変換するだけです。

private string GetRawData(BarcodeScannerDataReceivedEventArgs args)
{
    // Get the full, raw barcode data.
    if (args.Report.ScanData == null)
    {
        return "No data";
    }

    // Just to show that we have the raw data, we'll print the value of the bytes.
    else
    {
        return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, args.Report.ScanData);
    }
}

通常、このデータはスキャナーから配信される形式です。 ただし、メッセージ ヘッダーとトレーラー情報は削除されます。これは、アプリケーションにとって有用な情報を含まず、スキャナーに固有のものである可能性が高いからです。

一般的なヘッダー情報はプレフィックス 文字 (STX 文字など) です。 一般的なトレーラー情報は、終端文字 (ETX や CR 文字など) とブロック チェック文字 (スキャナーで生成される場合) です。

このプロパティには、スキャナーから返された記号文字 (例: UPC-A の A) を含める必要があります。 また、チェック ディジットがラベル内にあり、スキャナーから返された場合は、それも含める必要があります (シンボル文字とチェックディジットの両方が、スキャナーの構成に応じて表示される場合と表示されない場合があることに注意してください。スキャナーは、存在する場合はそれらを返しますが、存在しない場合は生成または計算しません。)

商品によっては、補助バーコードが付いている場合があります。 通常、このバーコードはメイン バーコードの右側に配置され、追加の 2 文字または 5 文字の情報で構成されています。 メイン バーコードと補助バーコードの両方を含む商品をスキャナーで読み取った場合、補助の文字はメインの文字に付加され、結果として 1 つのラベルとしてアプリケーションに配信されます (ただし、スキャナーは、補助コードの読み取りを有効または無効にする構成をサポートしている場合があることに注意してください)。

商品によっては、複数記号ラベル階層型ラベルという複数のラベルが付いている場合があります。 通常、このようなバーコードは縦に配置されており、記号が同じ場合と異なる場合があります。 複数のラベルを含む商品をスキャナーで読み取った場合、各バーコードは個別のラベルとしてアプリケーションに配信されます。 現在はバーコードの種類が標準化されていないため、これが必要です。 個々のバーコード データに基づいて、すべてのバリエーションを判断することはできません。 そのため、アプリケーションでは、返されたデータに基づいて、複数ラベルのバーコードが読み取られたかどうかを判断する必要があります (スキャナーが複数ラベルの読み取りをサポートしている場合としていない場合があることに注意してください)。

この値は、アプリケーションに DataReceived イベントが発生する前に設定されます。

サポートとフィードバック

質問に対する回答を見つける

ご質問があるでしょうか。 Docs Q&A フォーラムで UWP タグを使用するか、Stack Overflow で pointofservice タグを使用して質問してください。

質問を見つけやすくするために、次のようにしてください。

  • Stack Overflow で質問に pointofservice タグを追加します。
  • Q&A フォーラムの投稿に "UWP" という用語を含める

関連項目