Chiamata al server esterno
Al momento della "strisciata" con il badge rfid viene chiamato un servizio web esterno che effettua la validazione del codice rfid letto.
La chiamata è una semplice http get a un pagina web alla quale vengono passati il codice rfid letto e il gate, ovvero il codice della postazione.
Questo perchè il sistema è stato pensato per gestire un set di porte, gestite centralmente con un unico database.
La chiamata è del tipo GET /presenze.aspx?code=XXX&gate=YYY, dove XXX è il codice rfid e YYY è il codice della postazione.
Il servizio chiamato restituisce un "OK" se il codice rfid è valido, in tutti gli altri casi è sufficiente che la pagina web restituisca una stringa diversa.
Per questioni di sicurezza, al fine di avere sempre garantita l'apertura della porta anche in caso di assenza di connettività verso il server, ho previsto fino a 10 card "master" il cui identificati rfid è cablato nel codice: in questo caso se viene rilevata uno di questi codici, la porta viene aperta istantaneamente senza alcun tipo di verifica sul server remoto. Queste card andranno utilizzate solo dai proprietari del sistema, mentre l'abilitazione di tutte le altre card potrà essere fatta dinamicamente attraverso il database.
Configurazione
per la configurazione sono necessarie alcune costanti:
- const IPAddress server(82,63,171,50) : indirizzo del nostro server
- const int serverPort = 80 : porta del server
- const String gate = "SEDE1" : identificativo della postazione (gate)
- byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xE5, 0x0F } : mac address della ethernet shield (attenzione: deve coincidere con quello riportato sull'etichetta sul dietro della scheda)
- const String master0 = "2590ab25" : identificativo della card master (fino a 10)
- const int activateTime = 1000 : tempo di attivazione del relè (consigliato >500ms)
Attenzione: se lavorate con ip address statico, settate la variabile myip[] e scommentate la riga successiva, altrimenti verrà acquisito un indirizzo dinamico via dhcp
byte myip[] = { 10, 10, 30, 89 };
// Ethernet.begin(mac, myip);
Funzionamento
Il main è un ciclo infinito:
viene fatto lampeggiare il led, viene letto l'rfid, vengono aspettati 200ms e poi si ripete nuovamente il ciclo.
In caso di lettura di un rfid, viene verificato se il codice coincide con una delle card master, in tal caso viene attivato immediatamente il relè. Se il codice non è relativo a una card master, allora viene invocato il servizio esterno chiedendo la verifica sul codice rfid letto. Se la risposta è affermativa allora viene eccitato il relè.