[PYTHON] Lisez votre numéro d'inscription scolaire à partir de votre carte d'étudiant avec Raspberry Pi

introduction

Dans le laboratoire de l'université à laquelle j'appartiens, le système a été construit à l'origine en annonçant le fait que la porte de la salle était déverrouillée et fermée par l'ancêtre de Slack en appuyant sur le bouton Amazon Dash. Cependant, la notification n'a pas volé dès que le bouton interne a atteint la fin de sa vie cette année. J'ai eu l'idée de renouveler le bouton ou de changer la batterie, mais de toute façon, si je peux vérifier l'état d'occupation en utilisant non seulement la porte de la chambre mais aussi la carte d'étudiant comme un développement de ceux-ci dans ma recherche de fin d'études, la batterie est morte Le système ne s'arrêtera pas de fonctionner et je pense que la vérification du statut d'occupation facilitera la gestion des clés, je vais donc collaborer avec mes amis pour vérifier l'état d'occupation du laboratoire dans le cadre de mes recherches de fin d'études. Parmi les systèmes, je serai en charge du système de "lecture du numéro d'identification étudiant sur la carte d'identité étudiant". Je le laisserai dans l'article sous forme de mémorandum. Même ainsi, les précédents (Université de Shizuoka et Université Aizu 02 / nfcpy% E3% 82% 92% E4% BD% BF% E3% 81% A3% E3% 81% A6% E5% AD% A6% E7% 94% 9F% E8% A8% BC% E3% 81% 8B% E3% 82% 89% E5% AD% A6% E7% B1% 8D% E7% 95% AA% E5% 8F% B7% E3% 82% 92% E8% AA% AD% E3% 81% BF% Puisqu'il existe un exemple de E5% 8F% 96% E3% 82% 8B), nous l'avons construit sur cette base.)

Je suis un amateur complet en ce qui concerne Python. Dans le cadre du séminaire, je l'ai fait passer du GPIO au LED ou au commutateur tactile.

environnement

--Server (Raspberry Pi cette fois)

Construire

Depuis que j'ai reçu Raspberry Pi 4 en tant que serveur du côté laboratoire cette fois, j'ai cherché une bibliothèque pour divers lecteurs de cartes NFC avec Python, et comme tous les articles utilisent nfcpy (il n'y a pas d'autre choix) nfcpy J'ai décidé de le déplacer de différentes manières. Dans la plupart des cas, le PaSoRi de Sony a été utilisé comme lecteur de carte, je l'ai donc acheté seul pour la recherche.

Documentation officielle nfcpy

La construction a commencé en juillet car l'heure de début était très différente en raison d'un nouveau virus. À ce stade, il n'y avait aucun exemple d'utilisation de Raspberry Pi 4, mais le résultat était réussi.

Lié au conducteur

  1. Insérez nfcpy

Tout d'abord, insérez nfcpy. Cela ne commencera pas sans cela.

  1. Reconnaître PaSoRi

Cet article a été remplacé par Référence Vous devriez obtenir une erreur lorsque vous tapez python -m nfc. Tapez la commande suivante (longue) sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules' Selon l'article, port100 fait quelque chose de mal. sudo udevadm control -R sudo modprobe -r port100 sudo sh -c 'echo blacklist port100 >> /etc/modprobe.d/blacklist-nfc.conf' Cela empêchera le port100 de démarrer. Vous pouvez reconnaître PaSoRi en tapant python -m nfc.

Vous êtes maintenant prêt à lire le lecteur de carte NFC.

Lecture des données d'identification de l'étudiant

Après avoir terminé les préparatifs ci-dessus, je vais écrire un programme pour lire la carte d'étudiant.

Vider les données stockées dans votre carte d'étudiant

Les cartes NFC telles que les cartes d'étudiant ne stockent pas les données telles quelles (naturellement), il est donc nécessaire de savoir dans quelle zone se trouvent les données cibles. Bien que la cible soit différente, il y avait un pionnier qui a écrit un programme qui vidage de la même manière, voici donc le code Je l'ai utilisé pour vider ma carte d'étudiant. Les données extraites sont les suivantes, mais comme cela peut conduire à mes informations personnelles en tant qu'auteur, j'omettrai la partie autre que la partie du numéro d'inscription scolaire qui est au cœur de cette période.


Type3Tag 'FeliCa Standard (RC-SA00/1)' ID=0116040086180701 PMM=033242828247AAFF SYS=809E
  System 809E (unknown)
  Area 0000--FFFE
    Area 1000--10FF
      Random Service 64: write with key & read w/o key (0x1008 0x100B)
      Area 2000--20FF
      Random Service 128: write with key & read w/o key (0x2008 0x200B)
       0000: XX XX XX XX 32 31 31 35 00 00 00 00 00 00 00 00 |*XXX2115........|
      Area 3000--30FF
      Random Service 192: write with key & read w/o key (0x3008 0x300B)
      Area 4000--40FF
      Random Service 256: write with key & read w/o key (0x4008 0x400B)
  System FE00 (Common Area)
  Area 0000--FFFE
    Area 1A80--1AFF
      Area 1A81--1AFF
        Random Service 106: write with key & read w/o key (0x1A88 0x1A8B)

À partir des résultats ci-dessus, il a été constaté que notre université le stockait sous forme de code ASCII dans le code de service 0x200B du code système: 0x809E (Si vous indiquez le numéro d'enregistrement de l'école tel quel, cela entraînera des blessures, donc les 4 premiers caractères sont masqués. Par conséquent, lorsque vous lisez la carte NFC, vous pouvez obtenir le numéro d'inscription de l'école en lisant ces codes de bloc et en les extrayant.

Lire NFC

Vous trouverez ci-dessous un programme qui lit le numéro d'inscription de l'école à l'aide de nfcpy.

read_nfc.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import binascii
import nfc

#Code de service qui stocke le numéro d'inscription étudiant de notre carte d'étudiant
service_code = 0x200B

def connected(tag):

    if isinstance(tag, nfc.tag.tt3.Type3Tag):
        try:
            #Service 16 bits_code au service>>Extraire les 10 bits supérieurs avec 6 et service_code &&Extraire les 6 bits inférieurs avec 0x3f
            svcd = nfc.tag.tt3.ServiceCode(service_code >> 6, service_code & 0x3f)
            #le service est lu_without_service d'argument de chiffrement_Index dans la liste
            blcd = nfc.tag.tt3.BlockCode(0,service=0)
            #read_without_Lire les données de bloc dans les informations de la partie spécifiée de la balise avec cryptage
            block_data = tag.read_without_encryption([svcd], [blcd])
            #Cette fois, il est stocké dans le 1er au 8ème caractères des données du bloc, il est converti en chaîne de caractères et utf-Décoder à 8
            student_id = str(block_data[0:8].decode("utf-8"))
            print(student_id)
        except Exception as e:
            print("Error:%s" % e)
    else:
        print("Error:tag isn't Type3Tag")
    
    #Si la valeur est renvoyée comme True, elle ne sera traitée qu'une seule fois jusqu'à ce qu'elle soit touchée et relâchée.
    return True

clf = nfc.ContactlessFrontend('usb')

def main():
    while True:
        #Attendez de lire votre carte d'étudiant
        clf.connect(rdwr={'on-connect': connected,})

try:
    main()
except KeyboardInterrupt:
    print("Forced termination")
    clf.close()
    sys.exit(0)

Pour être honnête, je ne peux pas faire grand-chose comme un commentaire faute de compétences, mais c'est un mémorandum, donc une note personnelle. Référence

Tout d'abord, clf = nfc.ContactlessFrontend ('usb') signifie ouvrir un lecteur NFC avec une connexion USB, qui n'est qu'une déclaration d'utilisation de PaSoRi. Démarrez le lecteur de carte NFC avec clf.connect et attendez que le contact NFC soit effectué. Parmi les arguments de connexion, il y a des rappels tels que le démarrage au démarrage, la connexion au toucher et la libération lorsque la carte est libérée. En spécifiant une fonction de rappel pour chacun, le comportement peut être modifié par l'action. Cette fois, spécifiez la fonction connectée (tag) pour on-connect. La balise qui représente l'objet de cette balise est passée dans le connecté qui est appelé lorsque la carte est mise en contact avec le lecteur. Après cela, la balise est utilisée pour communiquer avec la balise NFC.

Le code de service NFC lui-même est une valeur de 16 bits, les 10 bits supérieurs étant le numéro de service et les 6 bits inférieurs étant la valeur d'attribut. Dans ce cas, puisque le code de service à examiner a déjà été obtenu (0x200B), il y a de fortes chances que cela fonctionne même s'il n'est pas placé dans la variable honnête, et il semble que cela ne prendra pas de mémoire supplémentaire, mais lors de l'utilisation de plusieurs codes de service Je pense qu'il sera plus efficace de vérifier à l'aide d'un tableau. nfc.tag.tt3.ServiceCode (service_code >> 6, service_code & 0x3f) est un moyen de créer un objet ServiceCode à partir d'un service d'entiers 16 bits. Extrayez les 10 bits supérieurs avec service_code >> 6. Extrayez les 6 bits inférieurs avec service_code & 0x3f.

Ensuite, je vais lire le bloc de données, mais le document de read_without_encryption Selon, service = 0 passé lors de la génération du Blockcode n'est pas le code de service lui-même, mais l'index dans l'argument service_list de l'argument de read_without_encryption. Chaque service a un bloc d'une taille de 16 octets et les numéros de série sont attribués à partir de 0 dans le service. Dans ce cas, il est du 0 au 7, mais si vous définissez student_id = str (block_data [0: 8] .decode (" utf-8 ")) ici, les dernières données seront Soyez prudent car il sera coupé. En ce qui concerne le code des caractères, je pense que cela dépend du système d'exploitation utilisé dans le système, mais notre identifiant d'étudiant est Shift_JIS (~~ Je veux que vous périssiez ~~), et il y a trop d'inconvénients pour les systèmes Linux tels que Raspberry OS. Fondamentalement, il est sûr de décoder en utf-8.

Enfin, si la valeur de retour de connected est définie sur «True», le processus ne sera effectué qu'une seule fois jusqu'à ce que la carte soit touchée et relâchée. Au contraire, s'il est "False", le processus de lecture se produira plusieurs fois, donc ce ne sera pas pratique pour ce système, alors définissons-le correctement sur "True".

finalement

Cette fois, je suis parti d'un état où je ne savais pas grand chose sur Python, j'ai donc écrit le programme avec une grande référence à l'article source, mais cela fonctionne de manière inattendue. Puisqu'il est encore au stade du prototype, nous apporterons diverses améliorations afin qu'il puisse être annoncé comme une recherche de fin d'études.

Postscript

(2020/10/16 19:36) J'ai reçu un rapport indiquant qu'il y avait une partie où j'avais oublié de cacher les données de bloc, alors je l'ai reflété.

Recommended Posts

Lisez votre numéro d'inscription scolaire à partir de votre carte d'étudiant avec Raspberry Pi
Sortie du Raspberry Pi vers la ligne
Comment utiliser Raspeye Pie Camera Python
Connectez votre Raspberry Pi à votre smartphone en utilisant Blynk
De la configuration du Raspberry Pi à l'installation de l'environnement Python
Comment utiliser Raspeye Relay Module Python
Comment obtenir la température du thermo-hygromètre SwitchBot à l'aide de Raspberry Pi
J'ai parlé à Raspberry Pi
Présentation de PyMySQL à Raspberry pi3
Utilisez NeoPixel avec la tarte aux framboises
À propos de l'erreur que j'ai rencontrée en essayant d'utiliser Adafruit_DHT à partir de Python sur Raspberry Pi
Accédons à votre tarte à la râpe domestique depuis l'extérieur de votre maison avec VPN (WireGuard)
Comment utiliser la reconnaissance visuelle pour obtenir l'ID de ligne d'une fille
Utilisez python sur Raspberry Pi 3 pour éclairer la LED (Hello World)
Remarques sur la connexion Bluetooth d'un smartphone / PC à Raspeye 4
J'ai fait un package npm pour obtenir l'ID de la carte IC avec Raspberry Pi et PaSoRi
Portez FreeRTOS vers Raspberry Pi 4B
Utilisez vl53l0x avec RaspberryPi (python)
Comment utiliser SWIG de WAF
Lire et utiliser des fichiers Python à partir de Python
[Raspberry Pi] Changement par défaut de Python en Python3
Utilisez le capteur de température / humidité / pression BME280 de Python avec Raspberry Pi 2
Un mémo pour utiliser simplement le capteur d'éclairement TSL2561 avec Raspberry Pi 2
Utilisez Rasppie pour résoudre le problème de connexion Wi-Fi mobile insuffisante
Utilisez python sur Raspberry Pi 3 pour éclairer la LED avec le contrôle du commutateur!
Rendre possible la lecture de .eml depuis un smartphone à l'aide d'un bot Discord