1) Réaliser un lecteur de badge avec rasberry pi (Partie 1)
Introduction
Un article en deux parties.Une première cette semaine pour vous expliquer comment installer la librairie sur votre raspberry pi. Le prochain article décrira comment réaliser un programme en C pour lire un badge de type badge d’entrée des immeubles.
La librairie libnfc
La librairie libnfc est une librairie dédiée à la communication en NFC. Cette librairie est publieé sous licence LGPL (libre de droit pour les applications libres ou commerciales).
Celle-ci fonctionne avec un hardware spécifique, on peut trouver la liste sur le wiki de libnfc.
Pour ma part, j’ai un dongle usb équipé d’un PN533 (fabriqué par NXP). La photo est ci dessous :
Télécharger la librairie
Les liens du wiki officiel sont brisés mais une petite recherche google nous permet de retrouver la release. Pour les projets sur le Pi, privilégiez les versions packagées aux versions développeurs.
(wget
https://github.com/nfc-tools/libnfc/releases/download/libnfc-1.7.0-rc3/libnfc-1.7.0-rc3.tar.gz)
wget https://libnfc.googlecode.com/files/libnfc-1.7.0-rc3.tar.gz
tar -xvzf libnfc-1.7.0-rc3.tar.gz
cd libnfc-1.7.0-rc3/
Configuration
Si vous souhaitez configurer la librairie pour un pn532 en UART comme ceux de chez Adafruit il va falloir commencer par libérer l’UART du pi comme indiqué dans cette article :
Puis une fois l’UART libéré, il va falloir copier le fichier de configuration comme suit :
sudo mkdir -p /etc/nfc/devices.d
sudo cp contrib/libnfc/pn532_uart_on_rpi.conf.sample /etc/nfc/devices.d/pn532_uart_on_rpi.conf
Editez ensuite le fichier suivant :
sudo nano /etc/nfc/devices.d/pn532_uart_on_rpi.conf
Et modifiez la ligne suivante à la fin du fichier
allow_intrusive_scan = true
Compilation
Enfin nous pouvons maintenant compiler les sources :
./configure --with-drivers=pn532_uart --sysconfdir=/etc --prefix=/usr
autoreconf -vis
make clean
sudo make install
Et pour tester :
cd utils/
sudo ./nfc-scan-devices
Et vous devriez voir apparaître quelque chose comme ça :
1 NFC device(s) found:
- NXP / PN533:
pn53x_usb:002:003
Conclusion
En attendant l’article de la semaine prochaine (il est déjà écrit, il ne reste qu’à le mettre en page), vous pouvez parcourir le dossier exemple/. Vous y trouverez de quoi vous amusez un peu avec diverses badges du quotidien.
http://oversimple.fr/realiser-un-lecteur-de-badge-avec-rasberry-pi-partie-1/2) Réaliser un lecteur de badge avec rasberry pi (Partie 2)
Introduction
La semaine dernière, nous en étions restés à la compilation de la librairie libnfc. Si vous avez besoin de vous rafraîchir la mémoire c’est par ici. Aujourd’hui nous allons voir comment lire un badge tel que les badges d’entrée d’immeuble avec un programme en C qui tournera sur raspberry Pi.
Lecture de l’uid
Tout d’abord, il est important de savoir que seul un numéro de série est lu par beaucoup de lecteurs de cartes pour le contrôle d’accès. Ceci n’est absolument pas sécurisé et il est possible d’acheter des cartes (sur le marché chinois) permettant de copier ces badges en utilisant le programme d’exemple nfc-mfsetuid disponible dans le dossier exemple. D’ailleurs, les serruriers ne font qu’une simple copie de votre badge vers un nouveau avant de le verrouiller en écriture.
Il serait tout a fait possible de réaliser un protocole sécurisé mais pour cela, il faudrait des badges équipés de capacité cryptographique et donc plus chers. Les badge d’entrée les plus fréquemment utilisés sont des badges Mifare qui ne coûtent vraiment pas grand chose : MIFARE 4K NXP blanche haute qualité Par 5000 = 0.90 € unitaire trouvé sur google.
Nous allons faire comme eux et simplement lire l’uid. Nous ne prétendrons cependant pas que ce soit sécurisé. Pour cela allons dans le dossier exemples/ et lançons le programme suivant :
Et voilà vous venez de lire l’UID de votre badge !
Code C
Nous allons maintenant repartir du programme nfc-poll afin de le personnaliser et de le réutiliser dans notre application. Toujours dans le dossier exemple :
mkdir badgeReader/utils/
cp nfc-poll.c badgeReader/badgeReader.c
cp ../utils/nfc-utils.h examples/badgeReader/utils/
cp ../utils/nfc-utils.c examples/badgeReader/utils/
cd badgeReader/
gcc badgeReader.c utils/nfc-utils.c -lnfc -o myBadgeReader.o
sudo ./myBadgeReader
Félicitation, vous venez de compiler votre première application avec libnfc. Je vous conseille de garder ce squelette de coté, il constitue une bonne base pour commencer avec le NFC.
Vérifier l’UID
Bien, pour l’instant, nous ne faisions que d’afficher l’UID en réutilisant les programmes déjà présents. nous allons maintenant le récupérer et le comparer afin de vérifier si la personne est autorisée à entrer ou non.
Copier le squelette précédemment construit et remplacer le fichier badgeReader.c par celui écrit ci dessous :
/**
* @file badgeReader.c
* @brief read a badge and print a message if the badge is the one attended
*/
#include <err.h>
#include <signal.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <nfc/nfc.h>
#include <nfc/nfc-types.h>
#include "utils/nfc-utils.h"
static nfc_device *pnd = NULL;
int main(int argc, const char *argv[])
{
const unsigned char referenceUID[7] ={0x04, 0x3c, 0x76, 0x7a, 0xa6, 0x27, 0x80};
const unsigned char referenceUIDsz = 7;
const unsigned char uiPollNr = 20;
const unsigned char uiPeriod = 2;
/* Defines the modulation types
* for the mifare types, only the type A is requested */
const nfc_modulation nmModulations[1] = {
{ .nmt = NMT_ISO14443A, .nbr = NBR_106 },
};
int i;
const size_t szModulations = 1;
nfc_target nt;
int res = 0;
nfc_context *context;
nfc_init(&context);
/* We open the pn53x */
pnd = nfc_open(context, NULL);
if (pnd == NULL) {
ERR("%s", "Unable to open NFC device.");
exit(EXIT_FAILURE);
}
if (nfc_initiator_init(pnd) < 0) {
nfc_perror(pnd, "nfc_initiator_init");
exit(EXIT_FAILURE);
}
if ((res = nfc_initiator_poll_target(pnd, nmModulations, szModulations, uiPollNr, uiPeriod, &nt)) < 0) {
nfc_perror(pnd, "nfc_initiator_poll_target");
nfc_close(pnd);
nfc_exit(context);
exit(EXIT_FAILURE);
}
if (res > 0) {
printf("Read UID : ");
print_hex(nt.nti.nai.abtUid, nt.nti.nai.szUidLen);
printf("Expected UID : ");
print_hex(referenceUID, referenceUIDsz);
} else {
printf("No target found.\n");
}
nfc_close(pnd);
nfc_exit(context);
exit(EXIT_SUCCESS);
}
Vous pouvez maintenant comparer vos deux UID dans un programme.
Conclusion
Pourquoi ne pas ajouter un module comme celui ci à votre raspberry pi et continuer les développement vers quelques chose de plus sécurisé avec l’ajout d’un code PIN par exemple.
It’s oversimple, isn’t it?
http://oversimple.fr/category/monetique/nfc/