Compartilhar via


Obter e entender os dados de código de barras

Este tópico descreve como obter dados de um scanner de código de barras em um objeto BarcodeScannerReport e entender seu formato e conteúdo.

Depois de configurar o scanner de código de barras e digitalizar um código de barras, o evento DataReceived é gerado. O ClaimedBarcodeScanner deve se inscrever neste evento. O evento DataReceived passa um objeto BarcodeScannerDataReceivedEventArgs, que é possível usar para acessar os dados do código de barras.

Inscrever-se no evento DataReceived

Quando você tiver um ClaimedBarcodeScanner, use-o para se inscrever no evento DataReceived:

claimedBarcodeScanner.DataReceived += ClaimedBarcodeScanner_DataReceived;

O manipulador de eventos passará o ClaimedBarcodeScanner e um objeto BarcodeScannerDataReceivedEventArgs. É possível acessar os dados do código de barras por meio da propriedade Report desse objeto, que é do tipo BarcodeScannerReport.

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

Obter os dados

Depois de ter o BarcodeScannerReport, é possível acessar e analisar os dados do código de barras. BarcodeScannerReport tem três propriedades:

  • ScanData: os dados de código de barras completos e brutos.
  • ScanDataLabel: o rótulo do código de barras decodificado, que não inclui o cabeçalho, a soma de verificação e outras informações diversas.
  • ScanDataType: o tipo de rótulo do código de barras decodificado. Os valores possíveis são definidos na classe BarcodeSymbologies.

Se você desejar acessar ScanDataLabel ou ScanDataType, deverá primeiro definir IsDecodeDataEnabled como true.

claimedBarcodeScanner.IsDecodeDataEnabled = true;

Obter o tipo de dados SCAN

Obter o tipo de rótulo de código de barras decodificado é bastante trivia, basta chamar GetName em ScanDataType.

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

Obter o rótulo de dados SCAN

Para decodificar o rótulo do código de barras, há algumas coisas que você precisa estar ciente. Apenas certos tipos de dados contêm texto codificado, então você deve primeiro verificar se a simbologia pode ser convertida em uma sequência e, em seguida, converter o buffer que obtemos de ScanDataLabel em uma sequência UTF-8 codificada.

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.";
    }
}

Obter dados SCAN brutos

Para obter os dados completos e brutos do código de barras, basta converter o buffer que obtemos de ScanData em uma sequência.

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);
    }
}

Esses dados geralmente estão no formato fornecido pelo scanner. No entanto, as informações de trailer e cabeçalho de mensagem são removidos, uma vez que não contêm informações úteis para um aplicativo e provavelmente serão específicos do scanner.

As informações de cabeçalho comuns são um caractere de prefixo (como um caractere STX). Informações comuns do trailer são caracteres de terminação (como um caractere ETX ou CR) e um caractere de verificação de bloco, se tiver sido gerado pelo scanner.

Essa propriedade deve incluir um caractere de simbologia se um for retornado pelo scanner (por exemplo, um A para UPC-A). Também deve incluir dígitos de verificação se estiverem presentes no rótulo e retornados pelo scanner. (Observe que os caracteres de simbologia e os dígitos de verificação podem ou não estar presentes, dependendo da configuração do scanner. O scanner os retornará se estiverem presentes, mas não os gerará ou calculará se estiverem ausentes.)

Algumas mercadorias podem ser marcadas com um código de barras suplementar. Esse código de barras é normalmente colocado à direita do código de barras principal, e consiste em dois ou cinco caracteres adicionais de informação. Se o mecanismo do scanner ler mercadorias que contenham códigos de barras principais e suplementares, os caracteres suplementares serão anexados aos caracteres principais e o resultado será entregue ao aplicativo como um rótulo. (Observe que um mecanismo de scanner pode oferecer suporte a uma configuração que habilita ou desabilita a leitura de códigos suplementares.)

Algumas mercadorias podem ser marcadas com vários rótulos, às vezes chamados de rótulos multissímbolos ou rótulos em camadas. Esses códigos de barras são tipicamente dispostos verticalmente, e podem ser da mesma ou diferente simbologia. Se o scanner ler mercadorias que contenham vários rótulos, cada código de barras será entregue ao aplicativo como um rótulo separado. Isso é necessário devido à atual falta de padronização desses tipos de código de barras. Não é possível determinar todas as variações com base nos dados individuais do código de barras. Portanto, o aplicativo precisará determinar quando um código de barras de rótulo múltiplo foi lido com base nos dados retornados. (Observe que um mecanismo de scanner pode ou não oferecer suporte à leitura de vários rótulos.)

Esse valor é definido antes de um evento DataReceived ser gerado para o aplicativo.

Suporte e comentários

Encontrar respostas para suas dúvidas

Tem dúvidas? Pergunte-nos em nosso fórum de P e R do Docs com a tag UWP ou no Stack Overflow com a tag pointofservice.

Ajude-nos a localizar suas perguntas:

  • Adicione a tag pointofservice à pergunta sobre Stack Overflow.
  • Incluir o termo "UWP" na sua postagem no fórum de P e R

Confira também