Générer et reconnaître des codes-barres dans AWS Lambda

Catégorie du blog: Code-barres.NET

22.05.2020

AWS Lambda est une plateforme de calcul sans serveur et pilotée par les événements, fournie par Amazon dans le cadre d'Amazon Web Services.

Ce tutoriel explique comment créer un projet AWS Lambda dans Visual Studio .NET 2017, générer une image de code-barres DataMatrix et reconnaître ce code-barres dans l'image générée à l'aide d'une fonction AWS Lambda.

Tout d'abord, ouvrez Visual Studio 2017 et créez un nouveau projet AWS Lambda:
Create AWS Lambda project in Visual Studio

Ensuite, spécifiez qu'une fonction SQS simple doit être utilisée comme contenu pour la fonction AWS Lambda:
Use simple SQS function as content for AWS Lambda function in Visual Studio

Voici un projet AWS Lambda créé dans Visual Studio 2017:
AWS Lambda project in Visual Studio



Ensuite, ajoutez des références au package NuGet System.Drawing.Common et à la DLL Vintasoft.Barcode pour .NET Core.
System.Drawing.Common est nécessaire à l'assembly Vintasoft.Barcode. L'assembly Vintasoft.Barcode est nécessaire à la génération et à la reconnaissance des codes-barres.
Add Vintasoft.Barcode.dll to AWS Lambda project in Visual Studio



Ensuite, nous devons ouvrir le code de la fonction AWS Lambda:
Open code of AWS Lambda function in Visual Studio

Ensuite, nous devons ajouter le code de génération et de reconnaissance de code-barres à la fonction AWS Lambda:
C# code for barcode generation and recognition using AWS Lambda function

Voici le code C# de la fonction AWS Lambda, qui permet de générer une image avec un code-barres DataMatrix et de reconnaître le code-barres dans l'image générée:
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: Amazon.Lambda.Core.LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda1
{
    public class Function
    {

        /// <summary>
        /// Default constructor. This constructor is used by Lambda to construct the instance. When invoked in a Lambda environment
        /// the AWS credentials will come from the IAM role associated with the function and the AWS region will be set to the
        /// region the Lambda function is executed in.
        /// </summary>
        public Function()
        {
        }



        /// <summary>
        /// This method is called for every Lambda invocation. This method takes in an SQS event object and can be used
        /// to respond to SQS messages.
        /// </summary>
        public async System.Threading.Tasks.Task FunctionHandler(Amazon.Lambda.SQSEvents.SQSEvent evnt, Amazon.Lambda.Core.ILambdaContext context)
        {
            foreach (var message in evnt.Records)
            {
                await ProcessMessageAsync(message, context);
            }
        }

        private async System.Threading.Tasks.Task ProcessMessageAsync(Amazon.Lambda.SQSEvents.SQSEvent.SQSMessage message, Amazon.Lambda.Core.ILambdaContext context)
        {
            context.Logger.LogLine($"Processed message {message.Body}");

            try
            {
                // create memory stream, where image with barcode will be stored
                using (System.IO.MemoryStream mem = new System.IO.MemoryStream())
                {
                    // create the barcode writer
                    Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();
                    // specify that DataMatrix barcode must be created
                    barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.DataMatrix;
                    // specify the barcode value
                    barcodeWriter.Settings.Value = "1234567890987654321";
                    // generate barcode image and save to the memory stream as PNG file
                    barcodeWriter.SaveBarcodeAsImage(mem, Vintasoft.Barcode.BarcodeImageFormat.Png);

                    // create the barcode reader
                    using (Vintasoft.Barcode.BarcodeReader barcodeReader = new Vintasoft.Barcode.BarcodeReader())
                    {
                        // specify that reader must search for DataMatrix barcodes
                        barcodeReader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.DataMatrix;
                        // specify that reader must search horizontal barcodes only
                        barcodeReader.Settings.ScanDirection = Vintasoft.Barcode.ScanDirection.Horizontal;

                        // read barcodes from image
                        Vintasoft.Barcode.IBarcodeInfo[] infos = barcodeReader.ReadBarcodes(mem);

                        // if barcodes are not detected
                        if (infos.Length == 0)
                        {
                            context.Logger.LogLine($"No barcodes found.");
                        }
                        // if barcodes are detected
                        else
                        {
                            // get information about searched barcodes

                            for (int i = 0; i &lt; infos.Length; i++)
                            {
                                Vintasoft.Barcode.IBarcodeInfo info = infos[i];
                                context.Logger.LogLine(string.Format("Barcode: Type={0}, Value={1}", info.BarcodeType, info.Value));
                            }
                        }
                    }
                }
            }
            catch (System.Exception ex)
            {
                context.Logger.LogLine(string.Format("Error: {0}", ex.Message));
            }

            await System.Threading.Tasks.Task.CompletedTask;
        }
    }
}



Enfin, nous devons exécuter notre fonction AWS Lambda dans l'outil de test AWS .NET Mock Lambda:
Run AWS Lambda function in AWS .NET Mock Lambda Test Tool

Envoyez une requête SQS à notre fonction AWS Lambda:
Send a SQS request to our AWS Lambda function

Voici le résultat de la reconnaissance de codes-barres à l'aide de la fonction AWS Lambda:
Result of barcode recognition using AWS Lambda function