by Busmatic_wpb » Fri Aug 11, 2017 11:45 pm
Gracias a todos por su ayuda.
Estimados el asunto de la tarjetas sin contacto al final no es tan dificil si tienes el conocimiento minimo de como manejar el mapping de estas y al final son 5 o 6 funciones que utiliare para trabajar las el tipo de tarjeta Midfare 1k .Hay varias tipos de 1,2,4,8,16 k ademas desfire ,nautilus y su variedad y tipo son una gama amplia.
Asi como los lectores y sus compatibilidad para cada uan de ellas y tambien su dll propietaria. Yo apenas termine este proyecto pubicare mi todas las funciones necesarias para controlar y manera las gama de tarejtas Midafare 1k. Asi como un ejemplos validos para salir de este Guru y comparti la informacion.
Ahora yo maneje dll producidas por un empresa en España y trabajaba para ella no tenia acceso a los Fucniones ni como lo hacian.
Por eso dede ahora empeze a hacerlo desde 0 por tal razon mi conocimiento de maping de lo tarjeta es amplio mas no del dll propietario.
Hasta ahora en concreto vamos podremos decir que ya logramos lo siguiente.
*************************************************************************************************************
///Variables Delphi
ACR120libHandle
frHandle: Smallint;
fPuerto: Smallint;
ACR120libHandle := LoadLibrary( "ACR120U.DLL")
//Puerto del lector, es 0 si solo hay un lector conectado.
fPuerto := 0
//Abrir comunicación con el lector
frHandle := ACR120_Open(fPuerto);
If (frHandle<0) Then DarError(‘No se pudo abrir el puerto del lector.’);
*********************************************************************************************************************
Desarrollo FWH
#define E1 -1000 // ERRORES LECTOR-TARJETA
#define E2 -1001 // Error en la apertura del lector de tarjetas.
#define E3 -1002 // Error al ejecutar la sentencia "SELECT" sobre la tarjeta
#define E4 -1003 // Error al ejecutar LOGIN para acceder a un sector.
#define E5 -1004 // Error durante la escritura de un bloque.
#define E6 -1005 // Error durante la lectura de un bloque.
#define E7 -1006 // Error obtención claves tarjeta
#define E8 -1007 // Error obtención tabla de bonos
#define E9 -2000 // ERRORES PARAMETROS
#define E10 -2001 // ERROR NumTarjeta Erróneo. El número de tarjeta tendrá un máximo de 8 dígitos.
#define E11 -2002 // Parámetro cTipoTarjeta erróneo.
#define E12 -2003 // Parámetro iDNI erróneo. Máximo 8 dígitos
#define E13 -2004 // Parámetro sFechaCaducidad incorrecto. Formato “ddmmyy”
#define E14 -2005 // El bono para este mes ya está cargado en la tarjeta
#define E15 -2006 // Origen de Anulación desconocido.
#define E16 -2007 // No se puede realizar la operación, debido a que ya la última operación no es una recarga.
#define E17 -2008 // No se puede realizar la operación, debido a que se supero el tiempo límite desde que se realizó la recarga.
#define E18 -2009 // No se puede realizar la operación, debido a que el importe a anular es superior al saldo restante en la tarjeta.
#define E19 -2010 // No se puede anular debido a que la última operación no fue un consumo
#define E20 -2011 // No existe operación que anular en el histórico
#define E21 -2012 // No se puede realizar la operación, debido a que se supero el tiempo límite desde que se realizó el consumo.
#define E22 -2013 // Error, Tarjeta Desactivada.
#define E23 -2010 //ERR_PORT_OCCUPIED = -2010,
#define E24 -2020 //ERR_HANDLE_INVALID = -2020,
#define E25 -2030 //ERR_INCORRECT_PARAM = -2030,
#define E26 -3000 //ERR_READER_NO_TAG = -3000,
#define E27 -3030 //ERR_READER_OP_FAILURE = -3030,
#define E28 -3040 //ERR_READER_UNKNOWN = -3040,
#define E29 -4010 //ERR_READER_LOGIN_INVALID_STORED_KEY_FORMAT = -4010,
#define E30 -4011 //ERR_READER_LOGIN_FAIL = -4011,
#define E31 -4012 //ERR_READER_OP_AUTH_FAIL = -4012,
#define E32 -4030 //ERR_READER_VALUE_DEC_EMPTY = -4030,
#define E33 -4031 //ERR_READER_VALUE_INC_OVERFLOW = -4031,
#define E34 -4032 //ERR_READER_VALUE_OP_FAILURE = -4032,
#define E35 -4033 //ERR_READER_VALUE_INVALID_BLOCK = -4033,
#define E36 -4034 //ERR_READER_VALUE_ACCESS_FAILURE = -4034;
Function Prepago()
LOCAL fPuerto := 0
LOCAL cDllName:="acr120u.DLL"
Public frHandle:= 0, ACR120libHandle ,fretcode
ACR120libHandle := LoadLibrary( cDllName)
//Puerto del lector, es 0 si solo hay un lector conectado.
//Abrir comunicación con el lector
frHandle := ACR120_Open(fPuerto)
?? SI RETORNO 0..XX E EL PUERTO QUE SE ENCUENTRA EL LECTOR SIN CONTACTO
// SI RETORNA ERRRO -xxxx QUE PUSIMOS ARRIBA Y VER ARRIBA.
return
DLL FUNCTION ACR120_Open(fPuerto AS LONG ) AS LONG PASCAL FROM "ACR120_Open" LIB ACR120libHandle
Funciona perfecto..
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Segunda funcion
//Vamos a probar si hay tarjetas en el lector ahora, obteniendo sus números Mifare
// var ejmplo en delphi
TagLength: array[0..50] of Byte;
TagType: array[0..50] of Byte;
TagFound: Byte;
SN: array[0..450] of Byte;
i,j: smallint;
snstr: string;
//Obtener la lista de tarjetas dentro del rango del lector
fretcode := ACR120_ListTags(frhandle, @TagFound, @TagType, @TagLength, @SN);
If (fretcode < 0) Then exit;
for i:= 0 to (TagFound-1) do begin
snstr := '';
for j:= i * 10 To ((TagLength[i] + i * 10) - 1) do snstr := snstr + chr(SN[j]);
En snstr se encuentra el número de serie Mifare que puedes guardar.
end;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ok ya con este numero de tarjeta MIDFARE podra determinar que fuciones podras utilizar del dll propietario recuerden que cada tarjetas midfare tiene sus propias funciones.
Ahora en FWH.
fretcode := ACR120_ListTags(frhandle, TagFound, TagType, TagLength, SN)
for i = 0 to TagFound-1
snstr := ''
for j:= i * 10 To ((TagLength[i] + i * 10) - 1)
snstr := snstr + chr(SN[j])
?? snstr
NEXT
NEXT
// recordando frHandle es el numero de puerto donde esta el lector Sin contacto
// fretcode podra ser 0 que fue exitoso
Return
DLL FUNCTION ACR120_ListTags(fPuerto AS LONG , TagFound AS LONG , TagType AS LPSTR , ;
TagLength AS LPSTR , SN AS LPSTR );
AS LONG PASCAL FROM "ACR120_ListTags" LIB ACR120libHandle
*****************************************************************************************************************************
Hasta aqui llego pues no se como manipular los Array pues no se como se hace el llamado a la dll, donde podremos ver el ejemlo del api propietario el siguiente.
Selects a TAG with specific serial number.
High Level API:
DLLAPI INT16 AC_DECL ACR120_MultiTagSelect( INT16 hReader,
UINT8 TagLength,
UINT8 SN[10],
UINT8* pResultTagType,
UINT8* pResultTagLength,
UINT8* pResultSN);
hReader Handle to the reader returned by AC_Open()
TagLength (N)
Contains the length of the serial number of the TAG TagLength (N) to be selected.
The TagLength may be 4, 7 or 10 bytes long
SN Contains the serial number of the TAG to be selected
pResultTagType Contains the selected TAG type
pResultTagLength (K)
Contains the length of the serial number of the selected TAG. The pResultTagLength may be 4, 7 or 10 bytes long.
pResultSN Serial number of the selected TAG
Return Value INT16 Result code. 0 means success.
Table 18: ACR120_MultiTagSelect Command Description
*******************************************************************************************************************************************
Donde tengo esto asi..
fretcode := ACR120_ListTags(frhandle, TagFound, TagType, TagLength, SN)
DLL FUNCTION ACR120_ListTags(fPuerto AS LONG , TagFound AS LONG , TagType AS LPSTR , ;
TagLength AS LPSTR , SN AS LPSTR );
AS LONG PASCAL FROM "ACR120_ListTags" LIB ACR120libHandle
Donde actulemente el fretcode me retorna un 63506 no se parece a Cero "0"
que seria lectura exitosa..
Bueno haber que podria cambiar en el uso de los arrary.
Ha Linares amigo para que me funcionara la primera funcion ... leyera cambiar a 9.09 fwh porque tenia usando la 2.7 y un compañero del foro compilo con la 16,12 y si trabajo asi use la version que te comente.
Gracias la yauda desde ya