<?php

// ZKLibrary
// ZKLibrary es una biblioteca PHP para dispositivos de asistencia y control de tiempo ZK.
// Esta biblioteca está diseñada para leer y escribir datos en dispositivos de asistencia (huella dactilar, reconocimiento facial o RFID) utilizando el protocolo UDP.
// Esta biblioteca es útil para comunicar directamente un servidor web con un dispositivo de asistencia sin necesidad de un programa adicional.
// Está implementada en forma de clase para que puedas crear un objeto y usar sus funciones.

// El servidor web debe estar conectado al dispositivo de asistencia mediante una red local (LAN).
// El puerto UDP utilizado para esta comunicación es el 4370. No se puede cambiar este puerto sin modificar el firmware del dispositivo.

// El formato de los datos es: binario, cadena y número. La longitud de los parámetros y valores de retorno puede variar.

// Ejemplo
require 'zklibrary.php';

$zk = new ZKLibrary('192.168.1.102', 4370);
$zk->connect();
$zk->disableDevice();

// $zk->setTime(date('Y-m-d H:i:s'));
$zk->testVoice();

$zk->enableDevice();
$zk->disconnect();

// Estructura de datos
// Clase ZKLibrary {
//     String ip;
//     Short sin signo port;
//     Long sin signo socket;
//     Long sin signo session_id;
//     String received_data;
//     Matriz de Strings user_data;
//     Matriz de Strings attendance_data;
//     Long sin signo timeout_sec;
//     Long sin signo timeout_usec;
// }

// Funciones:

// __construct([$ip[, $port]])
// Constructor del objeto.

// __destruct()
// Destructor del objeto.

// connect([$ip[, $port]])
// Realiza la conexión con el dispositivo. Si no se definen IP y puerto previamente, deben pasarse a esta función.

// disconnect()
// Desconecta del dispositivo.

// setTimeout([$sec[, $usec]])
// Establece el tiempo de espera para la conexión por socket.

// reverseHex($input)
// Invierte los dígitos hexadecimales.

// encodeTime($time)
// Codifica una hora en datos binarios.

// decodeTime($data)
// Decodifica datos binarios en hora.

// checkSum($p)
// Calcula el checksum del paquete a enviar al reloj de asistencia.

// createHeader($command, $chksum, $session_id, $reply_id, $command_string)
// Crea el encabezado de datos para enviar al dispositivo.

// checkValid($reply)
// Verifica si la respuesta es válida.

// execCommand($command, $command_string = '', $offset_data = 8)
// Envía un comando y datos al dispositivo, y recibe datos si los hay.

// getSizeUser()
// Obtiene el número de usuarios registrados en el dispositivo.

// getSizeAttendance()
// Obtiene el número de registros de asistencia almacenados.

// restartDevice()
// Reinicia el dispositivo.

// shutdownDevice()
// Apaga el dispositivo.

// sleepDevice()
// Pone el dispositivo en modo suspensión.

// resumeDevice()
// Reanuda el dispositivo desde el modo suspensión.

// changeSpeed($speed = 0)
// Cambia la velocidad de transferencia de datos.

// writeLCD($rank, $text)
// Escribe texto en la pantalla LCD del dispositivo.

// clearLCD()
// Limpia el texto de la pantalla LCD.

// testVoice()
// Prueba de voz del dispositivo.

// getVersion()
// Obtiene la versión del dispositivo.

// getOSVersion($net = true)
// Obtiene la versión del sistema operativo.

// setOSVersion($osVersion)
// Establece la versión del sistema operativo.

// getPlatform($net = true)
// Obtiene la plataforma.

// setPlatform($platform)
// Establece la plataforma.

// getFirmwareVersion($net = true)
// Obtiene la versión del firmware.

// setFirmwareVersion($firmwareVersion)
// Establece la versión del firmware.

// getWorkCode($net = true)
// Obtiene el código de trabajo.

// setWorkCode($workCode)
// Establece el código de trabajo.

// getSSR($net = true)
// Obtiene el SSR.

// setSSR($ssr)
// Establece el SSR.

// getPinWidth($net = true)
// Obtiene el ancho del PIN.

// setPinWidth($pinWidth)
// Establece el ancho del PIN.

// getFaceFunctionOn($net = true)
// Verifica si la función de detección facial está disponible.

// setFaceFunctionOn($faceFunction)
// Establece la disponibilidad de la detección facial.

// getSerialNumber($net = true)
// Obtiene el número de serie del dispositivo.

// setSerialNumber($serialNumber)
// Establece el número de serie del dispositivo.

// getDeviceName($net = true)
// Obtiene el nombre del dispositivo.

// setDeviceName($deviceName)
// Establece el nombre del dispositivo.

// getTime()
// Obtiene la hora del reloj del dispositivo.

// setTime($t)
// Establece la hora del dispositivo.

// enableDevice()
// Habilita el dispositivo para su funcionamiento normal.

// disableDevice()
// Desactiva temporalmente el dispositivo para realizar operaciones.

// enableClock()
// Activa el parpadeo de los puntos ':' en el reloj LCD.

// getUser()
// Recupera la lista de usuarios del dispositivo.

// setUser($uid, $userid, $name, $password, $role)
// Escribe un nuevo usuario en el dispositivo.

// setUserTemplate($template)
// Sube una plantilla de huella dactilar al dispositivo.

// getUserTemplate($uid, $finger)
// Obtiene la plantilla de huella de un usuario.

// clearData()
// Elimina todos los datos del dispositivo (usuarios, asistencias, etc).

// clearUser()
// Elimina todos los usuarios.

// deleteUser($uid)
// Elimina un usuario específico.

// deleteUserTemp($uid, $finger)
// Elimina una plantilla de huella específica de un usuario.

// clearAdmin()
// Elimina todos los administradores.

// getAttendance()
// Recupera los registros de asistencia.

// clearAttendance()
// Elimina todos los registros de asistencia.
