Поделиться через


Получение и распознавание данных штрихкода

В этом разделе описывается, как получить данные из сканера штрихкодов в объекте BarcodeScannerReport и понять его формат и содержимое.

После того как вы настроите сканер штрихкодов и отсканируете штрихкод, вызывается событие DataReceived. ClaimedBarcodeScanner должен подписаться на это событие. Событие DataReceived передает объект BarcodeScannerDataReceivedEventArgs, который можно использовать для доступа к данным штрихкода.

Подписка на событие DataReceived

Получив ClaimedBarcodeScanner, используйте его для подписки на событие DataReceived:

claimedBarcodeScanner.DataReceived += ClaimedBarcodeScanner_DataReceived;

Обработчику событий будут переданы ClaimedBarcodeScanner и объект BarcodeScannerDataReceivedEventArgs. Вы можете получить доступ к данным штрихкода через свойство Report этого объекта, которое имеет тип BarcodeScannerReport.

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

Получение данных

Получив barcodeScannerReport, вы можете получить доступ к данным штрихкода и проанализировать их. BarcodeScannerReport имеет три свойства:

  • ScanData: полные необработанные данные штрихкода.
  • ScanDataLabel: декодированная метка штрихкода, которая не включает заголовок, контрольную сумму и другие прочие сведения.
  • ScanDataType: тип декодированной метки штрихкода. Возможные значения определяются в классе BarcodeSymbologies .

Если вы хотите получить доступ к ScanDataLabel или ScanDataType, необходимо сначала установить IsDecodeDataEnabled в true.

claimedBarcodeScanner.IsDecodeDataEnabled = true;

Получение типа данных сканирования

Получение декодированного типа метки штрихкода является довольно тривиальной задачей — мы просто вызываем метод GetName на объекте ScanDataType.

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) и символ проверки блока, если он создается сканером.

Это свойство должно содержать символьный символ, если он возвращается сканером (например, A для UPC-A). Он также должен включать контрольные цифры, если они присутствуют в метке и возвращаются сканером. (Обратите внимание, что оба символьных символа и контрольные цифры могут присутствовать или не могут присутствовать в зависимости от конфигурации сканера. Сканер вернет их, если они присутствуют, но не будут создавать или вычислять их, если они отсутствуют.)

Некоторые товары могут быть помечены дополнительным штрихкодом. Этот штрихкод обычно помещается справа от основного штрихкода и состоит из дополнительных двух или пяти символов информации. Если сканер считывает товары, содержащие как основные, так и дополнительные штрихкоды, дополнения добавляются к основным символам, а результат доставляется приложению как одна метка. (Обратите внимание, что сканер может поддерживать конфигурацию, которая включает или отключает чтение дополнительных кодов.)

Некоторые товары могут быть обозначены несколькими этикетками, иногда называемыми многосимвольные метки или многоуровневые метки. Эти штрихкоды обычно упорядочены по вертикали и могут быть одинаковыми или различными символами. Если сканер считывает товары, содержащие несколько меток, каждый штрихкод доставляется приложению в виде отдельной метки. Это необходимо из-за текущего отсутствия стандартизации этих типов штрихкодов. Один не может определить все варианты на основе отдельных данных штрихкода. Поэтому приложению потребуется определить, когда был считывается несколько штрихкодов меток на основе возвращаемых данных. (Обратите внимание, что сканер может или не поддерживает чтение нескольких меток.)

Это значение устанавливается перед тем, как событие DataReceived будет сгенерировано для приложения.

Поддержка и обратная связь

Поиск ответов на ваши вопросы

У вас есть вопросы? Обратитесь к нам на форуме "Docs Q&A" с тегом UWP или на Stack Overflow с тегом pointofservice.

Помогите нам найти свои вопросы:

  • Добавьте тег pointofservice к вопросу в Stack Overflow.
  • Включите термин UWP в свой пост на форуме Q&A

См. также