CONTROLES INTELIGENTES SAS DEPARTAMENTO DE DESARROLLO
DOCUMENTACIÓN SDK PUNTO DE PAGO MULTISERVICIOS V 1.1.1
EDER MAURICIO ABELLO RODRÍGUEZ INGENIERO DE DESARROLLO
BOGOTÁ D.C. SEPTIEMBRE, 2015
TABLA DE CONTENIDO
1. INTRODUCCIÓN 2. ESPECIFICACIONES Y USO DE LA LIBRERÍA 2.1. Uso de la librería 2.2. Estructura 3. CONTROL DE PERIFÉRICOS 3.1. ClassManejoDispositivos 3.2. ClassCerrojosPP 3.3. ClassDispensador 3.4. ClassHuellero 3.5. ClassScanner 3.6. ILectora 3.7. ClassImpresoraKiosko
1. INTRODUCCIÓN
Controles Inteligentes SAS ha desarrollado soluciones que buscan automatizar el proceso de pago a través de dispositivos que permiten el manejo automatizado de dinero. De acuerdo a las necesidades observadas por los clientes de la compañía, se han integrado mecanismos para el control y transporte de información a través de tarjetas inteligentes, manejo de dinero por medio de dispositivos de ingreso y entrega de efectivo e impresión de facturas de acuerdo a la normatividad impuesta por las entidades Colombianas. Aunque el principal campo de acción de la organización ha estado enfocado al control automatizado en parqueaderos, se ha observado que los dispositivos de control de dinero tienen un gran potencial en áreas como el pago de facturas, adquisición de servicios, cobro y envío de giros, emisión de publicidad, y otras necesidades potenciales que cada compañía puede aplicar a su organización o dirigir al servicio de sus clientes. Gracias a su gran experiencia en equipos de control de dinero para parqueaderos y dispositivos de recaudo diseñados para Transmilenio, Controles Inteligentes ha producido una plataforma que permite implementar las operaciones básicas de los dispositivos de pago y manejo de información, con el objetivo de que cada compañía pueda desarrollar una solución de acuerdo a sus necesidades, lo cual permite ahorrar tiempo de diseño, implementación y pruebas de los componentes físicos e informáticos que presenta un Kiosko. En este documento se presentan los aspectos principales de la librería que realiza el control de los periféricos que pueden estar presentes dentro del punto de pago. Se exponen los requerimientos mínimos que los dispositivos y el sistema deben cumplir para que el sistema opere de forma correcta, y se expone a detalle las clases y funciones que componen cada uno de los elementos.
2.
ESPECIFICACIONES Y REQUERIMIENTOS
La librería de control se encuentra desarrollada y compilada para la plataforma .NET 4.5. En algunos de los dispositivos el proceso de comunicación se realiza en forma directa a través del control de un puerto serial, mientras que otros manejan sus propias funciones que requieren la instalación de controladores en el sistema. En la sección CONTROL DE PERIFÉRICOS, se especifican los requerimientos mínimos de software que requieren cada uno de los dispositivos que se explican en este documento. Algunos de los dispositivos cuentan con un módulo que realiza la emulación directa USB-Serial, mientras que otros requieren un componente adicional de hardware que realice este procedimiento. Estos componentes suelen requerir la instalación de su respectivo controlador, por lo cual se recomienda revisar las especificaciones del fabricante. La librería se encuentra compilada para sistemas operativos de 32 bits (x86).
2.1.
USO DE LA LIBRERÍA
Para hacer uso de la librería se deben incluir en el proyecto los archivos que se muestran en la siguiente tabla. Es importante incluir cada uno de los archivos en la carpeta que contiene el ejecutable así no estén directamente referenciados en el proyecto, ya que algunas funciones del SDK realizan el llamado directo a estas librerías. NOMBRE DEL ARCHIVO MultiserviciosSDK.dll ApiIS.dll ApiIS-dotnet.dll BnrCtlDotNet40.dll BnrXmlRpc.dll CCNET.dll CRT_285.dll devcon.exe DPUruNet.dll evolib.dll iomem.dll ITLib.dll log4net.dll log4net.xml pcsc-sharp.dll XmlParse.dll XmlTok.dll
COMPONENTE ASOCIADO Todos Scanner Scanner Mei BNR Mei BNR Bill to Bill Lectora tipo 5 Control de puertos USB Huellero Impresora de Tarjetas Impresora de Tarjetas Monedero Registro de eventos Registro de eventos Lectora ACR1222L Mei BNR Mei BNR
Luego de haber incluido todos los archivos al proyecto, se debe hacer referencia a la librería MultiserviciosSDK.dll.
2.2.
ESTRUCTURA
La librería está compuesta por clases que contienen funciones para el control de los periféricos que componen el punto de pago, siguiendo el paradigma de la programación orientada a objetos. Algunas de las clases requieren llamado de funciones asincrónicas y control de eventos, mientras que otras funciones realizan el control de dispositivos mediante lógica sincrónica y códigos de error. En la siguiente tabla se mencionan cada una de las clases que componen la librería, su lógica asociada y los dispositivos controlados.
NOMBRE DE LA CLASE ClassCerrojosPP ClassDispensador ClassHuellero ClassImpresoraKiosko ClassImpresoraTarjetas ILectora
TIPO DE LÓGICA Asincrónica Asincrónica Sincrónica Sincrónica Sincrónica Sincrónica / Asincrónica
DISPOSITIVOS ASOCIADOS Tarjeta de Cerrojos Dispensador de Tarjetas Huellero UareU Impresora de Facturas Impresora de Tarjetas Interfaz de control de lectores de tarjetas inteligentes: ACR1222L SL025M
ClassScanner1000 ClassManejoDispositivos
3.
Tipo 5 Sincrónica Scanner de documentos: Scanner 1000 Sincrónica / Asincrónica Dispositivos de manejo de billetes y monedas: Bill to Bill Mei BNR Fujitsu SNR CashCode Aceptor de billetes V7E Smart Hopper
CONTROL DE PERIFÉRICOS
En esta sección se describirán cada una de las propiedades y métodos que componen las clases del SDK, así como la forma correcta de invocarlos dependiendo de los procedimientos que se requieren realizar dentro del Kiosko.
3.1.
ClassManejoDispositivos
DESCRIPCIÓN Librería que realiza el control de los dispositivos de pago, así como los procesos de recepción y retiro de efectivo, control de errores, vaciados y recargas. DISPOSITIVOS SOPORTADOS: Bill to Bill Mei BNR Fujitsu SNR CashCode Aceptor de billetes V7E Smart Hopper
REQUISITOS DE SOFTWARE
MEI BNR: Instalación del controlador del billetero. BNR Mei Tools. Fujitsu: Instalación del Service Provider. Plantilla de pesos colombiana. Smart Hopper: Instalación del driver – ITL device.
USO DE LA CLASE Para el control de los dispositivos de dinero se debe crear una instancia de la clase ClassManejoDinero, y se debe suscribir una función al evento IDispositivoEvent. Este evento permite conocer el estado de los dispositivos durante el proceso de recepción de dinero, así como el valor recibido y los errores presentes durante la transacción. Antes de realizar cualquier operación sobre los dispositivos se debe realizar el llamado a la función LoadLibraries, la cual carga los ensamblados necesarios para la operación de los periféricos soportados por el SDK. Todos los dispositivos de recepción del dinero están adaptados a una interfaz que contiene todas las funciones básicas. Para agregar un dispositivo, se utiliza la función AdicionarDispositivo la cual recibe como argumento el tipo de máquina que se desea usar. A continuación se muestra la manera de inicializar la clase para un Kiosko que cuenta con un BNR y un SmartHopper dentro de su lista de periféricos. ClassManejoDispositivos.LoadLibraries();
dispositivos = new ClassManejoDispositivos(); dispositivos.IDispositivoEvent += NewDispositivoEvent; dispositivos.AdicionarDispositivo(TipoDispositivo.Mei); dispositivos.AdicionarDispositivo(TipoDispositivo.SmartHopper);
Antes de realizar cualquier operación sobre los dispositivos, se deben verificar su funcionamiento por medio del método VerificarDispositivos. Al igual que muchos métodos que componen esta librería, VerificarDispositivos retorna un booleano cuyo valor es verdadero si la función se realiza de forma correcta, o retorna falso en caso de que haya ocurrido algún problema durante la operación. Para el control de errores se usa la función ObtenerListaDeErrores que permite conocer el dispositivo asociado y la descripción del error.
bool result = dispositivos.VerificarDispositivos(); if (result == false) { Console.WriteLine("Error al verificar los dispositivos"); LeerListaErrores();
} static void LeerListaErrores() { List
listaErrores = dispositivos.ObtenerListaDeErrores(); foreach (ClassErrorDispositivos errorDispositivos in listaErrores) { TipoDispositivo device = errorDispositivos.tipoDispositivo; Console.WriteLine("Dispositivo: " + device.ToString()); } }
RECEPCIÓN DE EFECTIVO La recepción de efectivo dentro del sistema se inicia con el método Recibir. Existen varios modos de recepción que se pueden utilizar dependiendo de la aplicación que se quiere desarrollar. Las sobrecargas que pueden ser llamadas por este método son las siguientes: Recibir (bool preguntarAlPrimerBillete) Inicia el modo de recepción de efectivo. El sistema recibirá billetes y monedas hasta el momento que se llame a la función Detener y se reciben los eventos OK o ERROR. Para el caso de los billeteros, el sistema tiene la opción de recibir automáticamente todos los billetes que se insertan, o de notificar al programa la recepción del primer billete permitir su ingreso o rechazo a través de la función AceptarEscrow y RechazarEscrow. Recibir (int monto, bool validarVueltas, bool validarAltaDenominacion) A diferencia de la anterior, esta sobrecarga detiene la recepción de dinero en el momento en que el valor recibido supera el monto ingresado como argumento. Para el caso de los billeteros, el sistema permite realizar validación de vueltas durante la recepción de billetes, revisando si el monto ingresado puede ser devuelto por el sistema. En caso de no cumplirse esta condición, el sistema devolverá el dinero y lo notificará mediante el evento rechazadoPorVueltas. El sistema permite rechazar los billetes que superen una denominación definida por el sistema, fijando la variable validarAltaDenominación. El sistema notificará el rechazo disparando el evento rechazadoPorAltaDenominación.
A continuación se muestra un ejemplo básico en donde se inicia un proceso de recepción de efectivo por valor de 5.000 pesos, activando las banderas de validación de vueltas y validación de alta denominación. En cualquier momento de la transacción se puede conocer el total recibido a través del método OtenerTotalRecibido dispositivos.Recibir(montoARecibir, true, true); while (true) { nuevoEvento.WaitOne(); EventosIDispositivo evento = nuevoEventArgs.evento;
montoRecibido = dispositivos.ObtenerTotalRecibido(); Console.WriteLine("Monto Recibido: " + montoRecibido); if (evento == EventosIDispositivo.ok) { Console.WriteLine("Recepcion finalizada"); break; } else if (evento == EventosIDispositivo.error) { Console.WriteLine("Error"); LeerListaErrores(); break; } else if (evento == EventosIDispositivo.rechazadoPorVueltas) { Console.WriteLine("Rechazado por vueltas"); } else if (evento == EventosIDispositivo.rechazadoPorVueltas) { Console.WriteLine("Rechazado por alta denominacion"); } } montoRecibido = dispositivos.ObtenerTotalRecibido(); Console.WriteLine("Monto Recibido: " + montoRecibido);
PAGO DE EFECTIVO El proceso de pago de efectivo se realiza mediante el método Pagar, el cual recibe como argumento el total de dinero a pagar y retorna el total pagado al . Este método permite realizar el pago mediante todos los dispositivos de pago registrados durante la inicialización, o el pago individual mediante un dispositivo único definido por el enumerado TipoDispositivo. Para verificar si el sistema tiene cantidad suficiente de elementos para realizar la transacción se utiliza el método VerificarPagoDisponible, el cual genera una lista de inventarios de los dispositivos y genera la lista de pagos. El siguiente ejemplo muestra un procedimiento básico de pago. En caso de que el sistema reporte error en el método, se puede obtener la descripción detallada del problema a través del método ObtenerListaDeErrores. int montoAPagar = 5000; if (dispositivos.VerificarPagoDisponible(montoAPagar) == false) { Console.WriteLine("No se puede realizar el pago solicitado"); } else { int totalPagado; if (dispositivos.Pagar(montoAPagar, out totalPagado) == true) { Console.WriteLine("Pago Realizado con exito");
} else { Console.WriteLine("Error en pago. Total Pagado: " + totalPagado); LeerListaErrores(); } }
VACIADO Para llevar el procedimiento de vaciado en los recicladores se utiliza el método Vaciar. Al igual que el proceso de pago, este método retorna el total vaciado por los dispositivos. En caso de que se presente un error dentro del sistema, la descripción del problema se puede obtener mediante la función ObtenerListaDeErrores. El sistema también soporta realizar vaciados parciales a los billeteros por medio del método Float, el cual opera de forma similar al proceso normal de vaciado, solo que en este caso, el sistema recibe la lista de los billetes que se quieren almacenar en las caseteras. El ejemplo del procedimiento de vaciado se muestra a continuación: int totalVaciado; if (dispositivos.Vaciar(out totalVaciado) == true) { Console.WriteLine("Vaciado finalizado"); } else { Console.WriteLine("Error. TotalVaciado: " + totalVaciado); }
3.2.
ClassCerrojosPP
DESCRIPCIÓN Librería que realiza el control de la tarjeta de cerrojos desarrollada por Controles Inteligentes. Este componente, además de controlar y obtener el estado de las puertas del punto de pago, permite controlar las luces que están conectadas a la boquilla del billetero y el dispensador.
DISPOSITIVOS SOPORTADOS: Tarjeta de cerrojos – Controles Inteligentes
REQUISITOS DE SOFTWARE
Instalación del driver de la tarjeta que proporciona la emulación USB-Serial. Se puede comprobar su correcta instalación en el de dispositivos, verificando que el elemento aparezca dentro de los puertos COM.
USO DE LA CLASE El control de la tarjeta de cerrojos se realiza mediante la creación de una instancia de la ClaseCerrojosPP. Debido a que la lógica del dispositivo es asincrónica, se debe suscribir un método al evento cerrojosPPEvent, el cual nos permite obtener notificaciones de la apertura y cierre de las puertas. Para verificar conexiones con la tarjeta de cerrojos e iniciar la comunicación para la recepción de eventos, se debe llamar a la función Check. static void TestCerrojosPP() { ClassCerrojosPP cerrojosPP = new ClassCerrojosPP(); cerrojosPP.cerrojosPPEvent += NuevoEventoCerrojos; if (cerrojosPP.Check() == false) { Console.WriteLine("Error en la verificacion"); } } static void NuevoEventoCerrojos(object sender, ClassCerrojosPPEventArgs e) { Console.WriteLine("Estado Puerta 1: " + e.SW1); Console.WriteLine("Estado Puerta 2: " + e.SW2); }
El evento cerrojosPPEvent se activará en el momento en que se realiza la apertura o cierre de alguna de las puertas que controla la tarjeta. Los estados de cada uno de los sensores que controlan las puertas se pueden verificar con las propiedades SW1 y SW2. En caso de que se desee conocer el estado de las puertas sin tener que abrir o cerrar alguna de ellas, se puede invocar al método StateDoors.
APERTURA Y CIERRE DE PUERTAS La apertura y cierre de las puertas que controlan los cerrojos se realizan con los métodos OpenDoor1, OpenDoor2, CloseDoor1 y CloseDoor2. A diferencia de los métodos expuestos a lo largo de este documento, estos se ejecutan de forma asincrónica y no generan un valor de retorno, por lo cual se debe verificar el estado de las puertas a través de los eventos retornados por cerrojosPPEvent.
Estos métodos liberan o cierran el seguro electrónico que compone el sistema de cierre de las puertas. En el caso de las funciones de apertura, el mecanismo se libera por un espacio de 10 segundos para evitar el sobrecalentamiento de los solenoides. cerrojosPP.OpenDoor1(); Console.WriteLine("Puerta 1 Abierta"); cerrojosPP.OpenDoor2(); Console.WriteLine("Puerta 2 Abierta"); cerrojosPP.CloseDoor1(); Console.WriteLine("Puerta 1 Cerrada"); cerrojosPP.CloseDoor2(); Console.WriteLine("Puerta 2 Cerrada");
CONTROL DE LUCES El encendido y apagado de las luces de la tarjeta de cerrojos se realiza por medio del método ActivarRGB. Esta función permite seleccionar el color a través de un código de colores RGB y ofrece 3 modos de operación: Encendido, apagado y titilante. Dependiendo del lugar en donde tenemos conectada la luz en nuestra tarjeta, se fijarán los argumentos de luz y puerto correspondientes. Console.WriteLine("Encendiendo luz blanca - Luz 1 Puerto 1"); cerrojosPP.ActivarRGB(255, 255, 255, TipoLuzCerrojos.TITILANDO, 0x01, 0x01);
3.3. ClassDispensador DESCRIPCIÓN Permite el envío de comandos y la recepción de eventos del dispensador de tarjetas.
DISPOSITIVOS SOPORTADOS Dispensador de tarjetas
REQUISITOS DE SOFTWARE La comunicación con el dispensador se debe realizar a través de un convertidor de puerto USB – RS232. Se debe asegurar que el controlador de este dispositivo se encuentre instalado en el sistema, y que sea reconocido como un puerto COM en el de dispositivos.
USO DE LA CLASE Para obtener control del dispensador se debe crear una instancia de la clase ClassDispensador. Al igual que la clase de cerrojos, los procedimientos se realizan de forma asincrónica, por lo cual el control de notificaciones debe ser efectuado a través del evento IDispositivoEvent. Al igual que las demás clases, el método Check debe ser llamado previamente con el objetivo de comprobar conexiones e iniciar la comunicación para la recepción de eventos. static bool TestCheckDispensador() { Console.WriteLine("Inicio del programa TestDispensador"); dispensador = new ClassDispensador(); dispensador.EventDispenser += NuevoEventoDispensador; if (dispensador.Check() == false) { Console.WriteLine("Error al verificar el dispensador"); return false; } return true; } static void NuevoEventoDispensador (object sender, ClassEventDispensador ev) { EventosDispensador nuevoEvento = ev.eventoDescription; Console.WriteLine("Llega nuevo evento del dispensador: " + nuevoEvento.ToString()); }
ESTADOS DEL DISPENSADOR El evento IDispositivoEvent se dispara cada vez que efectuamos una operación sobre el dispensador y se presenta un cambio en los sensores. Existen 3 estados básicos que permiten conocer cuando el dispensador se encuentra inactivo, y pueden ser utilizados para conocer el nivel de tarjetas o si existe algún problema en la operación:
DispensadorVacio: El dispensador se encuentra sin tarjetas PocasTarjetas: El nivel de tarjetas del dispensador se encuentra por debajo del nivel superior Ready: El nivel de tarjetas del dispensador es óptimo. TarjetaAtascada: Hay una tarjeta atascada presente en el dispensador.
Cuando el último evento del dispensador corresponde a DispensadorVacio, PocasTarjetas o Ready, podemos realizar operaciones de lectura y reciclaje de tarjetas. Por defecto el
dispensador se encuentra configurado con el modo de recepción automática, por lo cual la clase notificará al sistema con el evento TarjetaEnLectura cuando un elemento haya sido ingresado al dispositivo.
OPERACIONES BÁSICAS A continuación se exponen los métodos con los cuales se efectúan las operaciones básicas que pueden ser invocadas dentro de la clase ClassDispensador:
Lectura_Entregar: Entrega una tarjeta que se encuentre en posición de lectura. Entregar: Entrega una tarjeta que se encuentre en posición de lectura o en la pila de tarjetas. Expulsa: Expulsa una tarjeta por la boquilla que se encuentre en posición de lectura o en la pila de tarjetas. Reciclar: Mueve una tarjeta al compartimiento inferior del dispensador que se encuentre en posición de lectura.
3.4. ClassHuellero DESCRIPCIÓN Genera la interfaz de comunicación con el huellero y realiza la captura de la huella.
DISPOSITIVOS SOPORTADOS
Huellero Digital Persona UareU 4500
REQUISITOS DEL SISTEMA
SDK proporcionado por Digital Persona para el huellero UareU 4500. Se puede comprobar que el SDK ha sido instalado de forma correcta a través de la detección del huellero en el de dispositivos y observando que la un espectro azul encienda al momento de conectarlo.
USO DE LA CLASE
Para poder realizar la extracción de huellas se deben utilizar los métodos estáticos contenidos dentro de la clase ClassHuellero. A diferencia de las otras clases mencionadas anteriormente, los métodos que componen ClassHuellero son ejecutados de forma sincrónica, por lo cual no es necesario realizar la suscripción a un evento como en los casos anteriores. Para realizar la extracción de la imagen de la huella se utiliza el método CapturarHuella, el cual recibe como argumento un entero que corresponde al timeout del proceso. En caso de que el dispositivo no esté conectado, el no haya posicionado el dedo dentro del timeout especificado o haya ocurrido algún error con la captura, la función retornará falso. En caso contrario, retornará un Bitmap que contendrá la imagen de la huella. static void ProgramTestHuellero() { Console.WriteLine("Iniciando captura de huella"); Console.WriteLine("Ubique su dedo en el huellero"); int timeoutMs = 10 * 1000; Bitmap imagenHuella; if (ClassHuellero.CapturarHuella(timeoutMs, out imagenHuella) == false) { Console.WriteLine("Error Capturando Huella"); } else { Console.WriteLine("Imagen Capturada"); Console.WriteLine("Ancho: " + imagenHuella.Width); Console.WriteLine("Alto: " + imagenHuella.Height); } }
3.5. ClassScanner DESCRIPCIÓN Realiza la interfaz de control del scanner y genera el procedimiento de captura de imagen de documentos.
DISPOSITIVOS SOPORTADOS
Scanner de documentos Scanner1000.
REQUISITOS DEL SISTEMA
Controladores del scanner proporcionados por el fabricante. Se puede comprobar su correcta instalación a través de la visualización del scanner dentro del de dispositivos, y comprobando que el LED ubicado en la parte frontal se encuentre en color naranja al momento de conectarlo.
USO DE LA CLASE Para realizar el control y la captura de imagen de documentos, se debe crear una instancia de la clase ClassScanner. Aunque los métodos que componen ClassScanner son ejecutados de forma sincrónica, esta permite conocer el instante en que se inserta una tarjeta dentro del dispositivo a través del evento scanner1000Event. El proceso de escaneo de documentos inicia por medio del llamado al método Scan. En este momento, el sistema espera un periodo de alrededor de 10 segundos a que el inserte la cédula por la ranura, y realiza un escaneo por ambas caras. En caso de que el periodo haya expirado o que haya ocurrido algún problema con el proceso, el método retornará falso. En caso contrario, el sistema retornará dos objetos tipo Bitmap que contendrán las imágenes frontal y trasera del documento. static void ProgramTestScanner1000() { Console.WriteLine("Iniciando el proceso de escaneo"); Console.WriteLine("Inserte la cédula por la ranura"); ClassScanner1000 scanner1000 = new ClassScanner1000(); Bitmap imageFront; Bitmap imageBack; if (scanner1000.Scan(out imageFront, out imageBack) == false) { Console.WriteLine("Hubo un error en la recepción"); } else { Console.WriteLine("Imagenes obtenidas"); } } static void NuevoEventoScanner (object sender, Scanner1000EventArgs e) { Scanner1000EventType evento = e.eventType; Console.WriteLine("Nuevo evento scanner: " + evento.ToString()); }
3.6. ILectora DESCRIPCIÓN Proporciona una interfaz de control para la lectura y escritura de tarjetas inteligentes.
DISPOSITIVOS SOPORTADOS
Lectora SL025M Lectora ACR1222L Lectora Tipo 5
REQUISITOS DEL SISTEMA
La lectora SL025M requiere la instalación del controlador de la tarjeta integrada que emula la comunicación USB-Serial La lectora ACR1222L requiere la instalación de un controlador proporcionado por el fabricante. La lectora tipo 5 no requiere una configuración especial, ya que las librerías necesarias para su funcionamiento se encuentran adjuntas al proyecto.
USO DE LA INTERFAZ ILectora proporciona una interfaz genérica para el control de las lectoras descritas en la sección anterior, y permite llamar las funciones de lectura y escritura para tarjetas Mifare. Existen 3 clases dentro de la librería que pueden ser instanciadas dependiendo del tipo de lectora que se desee utilizar:
ClassLectoraRecaudo: Para las lectoras ACR1222L ClassLectoraSL025M: Para las lectoras SL025M ClassLectoraTipo5: Para las lectoras Tipo 5
Para crear una instancia de cada una de las clases anteriores, se puede crear un objeto con el tipo de clase que se quiere implementar, o se puede utilizar la interfaz ILectora para brindar un control transparente entre los 3 dispositivos soportados. Antes de realizar cualquier operación con la lectora, se debe verificar su conexión al sistema por medio de la función Check, la cual retornará falso en caso de que haya ocurrido algún problema con el procedimiento, o verdadero en caso contrario.
Console.WriteLine("Creando una instancia de la clase ACR1222L"); ILectora lectora = new ClassLectoraACR1222L(); lectoraTipo5.ILectoraEvent += NuevoEventoLectora; if (lectora.Check() == false) { Console.WriteLine("Error verificando la lectora"); return false; } private static void NuevoEventoLectora (object sender, ILectoraEventArgs e) { ClassLogger.LogMsg("Llega nuevo evento lectora: " + e.evento.ToString()); switch (e.evento) { case ILectoraEvents.TarjetaIngresada: window.CambiarTextoBotonBloquear("Tarjeta Ingresada"); break; case ILectoraEvents.NoHayTarjeta: window.CambiarTextoBotonBloquear("No hay tarjeta"); break; } }
Para poder leer y escribir datos sobre un sector y bloque de la tarjeta, se debe cargar la llave de a la clase por medio de la función CargarLlave. La llave corresponde a un array de bytes de 6 posiciones que permite acceder a cada uno de los bloques de memoria. Para leer los datos sobre un bloque de memoria se debe invocar al método LeerDatos, el cual recibe como argumentos el sector y el bloque de memoria que se quiere leer, y retorna un array de bytes con los datos obtenidos. Por otro lado, el proceso de escritura de datos se realiza por medio del método EscribirDatos, el cual además de solicitar el sector y el bloque, recibe el array de bytes con la información que se quiere escribir. lectora.CargarLlave(new byte[] { 255, 255, 255, 255, 255, 255 }); byte[] data = new byte[] { 87, 46, 182, 89, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; if (lectora.EscribirDatos(0, 1, data) == false) { Console.WriteLine("Error escribiendo datos"); return false; } byte[] dataReaded; if (lectora.LeerDatos(0, 1, out dataReaded) == false) { Console.WriteLine("Error leyendo datos"); return false; }
Console.WriteLine("Procedimiento ACR OK"); return true;
3.7.
ClassImpresoraKiosko
DESCRIPCIÓN Interfaz de control para realizar las impresiones de las facturas y conocer el estado de la impresora.
DISPOSITIVOS SOPORTADOS
IPI-K3 Thermal Printer Series
REQUISITOS DEL SISTEMA
Driver del cable de comunicación USB-Serial que se utiliza para poder establecer conexión con la impresora.
USO DE LA CLASE Para poder realizar el control de la impresora es necesario crear una instancia de la clase ClassImpresoraKiosko dentro del proyecto. A diferencia de las demás clases, la verificación de conexión se realiza por medio del método SeekPortDispenser, el cual realiza un barrido por todos los puertos seriales verificando si existe respuesta del dispositivo. Para realizar la impresión de una factura en el sistema, se debe invocar al método print, el cual recibe como argumento una cadena de caracteres con el texto que se quiere mostrar. Cabe resaltar que para realizar esta función, la impresora debe contar con papel dentro de su compartimiento. Antes de comenzar el proceso de impresión, se debe verificar que la impresora se encuentre en un estado adecuado para realizar la operación. Para esto se debe utilizar el método status, el cual envía un comando por el puerto serial y obtiene una respuesta. En caso de fallo, se genera un error y se debe mostrar un mensaje de advertencia para revisar la conexión.
static bool TestCheckImpresoraKiosko() { ClassImpresoraKiosko impresora = new ClassImpresoraKiosko(); Console.WriteLine("Obteniendo status"); if (impresora.status() == false) { Console.WriteLine("Error obteniendo status de la impresora"); return false; } bool isOk = false; if (impresora.Papel == true && impresora.Feed == true && impresora.Door == false) isOk = false; if (!isOk) { Console.WriteLine("Error en el estado de la impresora"); return false; } Console.WriteLine("Imprimiendo factura"); impresora.print("Aca va el texto de la factura"); Console.WriteLine("Factura Impresa"); return true; }