Pour éditer le wiki, il faut demander un compte à un Lapin !
LeLoopRFID rue Chapon
LeLoopRFID, c'est notre propre système RFID qu'on pose là où on veut. Des fois on arrive dans un lieu déjà équipé en contrôle d'accès par RFID, mais celui-là c'est mon mien à moi.
Contents
RFID Reader
- Stronglink SL030
- Black -> GND
- Vcc -> 3.3V (other end of the bus)
- CLK -> A4
- Data -> A3
Electronics
- one LED on PIN D8 and GND
- one SPK on PIN D9 and GND
- door line on PIN D2 and GND
Code
- Github : https://github.com/LeLoop/LeLoopRFID
- Gitorious : https://gitorious.org/~le-loop/le-loop-rfid
LeLoopRFID.pde
Code source embarqué dans l'Arduino.
Il commence par 5 fonctions de contrôle de l'environnement :
- les beeps, death_beep(), coin_beep(), mushroom_beep(), high_beep()
- l'allumage de la diode set_led()/reset_led() et
- l'ouverture de la porte open_door().
Ensuite on retrouve la fonction, de setup du réseau, ether_setup(), qui initialise la shield Ethernet et ouvre une socket serveur (192.168.42.242:4242). La LED est allumée au démarrage pendant l'initialisation du réseau.
Enfin, arrivent les deux fonctions de base d'un sketch Arduino :
- setup()
qui va initialiser la connexion série pour le debug et appeler ether_setup().
- et loop()
qui va écouter sur la socket locale pour savoir si une requete est dans le buffer, et si tel est le cas, lire un caractère sur le buffer :
- si ce caractère est '1' : on ouvre la porte avec un mushroom beep et la diode clignote une fois,
- si ce caractère est '0' : on lance un death_beep() et la diode clignote deux fois.
Puis va demander à la lib rfid si un tag est passé, et si tel est le cas, se connecter au serveur distant et lui soumettre l'identifiant du tag.
leloop_rfid_model.py
bibliothèque servant de lien avec la base de données
On y retrouve "MembersDB" qui est l'objet de lien. Cet objet a trois méthodes :
- db = MembersDB(filename) initialise la connexion à la db ; filename est le chemin où stocker le fichier de base de données
- db.add_user(nick,id) ajoute un user en db, avec nick et id le pseudo et son tag associé
- db.get_user(id) retourne un nick en fonction d'un id de tag. En cas d'échec retourne None.
leloop_rfid_add.py
pour ajouter un utilisateur en db.
se contente d'implémenter MembersDB et prend l'argument 1 en pseudo et l'argument 2 en id de tag rfid :
leloop_rfid_add.py toto 101010
leloop_rfid_open_door.py
bibliothèque et commande pour déclencher l'ouverture de la porte. Il suffit d'exécuter ce script pour que la porte soit ouverte. Mais on peut en exporter les deux fonctions open_door() et deny_entrance() pour les appeler à partir d'un autre code.
leloop_check_entrance.py
Crée un serveur TCP sur 192.168.42.42:4242 et attend qu'y soit écrit des tags sous la forme :
CARD 101010
vérifie auprès de la db si l'identifiant est bien enregistré, puis logue sur stdout et appelle open_door() défini dans leloop_rfid_open_door.py si tel est le cas, deny_entrance() du meme module sinon.
Ce script est aussi exécuté en daemon à partir du script init /etc/init.d/leloop-rfid sur le serveur.
Todo
- agrémenter le code et les commandes associées
- implémenter ArgParse, créer une méta commande de contrôle...
- écrire une API RESTful (vive bottle.py)
- écrire un bot IRC (non-public) ?
- ajouter des photos du montage ici