Primer 123

Protocolo Fingerprint ZK Software ZK500 (X628)

      • 39
      • mensajes
      • miembro desde
      • 18/06/05
    • r3z
      r3z está desconectado
      coder inside
    21/05/2011
    #21 Re: Protocolo Fingerprint ZK Software ZK500 (X628)

    Antes que nada disculpen la colgada!

    Cita Escrito por luxas1980 Ver mensaje
    Te hago una pregunta. Que aparato tenes ?? el X628 b&w o el que viene con color? . El que tengo yo es a color, puedo hacer de todo menos ponerle voces y esas cosas. Saludos
    El mio es el b&w, tampoco puedo ponerle voces, solo reproducir las pregrabadas.

    Cita Escrito por schweini Ver mensaje
    @r3z: en especial, el checksum no me quedo claro en el PDF - alguien sabe si se refieren a alguno de los algoritmos estandar de checksum (CRC, etc), para poder usar una libreria normal para eso, o es alguna invencion rara de ellos?

    Gracias y pura vida,
    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...
    Código:
    03E8     XXXX     0000     0000
    comando  checksum session  reply
    transformamos el paquete a big endian (osea, invertimos los bytes)...
    Código:
    E803  XXXX  0000  0000
    sumamos el paquete original (en este ejemplo no tiene mucho caso)...
    Código:
    03E8 + 0000 + 0000 = 03E8
    sacamos la diferencia...
    Código:
    FFFF - 03E8 = FC17
    llevamos la diferencia a big endian para obtener el checksum...
    Código:
    FC17 = 17FC
    y ya tenemos el paquete entero!...
    Código:
    E803  17FC  0000  0000
    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)
    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...
    a jorgegv le gusta esto.
      • 1
      • mensajes
      • miembro desde
      • 16/05/11
    09/07/2011
    #22 Re: Protocolo Fingerprint ZK Software ZK500 (X628)

    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

      • 1
      • mensajes
      • miembro desde
      • 03/10/11
    03/10/2011
    #23 Re: Protocolo Fingerprint ZK Software ZK500 (X628)

    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.

      • 4
      • mensajes
      • miembro desde
      • 12/06/10
    17/02/2012
    #24 Re: Protocolo Fingerprint ZK Software ZK500 (X628)
    Cita Escrito por r3z Ver mensaje
    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...
    Código:
    03E8     XXXX     0000     0000
    comando  checksum session  reply
    transformamos el paquete a big endian (osea, invertimos los bytes)...
    Código:
    E803  XXXX  0000  0000
    sumamos el paquete original (en este ejemplo no tiene mucho caso)...
    Código:
    03E8 + 0000 + 0000 = 03E8
    sacamos la diferencia...
    Código:
    FFFF - 03E8 = FC17
    llevamos la diferencia a big endian para obtener el checksum...
    Código:
    FC17 = 17FC
    y ya tenemos el paquete entero!...
    Código:
    E803  17FC  0000  0000
    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)
    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

    muchas gracias por la info. Tengo un reloj parecido, solo queremos descargar
    los log de checadas con una aplicacion en php.
    Si podes contribuir con el driver basico sera bienvenido.

    Saludos
      • 2
      • mensajes
      • miembro desde
      • 26/11/07
    13/03/2012
    #25 Re: Protocolo Fingerprint ZK Software ZK500 (X628)

    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
      • mensajes
      • miembro desde
      • 16/08/08
    03/05/2012
    #26 Re: Protocolo Fingerprint ZK Software ZK500 (X628)

    Estimados, Buenas tardes, de casualidad alguno tiene el codigo de un driver en PHP que pueda compartir para poder utilizarlo como base. Desde ya les agradezco mucho

Primer 123