Condividi tramite


Ottenere e comprendere i dati del codice a barre

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

Dopo aver configurato lo scanner di codice a barre e aver scansionato un codice a barre, viene generato l'evento dataReceived . Il ClaimedBarcodeScanner deve sottoscrivere questo evento. L'evento DataReceived passa un oggetto BarcodeScannerDataReceivedEventArgs, che si può usare per accedere ai dati del codice a barre.

Iscriversi all'evento DataReceived

Dopo aver ottenuto un ClaimedBarcodeScanner, usarlo per iscriversi all'evento DataReceived:

claimedBarcodeScanner.DataReceived += ClaimedBarcodeScanner_DataReceived;

Al gestore eventi verranno passati il ClaimedBarcodeScanner e 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
}

Ottieni i dati

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

  • ScanData: dati completi e non elaborati del codice a barre.
  • 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 o ScanDataType, è prima necessario impostare IsDecodeDataEnabled su true.

claimedBarcodeScanner.IsDecodeDataEnabled = true;

Ottenere il tipo di dati di scansione

Ottenere il tipo di etichetta del codice a barre decodificato è piuttosto semplice: è sufficiente chiamare GetName in 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 testo codificato, quindi è necessario prima verificare se la simbologia può essere convertita in una stringa e quindi 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 tuttavia rimosse, poiché non contengono informazioni utili per un'applicazione e sono probabilmente specifiche dello scanner.

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

Questa proprietà deve includere un carattere di simbologia se ne viene restituito uno dallo scanner (ad esempio, un A per UPC-A). Deve 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 legge 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 può supportare una configurazione che abilita o disabilita la lettura di codici supplementari.

Alcune merci possono essere contrassegnate con più etichette, talvolta dette etichette multisymbol o etichette a livelli. Questi codici a barre sono in genere disposti verticalmente e possono essere della stessa o diversa simbologia. Se lo scanner legge 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. Uno non è 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 di un evento DataReceived generato per l'applicazione.

Supporto e feedback

Trovare le risposte alle domande

Hai domande? Chiedici sul forum di domande e risposte di Docs con il tag UWP o su 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 nel forum Q&A

Vedere anche