Generierung und Erkennung von Barcodes in AWS Lambda

Blog-Kategorie: Barcode.NET

22.05.2020

AWS Lambda ist eine ereignisgesteuerte, serverlose Computing-Plattform von Amazon als Teil von Amazon Web Services.

Dieses Tutorial zeigt, wie Sie ein AWS Lambda-Projekt in Visual Studio .NET 2017 erstellen, ein DataMatrix-Barcodebild generieren und den DataMatrix-Barcode im generierten Bild in einer AWS Lambda-Funktion erkennen.

Zuerst öffnen wir Visual Studio 2017 und erstellen ein neues AWS Lambda-Projekt:
Create AWS Lambda project in Visual Studio

Als Nächstes legen wir fest, dass eine einfache SQS-Funktion als Inhalt für die AWS Lambda-Funktion verwendet werden soll:
Use simple SQS function as content for AWS Lambda function in Visual Studio

Hier ist ein erstelltes AWS Lambda-Projekt in Visual Studio 2017:
AWS Lambda project in Visual Studio



Als Nächstes fügen wir Verweise auf das NuGet-Paket System.Drawing.Common und die Vintasoft.Barcode.dll für .NET Core hinzu.
System.Drawing.Common wird für die Vintasoft.Barcode-Assembly benötigt. Die Vintasoft.Barcode-Assembly ist für die Generierung und Erkennung von Barcodes erforderlich.
Add Vintasoft.Barcode.dll to AWS Lambda project in Visual Studio



Als Nächstes müssen wir den Code der AWS Lambda-Funktion öffnen:
Open code of AWS Lambda function in Visual Studio

Als Nächstes müssen wir den Code für die Barcode-Generierung und -Erkennung zur AWS Lambda-Funktion hinzufügen:
C# code for barcode generation and recognition using AWS Lambda function

Hier ist der C#-Code der AWS Lambda-Funktion, mit der ein Bild mit DataMatrix-Barcode generiert und der Barcode im generierten Bild erkannt werden kann:
// 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;
        }
    }
}



Zum Schluss müssen wir unsere AWS Lambda-Funktion im AWS .NET Mock Lambda Test Tool ausführen:
Run AWS Lambda function in AWS .NET Mock Lambda Test Tool

Senden Sie eine SQS-Anfrage an unsere AWS Lambda-Funktion:
Send a SQS request to our AWS Lambda function

Und sehen Sie sich das Ergebnis der Barcode-Erkennung mit der AWS Lambda-Funktion an:
Result of barcode recognition using AWS Lambda function