Пишем под ТСД. Подключение сканера штрихкода, как компоненту формы
Ни для кого не секрет, что промышленное ПО для терминалов сбора данных (ТСД) пишется для автоматизации бизнес процессов, в особенности — складских. Большая часть задач, которые необходимо решить с помощью ТСД, связана со штрихкодированием, благо сканер штрихкода в девайс встроен.В этом статье пойдет речь о том, как начать писать программы для терминалов сбора данных, и как подключить и использовать сканер штрихкода.Немного теории по сканерам штрихкода.
Есть три типа сканеров:
Светодиодные — считывание производится аналоговой интегральной микросхемой, состоящей из чувствительных фотодиодов. Штрихкод подносить практически вплотную. Лазерный — прямое линейное считывание разверткой лазерного луча. Считывают на среднем расстоянии, но очень хрупки. Имэйджеры — моментальный снимок, и дальнейший разбор изображение, часто сопровождаются той же лазерной полосой, но исключительно с целью прицеливаний. Очень дорогие. Мой подопытный образец 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.7zcloud.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!= null && this.barcodeReader.ReaderData.Result == Symbol.Results.SUCCESS) { OnRead (this.barcodeReader.ReaderData.Text); } } }
На что здесь надо обратить внимание:1. Любое событие, которые добавляется в компоненте, становится доступно в конструкторе формы.2. На основании IContainer container в конструкторе форм реализован механизм высвобождения памяти, в том числе и unmanage объектов. Соответственно грех этим не воспользоваться. Добавляем в контейнер объект считывателя штрихкода, и память высвободится рекурсивно, при закрытии формы, в которой содержится описываемая здесь компонента.//О том, как это происходит можно понять открыв designer любой из форм, созданной в конструкторе, и посмотреть на перегрузку
private System.ComponentModel.IContainer components = null;
///
private void barcodeReader1_OnRead (string Text) { MessageBox.Show (Text); } Получилось несколько сумбурно, и очень много скриншотов. Повторив вышеперечисленные шаги вы освоите сразу три вещи:1. Создавать и запускать в режиме отладки программы под терминалы сбора данных.2. Разберетесь как работать со сканером штрихкода.3. Научитесь создавать компоненты форм.
Я надеюсь эта статья поможет тем, кто только начал разбираться с программированием под ТСД, и несколько упростит этим людям жизнь.