Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Placas ZK de control de Acceso con Delphi (https://www.clubdelphi.com/foros/showthread.php?t=88923)

Panasys 27-08-2015 13:32:12

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             (Param:pchar):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 :confused:

Gracias

Javier

Casimiro Notevi 27-08-2015 13:44:58

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

Panasys 27-08-2015 16:55:39

Casimiro tu solucion es totalmente correcta, funciona ok.

Muchisimas gracias.

Casimiro Notevi 27-08-2015 17:52:57

Me alegro :)
Y no ha hecho falta ningún experto :D

Chuma87 13-01-2019 01:38:06

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

delphi.com.ar 19-01-2019 01:26:19

Cita:

Empezado por Chuma87 (Mensaje 530343)
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!

Chuma87 19-01-2019 01:43:43

Cita:

Empezado por delphi.com.ar (Mensaje 530391)
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

AngelEG 20-01-2019 14:51:10

ZK - Problemas con Secuencia String
 
Cita:

Empezado por delphi.com.ar (Mensaje 530391)
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.:confused:

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.

Chuma87 20-01-2019 17:10:47

Cita:

Empezado por Panasys (Mensaje 495910)

Código Delphi [-]
//Llamada a la DLL
function Connect             (Param:pchar):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?

Casimiro Notevi 20-01-2019 17:49:15

Cita:

Empezado por Chuma87 (Mensaje 530399)
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';

Chuma87 20-01-2019 18:24:13

Cita:

Empezado por Casimiro Notevi (Mensaje 530400)
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?


La franja horaria es GMT +2. Ahora son las 00:25:15.

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