Ни для кого не секрет, что промышленное ПО для терминалов сбора данных (ТСД) пишется для автоматизации бизнес процессов, в особенности — складских. Большая часть задач, которые необходимо решить с помощью ТСД, связана со штрихкодированием, благо сканер штрихкода в девайс встроен.
В этом статье пойдет речь о том, как начать писать программы для терминалов сбора данных, и как подключить и использовать сканер штрихкода.





Мой подопытный образец Motorola MC3190 обладает лазерным сканером штрихкода. (В ближайшее время планирую плотно заняться Datalogic c имэйджером).

Кому интересно, можете ознакомиться со спецификацией.

На девайсе установлена Windows CE, соответственно и писать будет необходимо под нее. И если Вы никогда не пробовали писать под ТСД, конечно же, начать стоит с Hello World. Чтобы запустить приложение, написанное на C# на сем устройстве, необходимо установить на него .NET 3.5 Compact. А так же иметь под рукой Visual Studio 2008, так как во всех последующих релизах вариант проекта Smart Device отсутствует (мелкомягкие любят навязывать свои новые технологии, которые, к сожалению, не всегда совместимы с ранними версиями их же операционной системы).



Итак, создав простенькое приложение, можно попробовать его сразу же запустить. Если устройство подключено к компьютеру, то студия сразу же предложит выполнить запуск непосредственно на нем, с возможностью отладки, разумеется. Подождав несколько минут можно увидеть запуск формочки на устройстве.




Вот теперь можно приступать к самому интересному.

Для того чтобы использовать объектную модель, уже реализованную в C#, Motorola подготовила целый ряд библиотек. Фактически с помощью них можно творить все, что нам вздумается. Называется это чудо Symbol. В нашем случае будет использована Symbol.Barcode. К сожалению, в данный момент официальный сайт библиотеки symbol.com перенаправляет нас на motorolasolutions.com, сообщая о том, что технология устарела. Но я в свое время сделал копии всех Reference с примерами:

cloud.mail.ru/public/6716403f96ac%2FSymbolReference.7z
cloud.mail.ru/public/c48120476007%2FSymbolExample.7z

В примерах, те, кому интересно, конечно могут покопаться, но я могу сразу предупредить, что есть статьи, в которых описано все гораздо проще и удобнее, на мой взгляд, лучшая среди них: kbss.ru/blog/dotnetcf/178.html. Но, тем не менее, я считаю, что каждый раз подключать так сканер штрихкода не очень удобно, особенно если приложение планируется многооконным. К тому же в некоторых случаях могут возникнуть проблемы со считыванием, при возвращении фокуса в родительское окно от дочернего.

Из всего, что можно найти в интернете, главное осознать то, что самым удобным способом обработки штрихкодов является модель, построенная на событиях:
1. Сработал сканер штрихкода.
2. Распознал штрихкод корректно.
3. Мы вызываем событие обработки этого штрихкода у себя в программе, уже разобранного и удобного для восприятия.

Компонент формы — паттерн, позволяющий добавлять свой контрол в конструктор форм студии. Этим и воспользуемся. И не только потому, что это упростит разработку форм, а еще и потому, что в дальнейшем компоненту можно будет доработать так, чтобы она поддерживала сканеры не только от Motorol`ы.



Затем надо описать класс компоненты.

public partial class BarcodeReader : Component
    {
        private Symbol.Barcode.BarcodeReader barcodeReader = null;

        public delegate void OnReadBarcodeReaderEventHandler(string Text);
        public event OnReadBarcodeReaderEventHandler OnRead;

        public BarcodeReader()
        {
            InitializeComponent();
            InitializeBarcodeReader();
        }

        public BarcodeReader(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
            InitializeBarcodeReader();
        }

        private void InitializeBarcodeReader()
        {
            this.barcodeReader = new Symbol.Barcode.BarcodeReader();
            this.barcodeReader.ListChanged += new System.ComponentModel.ListChangedEventHandler(BarcodeReader_ListChanged);
            this.barcodeReader.Start();

            this.components.Add(this.barcodeReader);
        }

        void BarcodeReader_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
        {
            if (this.barcodeReader.ReaderData.Result == Symbol.Results.SUCCESS)
            {
                OnRead(this.barcodeReader.ReaderData.Text);
            }
        }
    }



На что здесь надо обратить внимание:
1. Любое событие, которые добавляется в компоненте, становится доступно в конструкторе формы.
2. На основании IContainer container в конструкторе форм реализован механизм высвобождения памяти, в том числе и unmanage объектов. Соответственно грех этим не воспользоваться. Добавляем в контейнер объект считывателя штрихкода, и память высвободится рекурсивно, при закрытии формы, в которой содержится описываемая здесь компонента.
//
О том, как это происходит можно понять открыв designer любой из форм, созданной в конструкторе, и посмотрев на перегрузку:

        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

//
3. Чуть-чуть переопределяем событие считывания, избавив себя от обработки считанных с ошибками данных.

Дальше дело за малым: перетащить компоненту на форму:



И добавить событие обработки штрихкода:


Убедиться в работе более чем достаточно следующего кода:

  private void barcodeReader1_OnRead(string Text)
        {
            MessageBox.Show(Text);
        }


Получилось несколько сумбурно, и очень много скриншотов. Повторив вышеперечисленные шаги вы освоите сразу три вещи:

1. Создавать и запускать в режиме отладки программы под терминалы сбора данных.
2. Разберетесь как работать со сканером штрихкода.
3. Научитесь создавать компоненты форм.

Я надеюсь эта статья поможет тем, кто только начал разбираться с программированием под ТСД, и несколько упростит этим людям жизнь.

github example
Only registered users can participate in poll. Log in, please.
А вы пишите под ТСД?
24.7%Да82
60.84%Нет202
14.46%Я вообще не программист48
332 users voted. 60 users abstained.