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.
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.
Fügen Sie zuerst nfcpy ein. Ohne das geht es nicht.
sudo pip install --upgrade pip
// Pip aktualisieren
sudo pip install nfcpy
// Installiere nfcpy
Wenn nfcpy in pip show nfcpy
erscheint, ist die Installation erfolgreich.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.
Nach Abschluss der oben genannten Vorbereitungen schreibe ich ein Programm zum Lesen des Studentenausweises.
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.
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".
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.
(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