Condividi tramite


Ottenere e comprendere i dati del codice a barre

In questo argomento viene descritto come ottenere dati da uno scanner per codice a barre in un oggetto BarcodeScannerReport e comprenderne il formato e i contenuti.

Dopo aver configurato lo scanner per codice a barre e aver scansionato un codice a barre, viene generato l'evento DataReceived . La funzionalità ClaimedBarcodeScanner dovrebbe sottoscrivere questo evento. L'evento DataReceived passa un oggetto BarcodeScannerDataReceivedEventArgs che è possibile usare per accedere ai dati del codice a barre.

Eseguire la sottoscrizione all'evento DataReceived

Una volta ottenuto un ClaimedBarcodeScanner, usarlo per sottoscrivere l'evento DataReceived:

claimedBarcodeScanner.DataReceived += ClaimedBarcodeScanner_DataReceived;

Il gestore eventi verrà passato all'oggetto ClaimedBarcodeScanner e a un oggetto BarcodeScannerDataReceivedEventArgs . È possibile accedere ai dati del codice a barre tramite la proprietà Report di questo oggetto, che è di tipo BarcodeScannerReport.

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

Ottenere i dati

Dopo aver ottenuto il BarcodeScannerReport, è possibile accedere e analizzare i dati del codice a barre. BarcodeScannerReport ha tre proprietà:

  • ScanData: dati di codice a barre completi e non elaborati.
  • ScanDataLabel: etichetta di codice a barre decodificata, che non include l'intestazione, il checksum e altre informazioni varie.
  • ScanDataType: tipo di etichetta codice a barre decodificato. I valori possibili sono definiti nella classe BarcodeSymbologies .

Se si vuole accedere a ScanDataLabel or ScanDataType, in primo luogo è necessario impostare IsDecodeDataEnabled su vero.

claimedBarcodeScanner.IsDecodeDataEnabled = true;

Ottenere il tipo di dati di scansione

Ottenere il tipo di etichetta del codice a barre decodificato è piuttosto semplice: è sufficiente richiamare GetName su ScanDataType.

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

Ottenere l'etichetta dei dati di scansione

Per ottenere l'etichetta di codice a barre decodificata, è necessario tenere presenti alcuni aspetti. Solo alcuni tipi di dati contengono un testo codificato, quindi è necessario prima verificare se la simbologia può essere convertita in una stringa e poi convertire il buffer ottenuto da ScanDataLabel in una stringa UTF-8 codificata.

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

Ottenere i dati di scansione non elaborati

Per ottenere i dati completi e non elaborati dal codice a barre, è sufficiente convertire il buffer ottenuto da ScanData in una stringa.

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

Questi dati sono in genere nel formato fornito dallo scanner. Le informazioni di intestazione e trailer dei messaggi vengono rimosse, tuttavia, poiché non contengono informazioni utili per un'applicazione e probabilmente sono specifiche dello scanner.

Le informazioni comuni sull'intestazione sono un carattere di prefisso (ad esempio un carattere STX). Le informazioni comuni sui trailer sono un carattere di terminazione (ad esempio un carattere ETX o CR) e un carattere di controllo del blocco se ne viene generato uno dallo scanner.

Questa proprietà dovrebbe includere un carattere simbologia se ne viene restituito uno dallo scanner (ad esempio, un oggetto A per UPC-A). Dovrebbe includere anche cifre di controllo se sono presenti nell'etichetta e restituite dallo scanner. Si noti che sia i caratteri di simbologia che le cifre di controllo possono essere presenti o meno, a seconda della configurazione dello scanner. Lo scanner li restituirà se presente, ma non li genererà o li calcolerà se sono assenti.

Alcune merci possono essere contrassegnate con un codice a barre supplementare. Questo codice a barre viene in genere posizionato a destra del codice a barre principale ed è costituito da altri due o cinque caratteri di informazioni. Se lo scanner rileva una merce contenente codici a barre principali e supplementari, i caratteri supplementari vengono aggiunti ai caratteri principali e il risultato viene recapitato all'applicazione come un'unica etichetta. Si noti che uno scanner potrebbe supportare una configurazione che abilita o disabilita la lettura di codici supplementari.

Alcune merci possono essere contrassegnate con più etichette, talvolta denominate etichette multisimbolo o etichette a livelli. Questi codici a barre sono in genere disposti verticalmente e possono essere della stessa simbologia o diverse. Se lo scanner rileva una merce contenente più etichette, ogni codice a barre viene recapitato all'applicazione come etichetta separata. Ciò è necessario a causa della mancanza attuale di standardizzazione di questi tipi di codice a barre. Non si è in grado di determinare tutte le varianti in base ai singoli dati di codice a barre. Pertanto, l'applicazione dovrà determinare quando è stato letto un codice a barre con più etichette in base ai dati restituiti. Si noti che uno scanner può o meno supportare la lettura di più etichette.

Questo valore viene impostato prima della generazione di un evento DataReceived all'applicazione.

Supporto, commenti e suggerimenti

Trova le risposte alle tue domande

Altre domande? Chiedi di noi sia sul forum Docs Q& utilizzando il tag UWP or on Stack Overflow con il tag pointofservice.

Aiutaci a individuare le tue domande:

  • Aggiungere il tag pointofservice alla domanda in Stack Overflow.
  • Includi il termine "UWP" nel tuo post sul forum Q&

Vedi anche