Здравствуйте, shico, Вы писали:
S>Добрый день!
S>Возникла задача закидывать некоторые данные в баркод, с возможностью их последующего считывания инфракрасным сканером.
Для считывания ШК используется видимый диапазон излучения.
S>3-х часов рисерч в интернете дал следующие результаты. Имеется несколько платных .NET компонентов, которые генерируют баркод. Самому генерировать нужную картинку тоже в принципе можно научиться, прочесть спецификацию и помучавшись некоторое число человеко-часов.
Смотря какого формата строки ты хочешь кодировать. Для EAN13, Code-39 полно бесплатных шрифтов.
S>Как достучаться из .NET-а до инфракрасного сканера (barcode reader) вообще не ясно. Microsoft выпустила управляемые сборки для этого дела, но они доступны только в Windows Embedded for Point of Service (специальной редакции для кассовых апартов и прочего в этом роде). В общем чегой-то я ничего не нашел
WEPOS необязательна. Можно качнуть отдельно POS for .Net и установить на обычную WinXP. Сейчас собираемся переходить на эту технологию.
S>Вопрос такой, кто-нить сталкивался с подобной задачей. Если да, как решали? С генерацией баркода более менее ясно, а вот как потом его считывали?
Качаешь OPOS CCO — Common Control Objects
здесь, тебе нужен только OPOSScanner.ocx . С некоторыми драйверами сканеров он поставляется. Только может быть более старой версии, поэтому для более нового потребуется перерегистрация:
resgsvr32 OPOSScanner.ocx
В примере я просто добалял Reference на COM класс "OPOS Scanner Control ..." и на "Opos Constants", сам же я использую собственоручно сгенерированные враперы. На вышеприведенном сайте есть враперы, но только для версии 1.6 — старые. Но я думаю тебе будет достаточно — как в примере. Будут вопросы — пиши. А теперь сам пример:
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using OposScanner_1_11_Lib;
using OPOSCONSTANTSLib;
namespace Test1
{
public partial class Form1 : Form
{
OPOSScanner s;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
this.s = new OPOSScannerClass();
this.s.ErrorEvent += new _IOPOSScannerEvents_ErrorEventEventHandler(s_ErrorEvent);
this.s.DataEvent += new _IOPOSScannerEvents_DataEventEventHandler(s_DataEvent);
ResultCodeH.Check(this.s.Open("OPOS_Device_Name - как ты его там назвал при конфигурировании"));
ResultCodeH.Check(this.s.ClaimDevice(7000));
this.s.DeviceEnabled = true;
ResultCodeH.Check(this.s.ResultCode);
this.s.AutoDisable = true;
ResultCodeH.Check(this.s.ResultCode);
this.s.DataEventEnabled = true;
ResultCodeH.Check(this.s.ResultCode);
}
catch( Exception _e )
{
// придумай что-нибудь сам
}
}
void s_DataEvent(int Status)
{
this.label1.Text = this.s.ScanData;
this.s.DeviceEnabled = true;
this.s.DataEventEnabled = true;
}
void s_ErrorEvent(int ResultCode, int ResultCodeExtended, int ErrorLocus, ref int pErrorResponse)
{
pErrorResponse = (int)OPOS_Constants.OPOS_ER_CLEAR;
this.label1.Text = ResultCodeH.Message(ResultCode);
this.s.DeviceEnabled = true;
this.s.DataEventEnabled = true;
}
}
}
OPOSHelpers.cs
using System;
namespace Test1
{
#region class ResultCodeH
//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
public class ResultCodeH
{
#region Константы
/////////////////////////////////////////////////////////////////////
// OPOS "ResultCode" Property Constants
/////////////////////////////////////////////////////////////////////
public const int OPOS_SUCCESS = 0;
public const int OPOS_E_CLOSED = 101;
public const int OPOS_E_CLAIMED = 102;
public const int OPOS_E_NOTCLAIMED = 103;
public const int OPOS_E_NOSERVICE = 104;
public const int OPOS_E_DISABLED = 105;
public const int OPOS_E_ILLEGAL = 106;
public const int OPOS_E_NOHARDWARE = 107;
public const int OPOS_E_OFFLINE = 108;
public const int OPOS_E_NOEXIST = 109;
public const int OPOS_E_EXISTS = 110;
public const int OPOS_E_FAILURE = 111;
public const int OPOS_E_TIMEOUT = 112;
public const int OPOS_E_BUSY = 113;
public const int OPOS_E_EXTENDED = 114;
public const int OPOS_OR_ALREADYOPEN = 301;
public const int OPOS_OR_REGBADNAME = 302;
public const int OPOS_OR_REGPROGID = 303;
public const int OPOS_OR_CREATE = 304;
public const int OPOS_OR_BADIF = 305;
public const int OPOS_OR_FAILEDOPEN = 306;
public const int OPOS_OR_BADVERSION = 307;
public const int OPOS_ORS_NOPORT = 401;
public const int OPOS_ORS_NOTSUPPORTED= 402;
public const int OPOS_ORS_CONFIG = 403;
#endregion
#region Message
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public static string Message(int _ResultCode)
{
switch( _ResultCode )
{
case OPOS_SUCCESS:
return "OPOS - Успешно";
case OPOS_E_CLOSED:
return "OPOS - Объект закрыт";
case OPOS_E_CLAIMED:
return "OPOS - Объект кем-то захвачен";
case OPOS_E_NOTCLAIMED:
return "OPOS - Объект не захвачен";
case OPOS_E_NOSERVICE:
return "OPOS - Сервис не поддерживается";
case OPOS_E_DISABLED:
return "OPOS - Объект отключен";
case OPOS_E_ILLEGAL:
return "OPOS - Недопустимо";
case OPOS_E_NOHARDWARE:
return "OPOS - Оборудование отсутствует";
case OPOS_E_OFFLINE:
return "OPOS - Питание выключено";
case OPOS_E_NOEXIST:
return "OPOS - Объект не существует";
case OPOS_E_EXISTS:
return "OPOS - Объект уже существует";
case OPOS_E_FAILURE:
return "OPOS - Общий сбой";
case OPOS_E_TIMEOUT:
return "OPOS - Время ожидания истекло";
case OPOS_E_BUSY:
return "OPOS - Устройство занято";
case OPOS_E_EXTENDED:
return "OPOS - Расширенная ошибка";
case OPOS_OR_ALREADYOPEN:
return "OPOS - Объект уже открыт";
case OPOS_OR_REGBADNAME:
return "OPOS - В реестре нет устройства с таким именем";
case OPOS_OR_REGPROGID:
return "OPOS - Ошибка конфигурации устройства в реестре";
case OPOS_OR_CREATE:
return "OPOS - Невозможно создать сервисный объект";
case OPOS_OR_BADIF:
return "OPOS - Сервисный объект не поддерживает все необходимые методы или свойства";
case OPOS_OR_FAILEDOPEN:
return "OPOS - Неизвестная ошибка открытия";
case OPOS_OR_BADVERSION:
return "OPOS - Неверная версия сервисного объекта";
case OPOS_ORS_NOPORT:
return "OPOS - Ошибка доступа к порту В/В";
case OPOS_ORS_NOTSUPPORTED:
return "OPOS - Сервисный объект не поддерживает указанное устройство";
case OPOS_ORS_CONFIG:
return "OPOS - Ошибка чтения конфигурации из реестра";
default:
return "OPOS - Неизвестный код возврата";
}
}
#endregion
#region Check
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public static void Check(int _ResultCode)
{
if( _ResultCode != OPOS_SUCCESS )
throw new Exception(ResultCodeH.Message(_ResultCode));
}
#endregion
}
#endregion
#region class StatusUpdateH
//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
public class StatusUpdateH
{
public const int OPOS_SUE_POWER_ONLINE = 2001; // (added in 1.3)
public const int OPOS_SUE_POWER_OFF = 2002; // (added in 1.3)
public const int OPOS_SUE_POWER_OFFLINE = 2003; // (added in 1.3)
public const int OPOS_SUE_POWER_OFF_OFFLINE = 2004; // (added in 1.3)
public const int OPOS_SUE_UF_PROGRESS = 2100; // (added in 1.9)
public const int OPOS_SUE_UF_COMPLETE = 2200; // (added in 1.9)
public const int OPOS_SUE_UF_COMPLETE_DEV_NOT_RESTORED = 2205; // (added in 1.9)
public const int OPOS_SUE_UF_FAILED_DEV_OK = 2201; // (added in 1.9)
public const int OPOS_SUE_UF_FAILED_DEV_UNRECOVERABLE = 2202; // (added in 1.9)
public const int OPOS_SUE_UF_FAILED_DEV_NEEDS_FIRMWARE = 2203; // (added in 1.9)
public const int OPOS_SUE_UF_FAILED_DEV_UNKNOWN = 2204; // (added in 1.9)
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public static string Message(int _StatusUpdateCode)
{
switch( _StatusUpdateCode )
{
case OPOS_SUE_POWER_ONLINE:
return "Питание включено";
case OPOS_SUE_POWER_OFF:
return "Питание выключено";
case OPOS_SUE_POWER_OFFLINE:
return "Устройство в режиме энергосбережения";
case OPOS_SUE_POWER_OFF_OFFLINE:
return "Устройство выключено или в режиме энергосбережения";
case OPOS_SUE_UF_PROGRESS:
return "Update firmware progress";
case OPOS_SUE_UF_COMPLETE:
return "Update firmware complete";
case OPOS_SUE_UF_COMPLETE_DEV_NOT_RESTORED:
return "Update firmware complete, device not restored";
case OPOS_SUE_UF_FAILED_DEV_OK:
return "Update firmware failed, device OK";
case OPOS_SUE_UF_FAILED_DEV_UNRECOVERABLE:
return "Update firmware failed, device unrecoverable";
case OPOS_SUE_UF_FAILED_DEV_NEEDS_FIRMWARE:
return "Update firmware failed, device needs firmware";
case OPOS_SUE_UF_FAILED_DEV_UNKNOWN:
return "Update firmware failed, device status unknown";
default:
return "Неизвестный статус код";
}
}
}
#endregion
#region class PowerStateH
//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
public class PowerStateH
{
public const int OPOS_PS_UNKNOWN = 2000;
public const int OPOS_PS_ONLINE = 2001;
public const int OPOS_PS_OFF = 2002;
public const int OPOS_PS_OFFLINE = 2003;
public const int OPOS_PS_OFF_OFFLINE = 2004;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public static string Message(int _PowerStateCode)
{
switch( _PowerStateCode )
{
case OPOS_PS_UNKNOWN:
return "Неизвестно";
case OPOS_PS_ONLINE:
return "Питание включено";
case OPOS_PS_OFF:
return "Питание выключено";
case OPOS_PS_OFFLINE:
return "Режим энергосбережения";
case OPOS_PS_OFF_OFFLINE:
return "Питание выключено или режим энергосбережения";
default:
return "Неизвестный код состояния питания";
}
}
}
#endregion
} // namespace
Form1.Designer.cs
namespace Test1
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
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);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(32, 32);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(35, 13);
this.label1.TabIndex = 0;
this.label1.Text = "label1";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(365, 299);
this.Controls.Add(this.label1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Test1
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}