Ver Mensaje Individual
  #1  
Antiguo 27-08-2015
Panasys Panasys is offline
Miembro
 
Registrado: ago 2007
Posts: 88
Reputación: 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