Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > .NET
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-08-2015
Panasys Panasys is offline
Miembro
 
Registrado: ago 2007
Posts: 88
Poder: 17
Panasys Va por buen camino
Placas ZK de control de Acceso con Delphi

Buen día, he avanzado mucho con la comunicación de estas placas y solucionado varios problemas, toda la ayuda que viene en estas placas es en C# y lo he pasado a Delphi.

El problema es que me tope con el ingreso de usuarios a la placa, tengo un programa que viene con la plaza y desarrollado por ZK el fabricante.

Como no cumple con lo que necesito es que estoy desarrollando una aplicación en Delphi.

El ejemplo de la placa dice lo siguiente:

SetDeviceData

[Function]
int SetDeviceData(HANDLE handle,const char *TableName, const char *Data, const char *Options)

[Objective]
The function is used to set the device data (for example, the time segment, user information, and holiday information). The device data can be one or multiple records.

[Parameter description]
handle
[in]: The handle that is returned when the connection is successful.

TableName
[in]: Data table name. Attached table 4 lists the available data tables.

Data
[in]: Data record; the data is expressed in a text format; the multiple records are separated by \r\n, and the “Field=Value” pairs are separated by \t.

Options
[in]: The default value is null; it is used for extension.

[Returned value]
When the returned value is 0, it indicates that the operation is successful. When the returned value is a negative value, it indicates that the operation fails. Attached table 5 lists the information about the error codes.

[Example]

Python:
table = "user" # User information table
data = "Pin=19999\tCardNo=13375401\tPassword=1\r\nPin=2\tCardNo=14128058\tPassword=1"
p_table = create_string_buffer(table)
str_buf = create_string_buffer(data)
ret = self.commpro.SetDeviceData(self.hcommpro, p_table, str_buf, ‘’) # Upload the str_buf data to the user information table

c#:
int ret = 0;
string devtablename = "user";
string data = "Pin=19999\tCardNo=13375401\tPassword=1\r\nPin=2\tCardNo=14128058\tPassword=1";
string options = "";
ret = SetDeviceData(h, devtablename, data, options);



Bueno hasta aca parece sencillo, para la placa el valor principal es el Pin que es el nro de empleado, los otros campos son CardNo, Password, Group, si no se cargan por defecto llevan 0.


Asi llamo a la funcion:

Código Delphi [-]
//Llamada a la DLL
function Connect             (Paramchar):Integer;
function SetDeviceData    (handle: THandle; TableName: string; DeviceData: string; Options: string): Integer;

//Llamada a la fucion:
procedure TForm1.Button6Click(Sender: TObject);
var 
param       : pchar;
Conn         : Integer;
userdata    : string;
begin
param := 'protocol=TCP,ipaddress=192.168.1.251,port=4370,timeout=2000,passwd=';
Conn := Connect(Param);

userdata  := 'Pin=123\tCardNo=456789\tPassword=1\tGroup=1';
Ret       := SetDeviceData(Conn, 'user', userdata, '');

If Ret < 0 Then showmessage('Fallo Carga : ' + IntToStr(Ret)) else showmessage('Datos Cargados : ' + IntToStr(Ret));

end;

Que hace? solo me carga Pin, los demas valores en 0, como si el separador \t no le gustara, ya probe con pchar y tambien string.

Que hice anoche? decompile la otra aplicacion en C# y busque como llama a las funciones y lo hace con string. Y esa aplicacion funciona perfecto.

Mi pregunta es pchar y string funcionan igual? Hay algo que no estoy viendo o se me paso?

Llevo varios dias con lo mismo y sin documentacion por eso recurro a ustedes, de mas esta decir que para el que necesite algo con ZK nomas lo pida y lo comparto.

Por ejemplo si llamo a la funcion que me muestra la tabla:

Código:
Datos cargados con la aplicacion original:
CardNo,Pin,Password,Group
456789,123,,1
Código:
Datos Cargados por mi ap:
0,123,,0
Mucho lio?

Cualquier ayuda sera una gran ayuda

Gracias

Javier
Responder Con Cita
  #2  
Antiguo 27-08-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hola, a la espera de lo que comenten otros compañeros mucho más expertos que yo en estas cosas.
Lo que sí veo es que esta cadena tipo 'C' no es válida.
Código Delphi [-]
userdata  := 'Pin=123\tCardNo=456789\tPassword=1\tGroup=1';
Si necesitas pasar tabuladores, en lugar del estilo 'C', usa por ejemplo:
Código Delphi [-]
userdata  := 'Pin=123'#9'CardNo=456789'#9'Password=1'#9'Group=1';
Responder Con Cita
  #3  
Antiguo 27-08-2015
Panasys Panasys is offline
Miembro
 
Registrado: ago 2007
Posts: 88
Poder: 17
Panasys Va por buen camino
Casimiro tu solucion es totalmente correcta, funciona ok.

Muchisimas gracias.
Responder Con Cita
  #4  
Antiguo 27-08-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Me alegro
Y no ha hecho falta ningún experto
Responder Con Cita
  #5  
Antiguo 13-01-2019
Avatar de Chuma87
Chuma87 Chuma87 is offline
Miembro
 
Registrado: sep 2010
Posts: 24
Poder: 0
Chuma87 Va por buen camino
Perdon por revivir este hilo, pero estamos con un problema en el setdevice...

A diferencia Panasys, a nosotros siempre nos devuelve -100 (The table structure does not exist).
IDcon obviamente guarda el handle...


Código:
function SetDeviceData  (IDCon : THandle; tablename:String; data:String; options:String): Integer;StdCall; external 'plcommpro.dll';
Código:
procedure TForm1.Bt_SetDeviceClick(Sender: TObject);
Var Tabla:String;
    Datos:String;
    Opciones:String;
    Ret:Integer;
begin
    Tabla:= 'user';
    Datos:= 'CardNo=9765216\tPin=123\tPassword=1\tGroup=1\tStartTime=20190112\tEndTime=20190113';
    Opciones:= '';
    Ret:= SetDeviceData(IDCon,'user',Datos,Opciones);
    Memo1.Lines.Add(IntToStr(ret));
end;
Como sabemos si esta bien estructurado?

En datos tambien probamos asi:
Código:
Datos:= 'CardNo=9765216\tPin=123\tPassword=1\tGroup=1';

Última edición por Chuma87 fecha: 13-01-2019 a las 01:41:31.
Responder Con Cita
  #6  
Antiguo 19-01-2019
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
Empezado por Chuma87 Ver Mensaje
En datos tambien probamos asi:
Código:
Datos:= 'CardNo=9765216\tPin=123\tPassword=1\tGroup=1';
Estas replicando el mismo error de Panasys, deberías hacer lo que dijo Casimiro:

Código Delphi [-]
Datos := 'CardNo=9765216'#9'Pin=123'#9'Password=1'#9'Group=1';
ó
Código Delphi [-]
Datos := 'CardNo=9765216'#9'Pin=123'#9'Password=1'#9'Group=1'#9'StartTime=20190112'#9'EndTime=20190113';

El compilador de Delphi, no interpreta los secuencias de escape \t \n....

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 19-01-2019
Avatar de Chuma87
Chuma87 Chuma87 is offline
Miembro
 
Registrado: sep 2010
Posts: 24
Poder: 0
Chuma87 Va por buen camino
Cita:
Empezado por delphi.com.ar Ver Mensaje
Estas replicando el mismo error de Panasys, deberías hacer lo que dijo Casimiro:

Código Delphi [-]
Datos := 'CardNo=9765216'#9'Pin=123'#9'Password=1'#9'Group=1';
ó
Código Delphi [-]
Datos := 'CardNo=9765216'#9'Pin=123'#9'Password=1'#9'Group=1'#9'StartTime=20190112'#9'EndTime=20190113';

El compilador de Delphi, no interpreta los secuencias de escape \t \n....

Saludos!
El problema estaba en la sdk....las que necesitamos nosotros son pull...ya lo resolvimos! Gracias
Responder Con Cita
  #8  
Antiguo 20-01-2019
AngelEG AngelEG is offline
Registrado
 
Registrado: dic 2018
Posts: 3
Poder: 0
AngelEG Va por buen camino
ZK - Problemas con Secuencia String

Cita:
Empezado por delphi.com.ar Ver Mensaje
Estas replicando el mismo error de Panasys, deberías hacer lo que dijo Casimiro:

Código Delphi [-]
Datos := 'CardNo=9765216'#9'Pin=123'#9'Password=1'#9'Group=1';
ó
Código Delphi [-]
Datos := 'CardNo=9765216'#9'Pin=123'#9'Password=1'#9'Group=1'#9'StartTime=20190112'#9'EndTime=20190113';

El compilador de Delphi, no interpreta los secuencias de escape \t \n....

Saludos!
Buen día, tengo el mismo problema.. sólo me graba el Pin, luego encontré este hilo, y veo que lo han solucionado, pero no me está funcionando.

Tengo la función declarada así:
Código Delphi [-]
function SetDeviceData  (IDCon : THandle; tablename:String; data:String; options:String): Integer;StdCall; external 'plcommpro.dll';

y la llamo de esta manera:

Código Delphi [-]
procedure TForm1.Bt_SetDeviceClick(Sender: TObject);
Var Tabla:String;
    Datos:String;
    Opciones:String;
    Ret:Integer;
begin
    Tabla:= 'user';
    Datos:= 'Pin=33118973'#92'CardNo=9765216';
    Opciones:= '';
    Ret:= SetDeviceData(IDCon,Tabla,Datos,Opciones);
    Memo1.Lines.Add(IntToStr(ret));
end;

He probado con #9 también, esto reemplazaría por completo '\t' arriba puse #92 porque esa es "barra invertida" verdad. Podrían ayudarme con esto me tiene muy trabado al intentar insertar usuarios.
Responder Con Cita
  #9  
Antiguo 20-01-2019
Avatar de Chuma87
Chuma87 Chuma87 is offline
Miembro
 
Registrado: sep 2010
Posts: 24
Poder: 0
Chuma87 Va por buen camino
Cita:
Empezado por Panasys Ver Mensaje

Código Delphi [-]
//Llamada a la DLL
function Connect             (Paramchar):Integer;
function SetDeviceData    (handle: THandle; TableName: string; DeviceData: string; Options: string): Integer;

end;

Javier
Querido, podrias pasarme la DLL? Porque nosotros conseguimos en un principio la de un frances, pero las declara como Pansichar, y la queremos dejar como la tenes vos (string) y no nos deja, nos devuelve -100. Pero si la dejamos como Pansichar, nos retorna 0, y solo nos graba el pin.

Probamos cambiar las barras por #9, quitar las t, todo, y sigue sin funcionar. Por eso, mi principal sospecha esta en la DLL...nos la podrias pasar?
Responder Con Cita
  #10  
Antiguo 20-01-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Chuma87 Ver Mensaje
Probamos cambiar las barras por #9, quitar las t, todo, y sigue sin funcionar.
Tabulador: \t es lo mismo que #9

Prueba a sustituirlo en la cadena, ejemplo, si tienes:
userdata := 'Pin=123\tCardNo=456789\tPassword=1\tGroup=1';

Cámbialo por:
userdata := 'Pin=123#9CardNo=456789#9Password=1#9Group=1';
Responder Con Cita
  #11  
Antiguo 20-01-2019
Avatar de Chuma87
Chuma87 Chuma87 is offline
Miembro
 
Registrado: sep 2010
Posts: 24
Poder: 0
Chuma87 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Tabulador: \t es lo mismo que #9

Prueba a sustituirlo en la cadena, ejemplo, si tienes:
userdata := 'Pin=123\tCardNo=456789\tPassword=1\tGroup=1';

Cámbialo por:
userdata := 'Pin=123#9CardNo=456789#9Password=1#9Group=1';
Ya lo resolvimos!!!!!

Lo que estabamos haciendo en un principio era esto..
Código Delphi [-]
Ret:= SetDeviceData(IDCon,'user','Pin=33118973'#9'CardNo=9765216'#9'Password=1'#9'Group=1','');
Y claro! se cortaba en el pin, entonces lo que hicimos, quitamos el modo bruto de prueba y toda la cadena la guardamos en una variable, pero en vez de string (que aun no sabemos por que no nos funciona) en Pansichar.
Y funciona! Ahora no sabemos por que no nos cambia el grupo, yo le paso 4 que es proveedor, pero cuando vamos a la app de ZK, nos la sigue dejando como 1 que es proveedor. O nosotros estamos interpretando mal el valor GROUP, que es entonces?
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Control de Acceso KingOfDragons Varios 9 02-09-2018 03:22:09
Acceso al Panel de Control de Windows dec Trucos 0 30-06-2006 23:04:23
Control de Acceso Multiusuario a BD FranSyS Firebird e Interbase 7 30-04-2004 18:16:06
Aplicacion de Control de Acceso a la PC Iceman API de Windows 3 18-11-2003 19:21:03
control de acceso a paradox Javier PLatas Tablas planas 0 20-05-2003 16:17:19


La franja horaria es GMT +2. Ahora son las 22:05:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi