[PYTHON] Lesen Sie mit Raspberry Pi Ihre Schulregistrierungsnummer aus Ihrem Studentenausweis

Einführung

Im Labor der Universität, der ich angehöre, wurde das System ursprünglich gebaut, indem die Tatsache, dass die Tür des Raums vom Vorfahren von Slack durch Drücken der Amazon Dash-Taste entriegelt und geschlossen wurde, geworfen wurde. Die Benachrichtigung wurde jedoch nicht gesendet, sobald der interne Button in diesem Jahr das Ende seiner Lebensdauer erreicht hatte. Ich hatte die Idee, den Knopf zu erneuern oder die Batterie zu wechseln, aber wenn ich den Belegungsstatus nicht nur anhand der Zimmertür, sondern auch anhand des Studentenausweises überprüfen kann, ist die Batterie leer Das System wird nicht aufhören zu arbeiten, und ich denke, dass die Überprüfung des Belegungsstatus die Verwaltung der Schlüssel erleichtert. Daher werde ich mit meinen Freunden zusammenarbeiten, um den Belegungsstatus im Labor im Rahmen meiner Abschlussforschung zu überprüfen. Von den Systemen werde ich für das System verantwortlich sein, das "die Studentenausweisnummer vom Studentenausweis liest". Ich werde es im Artikel als Memorandum belassen. Präzedenzfälle (Shizuoka University und Aizu University 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% Da es ein Beispiel für E5% 8F% 96% E3% 82% 8B) gibt, haben wir es darauf aufgebaut.)

Ich bin ein absoluter Amateur, wenn es um Python geht. Im Rahmen des Seminars habe ich es von GPIO auf LED oder Taktschalter umgestellt.

Umgebung

Bauen

Da mir diesmal Raspberry Pi 4 als Server von der Laborseite zur Verfügung gestellt wurde, suchte ich mit Python nach einer Bibliothek für verschiedene NFC-Kartenleser, und da alle Artikel nfcpy (es gibt keine andere Wahl) nfcpy verwenden Ich beschloss, es auf verschiedene Arten zu bewegen. In den meisten Fällen wurde Sonys PaSoRi als Kartenleser verwendet, daher habe ich es für Forschungszwecke selbst gekauft.

Offizielle nfcpy-Dokumentation

Die Bauarbeiten begannen im Juli, da die Startzeit aufgrund eines neuen Virus erheblich unterschiedlich war. Zu diesem Zeitpunkt gab es kein Beispiel für die Verwendung von Raspberry Pi 4, aber das Ergebnis war erfolgreich.

Fahrerbezogen

  1. Fügen Sie nfcpy ein

Fügen Sie zuerst nfcpy ein. Ohne das geht es nicht.

  1. Erkennen Sie PaSoRi

Dieser Artikel wurde in [Referenz] geändert (http://madahiru.blog81.fc2.com/blog-entry-751.html). Sie sollten eine Fehlermeldung erhalten, wenn Sie "python -m nfc" eingeben. Geben Sie den folgenden Befehl ein (lang) sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules' Laut dem Artikel macht port100 etwas falsch. sudo udevadm control -R sudo modprobe -r port100 sudo sh -c 'echo blacklist port100 >> /etc/modprobe.d/blacklist-nfc.conf' Dadurch wird verhindert, dass Port100 gestartet wird. Sie können PaSoRi erkennen, indem Sie "python -m nfc" eingeben.

Jetzt können Sie den NFC-Kartenleser lesen.

Lesen der Daten des Studentenausweises

Nach Abschluss der oben genannten Vorbereitungen schreibe ich ein Programm zum Lesen des Studentenausweises.

Speichern Sie die in Ihrem Studentenausweis gespeicherten Daten

NFC-Karten wie Studentenausweise speichern die Daten nicht so, wie sie sind (natürlich), daher muss herausgefunden werden, in welchem Bereich sich die Zieldaten befinden. Obwohl das Ziel anders ist, gab es einen Pionier, der ein Programm geschrieben hat, das auf die gleiche Weise Dumps erstellt. Hier ist also der Code Ich habe damit meinen Studentenausweis abgeladen. Die extrahierten Daten lauten wie folgt, aber da dies zu meinen persönlichen Daten als Autor führen kann, werde ich den anderen Teil als den Teil der Schulregistrierungsnummer weglassen, der den Kern dieser Zeit bildet.


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)

Bei Betrachtung der obigen Ergebnisse wurde festgestellt, dass unsere Universität diesen als ASCII-Code im Servicecode 0x200B des Systemcodes 0x809E speichert. Wenn Sie die NFC-Karte lesen, können Sie daher die Schulregistrierungsnummer erhalten, indem Sie diese Blockcodes vorlesen und extrahieren.

Lesen Sie NFC

Unten finden Sie ein Programm, das die Schulregistrierungsnummer mit nfcpy liest.

read_nfc.py


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

import sys
import binascii
import nfc

#Servicecode, in dem die Studentenregistrierungsnummer unseres Studentenausweises gespeichert ist
service_code = 0x200B

def connected(tag):

    if isinstance(tag, nfc.tag.tt3.Type3Tag):
        try:
            #16-Bit-Dienst_Code zum Service>>Extrahieren Sie die oberen 10 Bits mit 6 und Service_code &&Extrahieren Sie die unteren 6 Bits mit 0x3f
            svcd = nfc.tag.tt3.ServiceCode(service_code >> 6, service_code & 0x3f)
            #Service wird gelesen_without_Verschlüsselungsargumentdienst_Index in Liste
            blcd = nfc.tag.tt3.BlockCode(0,service=0)
            #read_without_Lesen Sie die Blockdaten in den Informationen des angegebenen Teils des Tags mit Verschlüsselung
            block_data = tag.read_without_encryption([svcd], [blcd])
            #Dieses Mal wird es im 1. bis 8. Zeichen der Blockdaten gespeichert, in eine Zeichenfolge und utf konvertiert-Bei 8 dekodieren
            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")
    
    #Wenn der Wert als True zurückgegeben wird, wird er nur einmal verarbeitet, bis er berührt und freigegeben wird.
    return True

clf = nfc.ContactlessFrontend('usb')

def main():
    while True:
        #Warten Sie, bis Sie Ihren Studentenausweis gelesen haben
        clf.connect(rdwr={'on-connect': connected,})

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

Um ehrlich zu sein, kann ich aufgrund mangelnder Fähigkeiten nicht viel mit Kommentaren anfangen, aber es ist ein Memorandum, also eine persönliche Notiz. Referenz

Zunächst bedeutet "clf = nfc.ContactlessFrontend (" usb ")" das Öffnen eines NFC-Lesegeräts mit einer USB-Verbindung. Dies ist lediglich eine Erklärung zur Verwendung von PaSoRi. Starten Sie den NFC-Kartenleser mit clf.connect und warten Sie, bis die NFC-Berührung erfolgt ist. Unter den Argumenten von connect gibt es Rückrufe wie On-Startup beim Start, On-Connect beim Berühren und On-Release beim Freigeben der Karte. Durch Angabe einer Rückruffunktion für jede Funktion kann das Verhalten durch die Aktion geändert werden. Geben Sie dieses Mal die Funktion "Verbunden" (Tag) für "On-Connect" an. In der Verbindung, die aufgerufen wird, wenn die Karte den Leser berührt, wird ein Tag übergeben, das das Objekt dieses Tags darstellt. Danach wird das Tag verwendet, um mit dem NFC-Tag zu kommunizieren.

Der NFC-Dienstcode selbst ist ein 16-Bit-Wert, wobei die oberen 10 Bits die Dienstnummer und die unteren 6 Bits der Attributwert sind. In diesem Fall besteht, da der zu prüfende Servicecode bereits erhalten wurde (0x200B), eine hohe Wahrscheinlichkeit, dass er funktioniert, auch wenn Sie ihn nicht in die ehrliche Variable einfügen, und es scheint, dass Sie keinen zusätzlichen Speicher benötigen, sondern mehrere Servicecodes verwenden Ich denke, es wird effizienter sein, mit einem Array zu überprüfen. nfc.tag.tt3.ServiceCode (service_code >> 6, service_code & 0x3f) ist eine Möglichkeit, ein ServiceCode-Objekt aus einem 16-Bit-Integer-Service zu erstellen. Extrahieren Sie die hohen 10 Bits mit service_code >> 6. Extrahieren Sie die unteren 6 Bits mit service_code & 0x3f.

Als nächstes werde ich den Datenblock lesen, aber das Dokument von read_without_encryption Entsprechend ist "service = 0", das beim Generieren des Blockcodes übergeben wird, nicht der Servicecode selbst, sondern der Index im Argument "service_list" des Arguments "read_without_encryption". Jeder Dienst hat einen Block mit einer Größe von 16 Bytes, und Seriennummern werden im Dienst von 0 zugewiesen. In diesem Fall ist es der 0. bis 7., aber wenn Sie hier "student_id = str (block_data [0: 8] .decode (" utf-8 "))" setzen, sind die letzten Daten Seien Sie vorsichtig, da es abgeschnitten wird. In Bezug auf den Zeichencode denke ich, dass dies vom im System verwendeten Betriebssystem abhängt, aber unsere Studenten-ID lautet Shift_JIS (~~ Ich möchte, dass Sie umkommen ~~), und es gibt zu viele Unannehmlichkeiten für Linux-Systeme wie Raspberry OS. Grundsätzlich ist es sicher, nach utf-8 zu dekodieren.

Wenn der Rückgabewert von verbunden auf "Wahr" gesetzt ist, wird der Vorgang nur einmal ausgeführt, bis die Karte berührt und freigegeben wird. Im Gegenteil, wenn es "Falsch" ist, wird der Vorgang des Lesens viele Male stattfinden, so dass es für dieses System unpraktisch ist. Setzen wir es also richtig auf "Wahr".

Schließlich

Dieses Mal habe ich in einem Zustand angefangen, in dem ich Python kaum kannte, also habe ich das Programm unter Bezugnahme auf den Quellartikel geschrieben, aber es funktioniert unerwartet. Da es sich noch im Prototypenstadium befindet, werden wir verschiedene Verbesserungen vornehmen, damit es als Abschlussforschung angekündigt werden kann.

Nachtrag

(2020/10/16 19:36) Ich erhielt den Bericht, dass es einen Teil gab, in dem ich vergessen hatte, die Blockdaten auszublenden, und dachte darüber nach.

Recommended Posts

Lesen Sie mit Raspberry Pi Ihre Schulregistrierungsnummer aus Ihrem Studentenausweis
Ausgabe von Raspberry Pi an Line
Verwendung von Raspeye Pie Camera Python
Verbinden Sie Ihren Raspberry Pi mit Blynk mit Ihrem Smartphone
Vom Einrichten des Raspberry Pi bis zur Installation der Python-Umgebung
Verwendung von Raspeye Relay Module Python
So erhalten Sie die Temperatur vom SwitchBot-Thermo-Hygrometer mit Himbeer-Pi
Ich habe mit Raspberry Pi gesprochen
Einführung von PyMySQL in Himbeer-Pi3
Verwenden Sie NeoPixel mit Himbeerkuchen
Über den Fehler, den ich beim Versuch, Adafruit_DHT von Python auf Raspberry Pi zu verwenden, festgestellt habe
Lassen Sie uns mit VPN (WireGuard) von außerhalb Ihres Hauses auf Ihren Home Rasp Pie zugreifen.
Verwendung der visuellen Erkennung, um die LINE ID von einem Mädchen zu erhalten
Verwenden Sie Python auf Raspberry Pi 3, um die LED zu beleuchten (Hello World)
Hinweise zum Verbinden von Bluetooth von einem Smartphone / PC mit Raspeye 4
Ich habe ein npm-Paket erstellt, um die ID der IC-Karte mit Raspberry Pi und PaSoRi zu erhalten
Port FreeRTOS auf Raspberry Pi 4B
Verwenden Sie vl53l0x mit RaspberryPi (Python)
Wie man SWIG von waf benutzt
Lesen und verwenden Sie Python-Dateien aus Python
[Raspberry Pi] Python wurde standardmäßig in Python3 geändert
Verwenden Sie den Temperatur- / Feuchtigkeits- / Drucksensor BME280 von Python mit Raspberry Pi 2
Ein Memo zur einfachen Verwendung des Beleuchtungsstärkesensors TSL2561 mit Raspberry Pi 2
Verwenden Sie Rasppie, um das Problem einer unzureichenden mobilen Wi-Fi-Verbindung zu lösen
Verwenden Sie Python auf Raspberry Pi 3, um die LED mit Schaltersteuerung zu beleuchten!
Verwenden Sie Discord Bot, um .eml von Ihrem Smartphone zu lesen