Генерация и распознавание штрих-кодов в AWS Lambda

Категория: Штрих-коды.NET

22 мая 2020

AWS Lambda это платформенная услуга в рамках Amazon Web Services в модели "функция как услуга", обеспечивающая событийно-ориентированные бессерверные вычисления.

В этой статье показывается как создать AWS Lambda проект в Visual Studio .NET 2017, сгенерировать изображение штрих-кода DataMatrix и распознать штрих-код DataMatrix с помощью AWS Lambda функции.

Сначала, нам нужно открыть Visual Studio 2017 и создать новый проект AWS Lambda:
Создать AWS Lambda проекта в Visual Studio

Далее, нужно указать, что простая SQS функция должна быть использована в качестве контента для AWS Lambda функции:
Выбор простой SQS функции в качестве контента для AWS Lambda функции в Visual Studio

Вот как выглядит созданный AWS Lambda проект в Visual Studio 2017:
AWS Lambda проект в Visual Studio



Далее, нам нужно добавить ссылку на nuget-пакет System.Drawing.Common и ссылку на сборку Vintasoft.Barcode.dll для .NET Core.
System.Drawing.Common требуется для сборки Vintasoft.Barcode.dll. Сборка Vintasoft.Barcode.dll требуется для генерации и распознавания штрих-кодов.
Добавление Vintasoft.Barcode.dll к AWS Lambda проекту в Visual Studio



Далее, нам нужно открыть код AWS Lambda функции:
Открыть код по умолчанию AWS Lambda функции в Visual Studio

Далее, нам нужно добавить код для генерации и распознавания штрих-кода в код AWS Lambda функции:
Код для генерации и распознавания штрих-кода с помощью AWS Lambda функции

Вот C# код AWS Lambda функции, которая генерирует изображение штрих-кода DataMatrix и распознает штрих-код в сгенерированном изображении:
// 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
            {
                // создать поток в котором будет хранится созданное изображение штрих-кода
                using (System.IO.MemoryStream mem = new System.IO.MemoryStream())
                {
                    // создать генератор штрих-кода
                    Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();
                    // указать, что генератор должен создать штрих-код DataMatrix
                    barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.DataMatrix;
                    // указать значение создаваемого штрих-кода
                    barcodeWriter.Settings.Value = "1234567890987654321";
                    // сгенерировать изображение штрих-кода и сохранить его в потоке как PNG изображение
                    barcodeWriter.SaveBarcodeAsImage(mem, Vintasoft.Barcode.BarcodeImageFormat.Png);

                    // создать распознаватель штрих-кодов
                    using (Vintasoft.Barcode.BarcodeReader barcodeReader = new Vintasoft.Barcode.BarcodeReader())
                    {
                        // указать, что распознаватель должен искать штрих-коды DataMatrix
                        barcodeReader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.DataMatrix;
                        // указать, что распознаватель должен искать только горизонтальные штрих-коды
                        barcodeReader.Settings.ScanDirection = Vintasoft.Barcode.ScanDirection.Horizontal;

                        // распознать штрих-коды в изображении
                        Vintasoft.Barcode.IBarcodeInfo[] infos = barcodeReader.ReadBarcodes(mem);

                        // если штрих-коды не найдены
                        if (infos.Length == 0)
                        {
                            context.Logger.LogLine($"No barcodes found.");
                        }
                        // если штрих-коды найдены
                        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;
        }
    }
}



Далее, нам нужно запустить созданную AWS Lambda функцию в AWS .NET Mock Lambda Test Tool:
AWS Lambda функция запущена в AWS .NET Mock Lambda Test Tool

Послать тестовый SQS запрос к AWS Lambda функции:
Отправка SQS запроса к AWS Lambda функции

И посмотреть на результат распознавания штрих-кода с помощью AWS Lambda функции:
Результат распознавания штрих-кода с помощью AWS Lambda функции