SUNLAB - Enregistrement, Authentification & Accès électronique

Dans ce tutoriel nous allons voir deux sujets :

  • Service d'authentification de la porte du Sunlab.
  • Service d'enregistrement de présence au Sunlab.

Afin de suivre correctement ce tutoriel, il est nécessaire d'avoir des connaissances au moins basiques dans les domaines suivants: Linux, Programmation & électronique. Je ne vais pas rentrer dans les détails de certaines parties.

La majorité des opérations doivent être réalisés sur votre Raspberry-pi. Notamment la partie compilation des codes et programmes C qui ne fonctionneront pas s'ils sont compilés sous une architecture x68/x64 et déplacés sur ARM… Une partie des codes sources sont déjà disponibles compilés pour ARM dans le dépôt git.

Liste des technologies

  • Dév web: PHP / CSS / HTML / Javascript
  • Dév système: C
  • Hardware: Raspberry py, NFC reader
  • Base de données: MYSQL / LDAP
  • Système : Linux (debian), Apache2
  • Gestion du code: Git

Fonctionnement et architecture du code

L'intégralité du code est géré sous GIT, vous pouvez contribuer directement en effectuant des demandes de merge.

Lien du git: https://github.com/ThomasGsp/sunlab

Le code est divisé en quatre grande parties:

  • Le “common”, le code sert de base fonctionnelle aux trois autres.
  • La partie “door”, comprenant le code spécifique pour la porte.
  • La partie “nfc”, pour le nfc.
  • La partie “register” pour l'enregistrement de présence.

Afin d'accélérer le développement, le code est basé sur plusieurs tierces parties:

Hardware

Installation et configuration

  • Préparer une installation propre de Raspbian sur un raspberry
  • Installer les suites de logiciels suivants avec les configurations associés

Stack web: apache2, php, mysql

#  Installation des paquets debian
apt-get install apache2 mysql-server php5 libapache2-mod-php5  php5-ldap  php5-mysql

# Configuration sécurité apache:
vi /etc/apache2/conf-enabled/security.conf
ServerTokens Prod
ServerSignature Off

#  VHOST apache:
vi /etc/apache2/sites-available/sunlab.conf

<VirtualHost *:80>
        ServerName porte.sunlab.org
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/sunlab/door
        <Directory /var/www/sunlab/door>
          Options -Indexes
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/porte_error.log
        CustomLog ${APACHE_LOG_DIR}/porte_access.log combined
</VirtualHost>

<VirtualHost *:80>
        ServerName presence.sunlab.org
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/sunlab/register
        <Directory /var/www/sunlab/register>
                Options -Indexes
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/presence_error.log
        CustomLog ${APACHE_LOG_DIR}/presence_access.log combined
</VirtualHost>

<VirtualHost *:80>
        ServerName nfc.sunlab.org
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/sunlab/nfc
        <Directory /var/www/sunlab/nfc>
                Options -Indexes
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/nfc_error.log
        CustomLog ${APACHE_LOG_DIR}/nfc_access.log combined
</VirtualHost>

#  Configuration MYSQL:
# Se connecter à mysql, créer une base avec un utilisateur associé:
CREATE DATABASE sunlab;
CREATE USER 'sunlab'@'localhost' IDENTIFIED BY 'definir_ici_un_mot_de_passe';
GRANT ALL PRIVILEGES ON sunlab.* TO 'sunlab'@'localhost';
FLUSH PRIVILEGES;

# Le schéma de la base est disponible dans SUNLAB/DOC/DATABASE.sql

Déploiement: git

#  Installation des paquets debian
apt-get install git

#  Cloner le projet dans votre home utilisateur
git clone https://github.com/ThomasGsp/sunlab.git

# Copier le projet dans votre répertoire web
cp -R sunlab /var/www/
chown -R www-data: /var/www/sunlab

NFC

Pour utiliser le module nfc usb, il est nécessaire d'installer la librairie libnfc.

#  Installation des paquets debian
apt-get install dh-autoreconf  doxygen  libusb-dev libpcsclite-dev make pcscd

# Installation de la libnfc (utiliser la version 1.5 pour des raisons de compatibilités !)
git clone https://github.com/nfc-tools/libnfc.git
cd libnfc/
git checkout libnfc-1.7.1
autoreconf -vis
./configure --enable-doc
make
make install

# Blacklist du module originel
vi /etc/modprobe.d/blacklist-libnfc.conf
blacklist pn533
blacklist nfc

# Désactivation à chaud
modprobe -r pn533 nfc

# restart du process
service pcscd restart

Gestion IO: wiringPi

Ce module permet de gérer les entrés/sorties GPIO du raspberry (en C)

git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

Code source spécifique

L'utilisation des commandes NFC et PIN GPIO du Raspberry-pi nécessitent des droits utilisateur élevés (root).
Pour des raisons de sécurité, apache n'a pas des droits suffisamment élevés pour réaliser les opérations. Il existe plusieurs possibilités pour contourner le problème: Mettre en place un SUDO sur certaines commandes ou réaliser un Wrapper en C avec des droits associés corrects.

C'est cette seconde possibilité qui est mise en place.

Trois programmes sont concernés:

  • <web dir>/SUNLAB/nfc/bin/getid.c
  • <web dir>/SUNLAB/door/bin/waitforce.c
  • <web dir>/SUNLAB/door/bin/opendoor.c

Configuration opendoor.c:

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <wiringPi.h>

const int door = 4; // PIN  wiringPi pour l'ouverture de la porte
int main(void)
{
    setuid (0);

    wiringPiSetup () ;
    pinMode (door, OUTPUT) ;
    digitalWrite (door, 1) ;
    delay (3000) ;   // Temps d'ouverture de la porte
    digitalWrite (door, 0) ;
    return 0 ;
}
# Compiler le code source:
gcc -Wall -o opendoor opendoor.c -lwiringPi

# L'attribuer avec le bon user:
chown root: opendoor

# Lui donner les droits spécifique:
chmod ug+s opendoor

Configuration waitforce.c:

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <wiringPi.h>

const int butPin = 5; // PIN  wiringPi pour le bouton manuel d'ouverture de la porte.
const int door = 4;  // PIN  wiringPi pour l'ouverture de la porte (même que pour  opendoor.c)

int main(void)
{
    setuid (0);
    wiringPiSetup () ;
    pinMode(butPin, INPUT);
    pinMode (door, OUTPUT);
    while(1)
    {
        if (digitalRead(butPin)) // Button is released if this returns 1
        {
            digitalWrite (door, 1);
            delay (3000);
            if (! digitalRead(butPin)) // Button is released if this returns 1
            {
                digitalWrite (door, 0);
            }
        }
    }
    return 0 ;
}
#Compiler le code source:
gcc -Wall -o waitforce waitforce.c -lwiringPi

# L'attribuer avec le bon user:
chown root: waitforce

# Lui donner les droits spécifique:
chmod ug+s waitforce

Configuration getid.c:

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

main ()
{
    setuid (0);
    char cmdLine[256];
    // Commande qui permet de récupérer les uid des cartes NFC.
    sprintf(cmdLine, "/usr/bin/nfc-list| egrep '(UID|PUPI)' | awk -F':' '{print $2}' | sed 's/ //g'");
    return system(cmdLine);
}
#Compiler le code source:
gcc -Wall -o getid getid.c

#L'attribuer avec le bon user:
chown root: getid

#Lui donner les droits spécifique:
chmod ug+s getid

Les programmes sont maintenant habilités à s'exécuter en root avec un utilisateur classique.

Le programme waitforce.c permettant l'ouverture forcé de la porte par le bouton est lancé automatiquement au démarrage du raspberry via une ligne ajouté au fichier “/etc/rc.local”.

Architecture physique

Le système est composé de trois parties:

  • Les électro-aimants au situés au niveau de la porte
  • La puissance électronique, le petit boîtier blanc
  • La commande électroniques, le raspberry

Les électro-aimants:

Afin de limiter l'intensité au niveau du circuit électronique, ils ont été réglés sur 24v. Ils sont montés en dérivation et contrôlés par le boitier de puissance électronique.

L'alimentation 24v est assuré par un bloc dédié, un relais est mis en coupure permettant d'ouvrir ou fermer le circuit.

La puissance électronique:

Ce boîtier blanc permet de faire l'interconnexion entre les éléments d'actions (interrupteurs, électro-aimants) et le raspberry-pi.

Il possède plusieurs connecteurs externes:

  • Connecteur series, pour l'interconnexion avec le raspberry
  • Connecteur alimentation (entrée), qui permet de connecter le bloc d'alimentation
  • Connecteur alimentation (sortie), qui permet la servitude des electro-aimants
  • Connecteur jack, pour l'entrée de la commande des boutons de force d'ouverture
LIEN DU SCHÉMA SVG: http://svgshare.com/s/1Ei

Cliquez sur une photo pour la voir en plus grand, défilez avec la souris ou le clavier pour passer à la photo suivante

Cyril CABANNES, 2017/04/16 21:12

Pour notre problème de protection, une carte de protection des gpio : http://www.wakdev.com/projets/divers/roverpi/129-03-carte-de-protection-des-gpio.html même si je ne suis pas certain de la qualité de la protection en absolu (pour nous, ça devrait le faire) : gpio protégés que dans un sens, nan? il y a mieux mais là, faut faire un typon : http://www.framboise314.fr/empilez-les-cartes-dextension-du-raspberry-pi-avec-abelectronics/ schema ici : http://www.abelectronics.co.uk/docs/stock/raspberrypi/bufferpi/bufferpi-schematic.pdf

Vous pourriez laisser un commentaire si vous étiez connecté.