Пишем под ТСД. Подключение сканера штрихкода, как компоненту формы

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

Есть три типа сканеров:

Светодиодные — считывание производится аналоговой интегральной микросхемой, состоящей из чувствительных фотодиодов. Штрихкод подносить практически вплотную. Лазерный — прямое линейное считывание разверткой лазерного луча. Считывают на среднем расстоянии, но очень хрупки. Имэйджеры — моментальный снимок, и дальнейший разбор изображение, часто сопровождаются той же лазерной полосой, но исключительно с целью прицеливаний. Очень дорогие. Мой подопытный образец Motorola MC3190 обладает лазерным сканером штрихкода. (В ближайшее время планирую плотно заняться Datalogic c имэйджером).

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

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

204d8da9bea94d08ad2ac9da55ab2489.PNG

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

585e007646d843928ea131a86f3c4f6a.PNG0657d4e8d8f9499894c776a763ef99c0.jpg

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

Для того, чтобы использовать объектную модель, уже реализованную в 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`ы.de056bd509ac4de996c91d6e9f30fd00.png

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

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; ///

/// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose (bool disposing) { if (disposing && (components!= null)) { components.Dispose (); } base.Dispose (disposing); } //3. Чуть-чуть переопределяем событие считывания, избавив себя от обработки считанных с ошибками данных.Дальше дело за малым: перетащить компоненту на формуeec48fb10a014c21850d8bcc1a35b5a8.pngИ добавить событие обработки штрихкода.b592f8ae824340c385d3bb9c4f743da2.pngУбедиться в работе более чем достаточно следующего кода

private void barcodeReader1_OnRead (string Text) { MessageBox.Show (Text); } Получилось несколько сумбурно, и очень много скриншотов. Повторив вышеперечисленные шаги вы освоите сразу три вещи:1. Создавать и запускать в режиме отладки программы под терминалы сбора данных.2. Разберетесь как работать со сканером штрихкода.3. Научитесь создавать компоненты форм.

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

© Habrahabr.ru