Obtenir et comprendre les données de code-barres
Cette rubrique décrit comment obtenir des données d'un scanneur de code-barres dans un objet BarcodeScannerReport et comprendre son format et son contenu.
Une fois que vous avez configuré votre scanneur de code-barres et scanné un code-barres, l’événement DataReceived est déclenché. ClaimedBarcodeScanner doit s’abonner à cet événement. L’événement DataReceived transmet un objet BarcodeScannerDataReceivedEventArgs, que vous pouvez utiliser pour accéder aux données de code-barres.
S’abonner à l’événement DataReceived
Une fois que vous avez un ClaimedBarcodeScanner, utilisez-le pour vous abonner à l’événement DataReceived :
claimedBarcodeScanner.DataReceived += ClaimedBarcodeScanner_DataReceived;
Le gestionnaire d’événements passe l’objet ClaimedBarcodeScanner et un objet BarcodeScannerDataReceivedEventArgs. Vous pouvez accéder aux données de code-barres via la propriété rapportée de cet objet, qui est de type BarcodeScannerReport.
private async void ClaimedBarcodeScanner_DataReceived(ClaimedBarcodeScanner sender, BarcodeScannerDataReceivedEventArgs args)
{
// Parse the data
}
Obtenir les données
Une fois que vous disposez du BarcodeScannerReport, vous pouvez accéder aux données de code-barres et les analyser. BarcodeScannerReport a trois propriétés :
- ScanData : données de code-barres brutes complètes.
- ScanDataLabel : étiquette de code-barres décodée, qui n’inclut pas l’en-tête, la somme de contrôle et d’autres informations diverses.
- ScanDataType : type d’étiquette de code-barres décodé. Les valeurs possibles sont définies dans la classe BarcodeSymbologies.
Si vous souhaitez accéder à ScanDataLabel ou ScanDataType, vous devez d’abord définir IsDecodeDataEnabled sur true.
claimedBarcodeScanner.IsDecodeDataEnabled = true;
Obtient le type de données de scan
L’obtention du type d’étiquette de code-barres décodé est assez triviale, nous appelons simplement GetName sur ScanDataType.
private string GetSymbology(BarcodeScannerDataReceivedEventArgs args)
{
return BarcodeSymbologies.GetName(args.Report.ScanDataType);
}
Obtenir l’étiquette de données de scan
Pour obtenir l’étiquette de code-barres décodée, vous devez connaître quelques éléments. Seuls certains types de données contiennent du texte encodé. Vous devez donc d’abord case activée si les symbologies peuvent être convertis en chaîne, puis convertir la mémoire tampon que nous obtenons de ScanDataLabel en chaîne UTF-8 encodée.
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.";
}
}
Obtient les données brutes de scan.
Pour obtenir les données brutes complètes du code-barres, nous convertissons simplement la mémoire tampon que nous obtenons de ScanData en chaîne.
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);
}
}
Ces données sont généralement dans le format remis à partir du scanneur. Les informations relatives à l'en-tête et à la fin du message sont toutefois supprimées, car elles ne contiennent pas d'informations utiles pour une application et sont susceptibles d'être spécifiques à un scanneur.
Les informations d’en-tête courantes sont un caractère de préfixe (par exemple, un caractère STX). Les informations de bande-annonce courantes sont un caractère terminateur (par exemple, un caractère ETX ou CR) et un bloc case activée caractère si un caractère est généré par le scanneur.
Cette propriété doit inclure un caractère symbolographique si l’un est retourné par le scanneur (par exemple, un A pour UPC-A). Il doit également inclure case activée chiffres s’ils sont présents dans l’étiquette et retournés par le scanneur. (Notez que les caractères symbolographiques et les chiffres case activée peuvent ou ne pas être présents, selon la configuration du scanneur. Le scanneur les retourne s’ils sont présents, mais ne les génère pas ou ne les calculent pas s’ils sont absents.)
Certaines marchandises peuvent être marquées avec un code-barres supplémentaire. Ce code-barres est généralement placé à droite du code-barres principal et se compose d’un nombre supplémentaire de deux ou cinq caractères d’informations. Si le scanneur lit les marchandises qui contiennent des codes-barres principaux et supplémentaires, les caractères supplémentaires sont ajoutés aux caractères principaux et le résultat est remis à l’application sous forme d’une étiquette. (Notez qu’un scanneur peut prendre en charge une configuration qui active ou désactive la lecture des codes supplémentaires.)
Certaines marchandises peuvent être marquées avec plusieurs étiquettes, parfois appelées étiquettes multisymbole ou étiquettes hiérarchisées. Ces codes-barres sont généralement disposés verticalement et peuvent être de la même ou de la même symbologie. Si le scanneur lit la marchandise qui contient plusieurs étiquettes, chaque code-barres est remis à l’application en tant qu’étiquette distincte. Cela est nécessaire en raison de l’absence actuelle de normalisation de ces types de codes-barres. Il n’est pas possible de déterminer toutes les variantes en fonction des données de code-barres individuelles. Par conséquent, l’application doit déterminer quand un code-barres d’étiquette multiple a été lu en fonction des données retournées. (Notez qu’un scanneur peut ou non prendre en charge la lecture de plusieurs étiquettes.)
Cette valeur est définie avant qu’un événement DataReceived ne soit déclenché sur l’application.
Assistance et commentaires
Trouvez des réponses à vos questions
Des questions ? Demandez-nous sur notre forum Docs Q&R avec la balise UWP ou sur Stack Overflow avec la balise pointofservice.
Aidez-nous à trouver vos questions :
- Ajouter la balise pointofservice à votre question sur Stack Overflow.
- Inclure le terme « UWP » dans votre publication sur le forum Q&R