Blog de conocimiento gratuito: linux, programación, open source, bases de datos, android, frameworks, web e informática en general.
Hoy te mostraré un software que acabo de programar usando PHP, MySQL, tarjetas RFID y una tarjeta ESP8266. Este programa es totalmente gratuito y open source.
Se trata de un sistema de registro de asistencia de empleados en PHP, basado en otro sistema que recién publiqué, pero ahora con una característica adicional: la asistencia también puede ser tomada usando tarjetas RFID.
De este modo se pueden asignar tarjetas RFID a los empleados (incluido totalmente en el sistema) y también pasar la asistencia de manera automática al usar estas tarjetas.
Con ligeras modificaciones incluso se podría hacer un sistema para el registro del tiempo, entradas y salidas a determinado lugar, etcétera.
A través del post te mostraré cómo usar el sistema, descargarlo, y sobre todo cómo está programado.
Si bien esto no es un “copiar y pegar”, sí que toma varios aspectos de varios posts que ya he expuesto, los cuales te animo a leer:
Te repito que deberías leerlos, pues aquí solo explicaré lo que cambia desde esos sistemas hasta lo presentado en este artículo. Eso sí, te dejaré el código completo a lo largo del post, pero lo digo para que puedas aprender el funcionamiento.
Dicho eso, comencemos.
Veamos primero el código de la tarjeta ESP8266. En este caso queda así:
Como puedes ver, lo único que hace la tarjeta es enviar el valor a través de la red, en el endpoint /rfid_register.php
pasándole el serial como parámetro de la URL.
Ya en el servidor nos vamos a encargar de hacer lo pertinente de acuerdo a la situación. Para este caso habrá dos modos: el modo de lectura y modo de emparejamiento.
En el modo de emparejamiento, el servidor va a tener ya un id de empleado con el que va e relacionar o emparejar el serial de la tarjeta RFID, así que tan pronto se le envíe un serial, va a realizar el registro de que la tarjeta le pertenece al empleado.
Por otro lado, en el modo de lectura simplemente se leerá el serial y en caso de que haya un empleado registrado con esa tarjeta (emparejado anteriormente usando el otro modo) se le pondrá asistencia para esa fecha.
De este modo dejamos la mayor parte del funcionamiento en el servidor, para que podamos dejar que el lector y la ESP8266 se encarguen de una sola cosa.
En cuanto a la base de datos MySQL que usa este sistema de asistencias con tarjetas RFID, se usan 3 tablas. La primera es la de empleados, la segunda es la de la asistencia de empleados y la tercera es la que relaciona las tarjetas RFID con cada empleado.
A las funciones que ya estaban en el sistema de asistencias, le he agregado otras adicionales para el manejo de las tarjetas RFID, el modo del lector, etcétera.
Es importante mencionar los modos del lector, pues en este caso el modo se guarda en un archivo de texto (que es creado de manera automática). Además, el ID del empleado con el que se va a emparejar también es guardado en un archivo de texto.
La función más importante es onRfidSerialRead
que indica un evento: el evento del serial leído. En este caso puedes ver que si el modo es emparejamiento, se empareja el empleado (obtenido de otra función) con el serial recién leído. Además, una vez leído se pasa al modo lectura.
Por otro lado, si el modo es lectura, entonces se obtiene el empleado ligado a esa tarjeta y se le pone asistencia para esa fecha.
Tenemos una interfaz que muestra a los empleados con su respectiva tarjeta en caso de que ya cuenten con una. Hay 3 opciones:
Nota: si una tarjeta RFID ya está usada por otro empleado y ésta se asigna a uno nuevo, se eliminará la asociación que tenía con el primero. Es decir, la tarjeta le pertenece al último que la haya registrado como suya.
He usado Vue.js para manejar este apartado, haciendo llamadas AJAX. El método más complejo de entender es el de esperar a que se asigne la tarjeta, pero lo único que se hace es consultar cada determinado tiempo si el empleado ya tiene asignado un serial, en ese caso, se indica con un toast y se refresca la lista.
De cualquier modo, el código queda así:
Por cierto, se usa un algoritmo similar al de la asistencia. Primero se obtienen todos los empleados, y luego los datos de las tarjetas. Finalmente se recorren los datos de las tarjetas y en caso de que haya una tarjeta para un empleado, se le sobrepone ese valor.
También es importante notar que usamos v-if
propio de Vue para mostrar los botones.
Ahora veamos el archivo que guarda la asistencia cuando el empleado la pasa por el lector RFID. En este caso es el evento que mencioné anteriormente. La función es:
Al leer la tarjeta vamos a recibir el id del empleado (obtenida de la otra función). Primero eliminamos todos los datos que haya para ese empleado en esa fecha (por si anteriormente tenía otro valor) y después de eso se inserta la asistencia con el estado de presencia.
Por cierto, este valor ya se reflejará al pasar asistencia (la opción ya estará seleccionada):
Aunque obviamente en caso de un error, se puede usar el sistema de asistencias para modificar ese apartado. Las tarjetas solo sirven como ayuda.
Y también aparecerá en el reporte de asistencia:
En un escenario perfecto, se registran todos los empleados, después se les asigna una tarjeta y cada uno pasa la tarjeta por el lector día con día, para así llevar un control de asistencia completo.
Por cierto, en caso de que no te hayas dado cuenta; las tarjetas son reutilizables. Por lo que si se elimina un empleado, su tarjeta puede ser reutilizada por otro.
Esto puede ser una ventaja o desventaja dependiendo de como lo veas, pero a como yo lo veo, puedes reutilizar su tarjeta y así evitar desperdiciarlas.
Recuerda que el sistema ya tiene toda la gestión de empleados, conexión a base de datos, etcétera. Aquí básicamente estoy mostrando las modificaciones que le hice al sistema que presenté anteriormente.
Te dejo el código fuente completo (el de C++ es el código de la tarjeta) en mi GitHub. También te dejo más posts sobre PHP, ESP8266 y sistemas que he creado.
hola el proyecto es muy interesante pero que modificacion se podria realizar si quieres poner una antena de mayor alcance long rage pero esas antenas trabajan con puerto rs232, y no con lector r522
Hola. Gracias por sus comentarios. Si tiene alguna consulta, solicitud de creación de un programa o solicitud de cambio de software estoy para servirle en https://parzibyte.me/#contacto
Saludos!
Hola Parzibyte, excelente tutorial, muchas gracias por compartirlo, estuve trabajando en un proyecto parecido, la aplicacion electronica era otra pero si tengo una intranet web escrito en php y como base de datos mysql tambien, lo que yo intento realizar es que mi cliente socket sea mi aplicacion web, o sea que inicia la comunicacion o quien realiza peticiones es mi web al modulo server esp8266 y este responde, estoy en eso y desarrollandolo, este tutorial me sirve de base, gracias por eso, anteriormente escribi una web en java y use java sockets con la web como cliente socket y funcionó aparentemente bien, mi aplicacion web java corria en mi localhost con mi laptop como host conectandome a internet via wifi con una ssid de mi operador local, en el lado del servidor esp8266 con el mismo ssid y no funcionaba, lei que el servidor no era visible para mi aplicacion, y que ambas tenian que estar en la misma red y con privilegios.
Hola. Gracias por sus comentarios. Le deseo éxito en su proyecto
Saludos 🙂