Protocolo Fingerprint ZK Software ZK500 (X628)
-
Antes que nada disculpen la colgada!
El mio es el b&w, tampoco puedo ponerle voces, solo reproducir las pregrabadas.
Hola schweini, el algoritmo que usa es bastante simple! como bien dijeron un par de posts mas arriba, consiste en la diferencia entre 0xffff y la suma de todos los valores de la cabecera y datos. El problema que se te puede presentar radica en la "endianicidad" (otro link) del paquete... nuestras maquinas suelen usar little endian (bytes - al + significativo), pero al dispositivo envia y recibe en big endian (bytes del + al - significativo)... por darte un ejemplo bien simple para iniciar una conexion:
Comando: CMD_CONNECT / unsigned short 1000 / hex 0x03E8
Session: unsigned short 0 / hex 0x0000 (aun no tengo sesion, me lo da el dispositivo al conectarme)
Reply: unsigned short 0 / hex 0x0000 (es el primer comando que envio, base 0)
Data: nada
Tenemos casi todos los datos que vamos a enviar, solo nos falta el checksum...transformamos el paquete a big endian (osea, invertimos los bytes)...Código:03E8 XXXX 0000 0000 comando checksum session reply
sumamos el paquete original (en este ejemplo no tiene mucho caso)...Código:E803 XXXX 0000 0000
sacamos la diferencia...Código:03E8 + 0000 + 0000 = 03E8
llevamos la diferencia a big endian para obtener el checksum...Código:FFFF - 03E8 = FC17
y ya tenemos el paquete entero!...Código:FC17 = 17FC
Si capturas los paquetes con wireshark o alguna otra herramienta, vas a ver que este es exactamente el paquete que se envia siempre como primer peticion para conectarse... vas a recibir un paquete con el comando 0x07D0 (CMD_OK), el checksum generado por el dispositivo, el numero de sesion asignado, y el numero de reply (0x0000 por ser la respuesta al primer comando)Código:E803 17FC 0000 0000
Cuando tenes datos es un poco distinto, varia la forma de suma y puede variar como se saca la diferencia, segun el resultado de la suma, pero el post ya se me hizo muy largo y aca tenes para hacer chocolate :P
En unas semanas calculo estare haciendo el primer commit del driver que estoy haciendo, algo muy basico, pero que sirve de esqueleto... asi que mas que bienvenida cualquier contribucion!
Saludos... -
Hola r3z. Ante todo muchas gracias por compartir todo esto, la documentacion de estos aparatos es malisima y creo que la mejor forma de comunicarse con ellos es colaborando entre nosotros :-)
Yo tengo algunos problemas para calcular el checksum, aunque no parece que al aparato le importe. Me explico: uso la misma funcion para calcular el checksum de los paquetes enviados y para comprobar el checksum de los paquetes recibidos (logico). Los paquetes que envío al aparato son interpretados correctamente (con mi checksum), pero el checksum de los paquetes que me llegan casi nunca me coincide con el calculado por mi (en la respuesta al paquete de conexion si). Os pongo una muestra (la salida de depuracion de mi programa):
--> ENC: *** c = 03e8 (1000), ck = fc17, s = 0000, r = 0000, d = ''
e80317fc00000000
<-- DEC: *** c = 07d0 (2000), ck = 47ea (mio = 47ea, dif = 0), s = b045, r = 0000, d = ''
d007ea4745b00000
--> ENC: *** c = 00c9 (201), ck = 4ef0, s = b045, r = 0001, d = ''
c900f04e45b00100
<-- DEC: *** c = 07d0 (2000), ck = 9e90 (mio = 9e91, dif = 1), s = b045, r = 0001, d = 'E�'
d007909e45b0010045931316
--> ENC: *** c = 044c (1100), ck = 4b6c, s = b045, r = 0002, d = ''
4c046c4b45b00200
<-- DEC: *** c = 07d0 (2000), ck = f165 (mio = f168, dif = 3), s = b045, r = 0002, d = 'Ver 8.18 Jun 17 2010'
d00765f145b0020056657220382e3138204a756e2031372032 30313000
(Las lineas '--> ENC' son paquetes que envio al aparato y las '<-- DEC' son los que recibo de el)
El paquete de conexion y su respuesta son correctos, pero a partir del segundo (comando 201, GET_TIME) y el tercero (comando GET_VERSION) los checksums calculados por mi son algo diferentes, aunque no por mucho.
Visto que mi checksum al aparato le vale, siempre puedo ignorar el checksum de los paquetes de respuesta, pero ya que precisamente sirve para validar los paquetes y detectar los erróneos, no parece lo mas oportuno.
Podrías mostrar el calculo del checksum para un paquete mas complejo, como por ejemplo el de respuesta al comando GET_VERSION?
Muchas gracias
Saludos
Jorge
P.S. Por cierto, para el otro tertuliano: mi programa está en Perl, probablemente podremos compartir codigo...
-----Agregado el 9/7/2011 a las 03 : 20 : 39-----
Por cierto, creo que el aparato envia y recibe en little endian, no en big endian como dices. En el propio ejemplo que indicas está claro: el comando 03E8 se envia como E803, en little endian: primero el byte menos significativo (e8) y despues el mas significativo (03). Y el checksum (FC17) igual: primero el byte menos significativo )17) y despues el más significativo (FC).
En cualquier caso gracias de nuevo por las aclaraciones :-)
Saludos
Jorge -
Hola, quería saber si ya pudieron extraer datos desde un fingerprint con el puerto 4370 ya que estoy intentando buscar alguna información por internet y este foro fue lo que más confiable hallé. Me gustaría saber si lo hicieron con php ya que los links que se encuentran aquí ya caducaron.
Mucho sabría agradecerle por la gestión en que me puedan ayudar. -
-
hola queridos amigos del foro, lei atentamente este post y es muy interesante. les pregunto si alguien realizó algo parecido en python, porque lo que necesito yo es bajar los datos a una base mysql. desde ya muchas gracias.-

1