Obtener y conocer los datos de código de barras
En este tema se describe cómo obtener datos de un escáner de código de barras en un objeto BarcodeScannerReport y comprender su formato y contenido.
Una vez configurado el escáner de código de barras y escaneado un código de barras, se produce el evento DataReceived. El objeto ClaimedBarcodeScanner debe suscribirse a este evento. El evento DataReceived pasa un objeto BarcodeScannerDataReceivedEventArgs, que puede usar para acceder a los datos del código de barras.
Suscripción al evento DataReceived
Una vez que tenga un ClaimedBarcodeScanner, úselo para suscribirse al evento DataReceived:
claimedBarcodeScanner.DataReceived += ClaimedBarcodeScanner_DataReceived;
El controlador de eventos recibirá el ClaimedBarcodeScanner y un objeto BarcodeScannerDataReceivedEventArgs. Puede acceder a los datos del código de barras a través de la propiedad Report de este objeto, que es del tipo BarcodeScannerReport.
private async void ClaimedBarcodeScanner_DataReceived(ClaimedBarcodeScanner sender, BarcodeScannerDataReceivedEventArgs args)
{
// Parse the data
}
Obtener los datos
Una vez que tenga el BarcodeScannerReport, puede acceder a los datos del código de barras y analizarlos. BarcodeScannerReport tiene tres propiedades:
- ScanData: los datos completos y sin procesar del código de barras.
- ScanDataLabel: la etiqueta decodificada del código de barras, que no incluye el encabezado, la suma de comprobación ni otra información diversa.
- ScanDataType: el tipo de etiqueta del código de barras descodificado. Los valores posibles se definen en la clase BarcodeSymbologies.
Si quiere acceder a ScanDataLabel o a ScanDataType, primero debe establecer IsDecodeDataEnabled en true.
claimedBarcodeScanner.IsDecodeDataEnabled = true;
Obtener el tipo de datos de escaneado
Es muy sencillo obtener el tipo de etiqueta de código de barras descodificado: basta con llamar a GetName en ScanDataType.
private string GetSymbology(BarcodeScannerDataReceivedEventArgs args)
{
return BarcodeSymbologies.GetName(args.Report.ScanDataType);
}
Obtener la etiqueta de datos de escaneado
Para obtener la etiqueta decodificada del código de barras, hay algunas cosas que debe tener en cuenta. Solo ciertos tipos de datos contienen texto codificado, por lo que primero debes comprobar si la simbología se puede convertir a una cadena, y luego convertir el buffer que obtenemos de ScanDataLabel a una cadena 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.";
}
}
Obtener los datos de escaneado sin procesar
Para obtener los datos sin procesar y completos del código de barras, simplemente convertimos el búfer que obtenemos de ScanData en una cadena.
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);
}
}
Estos datos suelen estar en el formato entregado por el escáner. Sin embargo, la información de la cabecera de mensaje y el finalizador se eliminan, ya que no contienen información útil para una aplicación y es probable que sean específicos del escáner.
La información de encabezado común es un carácter de prefijo (como un carácter STX). La información común del finalizador es un carácter terminador (como un carácter ETX o CR) y un carácter de comprobación de bloque si el escáner lo genera.
Esta propiedad debe incluir un carácter de simbología si el escáner devuelve uno (por ejemplo, una A para UPC-A). También debe incluir dígitos de control si están presentes en la etiqueta y son devueltos por el escáner. Tenga en cuenta que tanto los caracteres de simbología como los dígitos de control pueden o no estar presentes, según la configuración del escáner. El escáner los devolverá si están presentes, pero no los generará ni los calculará si están ausentes).
Algunas mercancías pueden estar marcadas con un código de barras suplementario. Este código de barras suele colocarse a la derecha del código de barras principal y consta de dos o cinco caracteres de información adicionales. Si el escáner lee mercancía que contiene códigos de barras principales y suplementarios, los caracteres suplementarios se agregan a los caracteres principales, y el resultado se entrega a la aplicación como una sola etiqueta. (Tenga en cuenta que un escáner puede admitir una configuración que active o desactive la lectura de códigos suplementarios).
Algunas mercancías pueden marcarse con etiquetas múltiples, a veces denominadas etiquetas multisímbolo o etiquetas niveladas. Estos códigos de barras suelen estar colocados verticalmente y pueden ser de la misma simbología o de simbologías diferentes. Si el escáner lee mercancías que contienen varias etiquetas, cada código de barras se entrega a la aplicación como una etiqueta independiente. Esto es necesario debido a la actual falta de estandarización de estos tipos de códigos de barras. No es posible determinar todas las variaciones basándose en los datos individuales del código de barras. Por lo tanto, la aplicación tendrá que determinar cuándo se ha leído un código de barras de varias etiquetas basándose en los datos devueltos. (Tenga en cuenta que un escáner puede o no admitir la lectura de etiquetas múltiples).
Este valor se establece antes de que la aplicación reciba un evento DataReceived.
Soporte y comentarios
Encontrar respuestas a tus preguntas
¿Tienes alguna pregunta? Pregúntenos en nuestro foro de preguntas y respuestas Docs con la etiqueta UWP o en Stack Overflow con la etiqueta pointofservice.
Ayúdenos a localizar sus preguntas:
- Agregue la etiqueta pointofservice a la pregunta en Stack Overflow.
- Incluya el término "UWP" en su mensaje en el foro de preguntas y respuestas.