Fixed authentication, added examples, proper class without code in the end
This commit is contained in:
parent
5efb3a7bbd
commit
fcf94d7551
5 changed files with 254 additions and 58 deletions
49
Dump.py
Executable file
49
Dump.py
Executable file
|
@ -0,0 +1,49 @@
|
||||||
|
import RPi.GPIO as GPIO
|
||||||
|
import MFRC522
|
||||||
|
import signal
|
||||||
|
|
||||||
|
continue_reading = True
|
||||||
|
|
||||||
|
# Capture SIGINT for cleanup when the script is aborted
|
||||||
|
def end_read(signal,frame):
|
||||||
|
global continue_reading
|
||||||
|
print "Ctrl+C captured, ending read."
|
||||||
|
continue_reading = False
|
||||||
|
GPIO.cleanup()
|
||||||
|
|
||||||
|
# Hook the SIGINT
|
||||||
|
signal.signal(signal.SIGINT, end_read)
|
||||||
|
|
||||||
|
# Create an object of the class MFRC522
|
||||||
|
MIFAREReader = MFRC522.MFRC522()
|
||||||
|
|
||||||
|
# This loop keeps checking for chips. If one is near it will get the UID and authenticate
|
||||||
|
while continue_reading:
|
||||||
|
|
||||||
|
# Scan for cards
|
||||||
|
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
|
||||||
|
|
||||||
|
# If a card is found
|
||||||
|
if status == MIFAREReader.MI_OK:
|
||||||
|
print "Card detected"
|
||||||
|
|
||||||
|
# Get the UID of the card
|
||||||
|
(status,uid) = MIFAREReader.MFRC522_Anticoll()
|
||||||
|
|
||||||
|
# If we have the UID, continue
|
||||||
|
if status == MIFAREReader.MI_OK:
|
||||||
|
|
||||||
|
# Print UID
|
||||||
|
print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])
|
||||||
|
|
||||||
|
# This is the default key for authentication
|
||||||
|
key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
|
||||||
|
|
||||||
|
# Select the scanned tag
|
||||||
|
MIFAREReader.MFRC522_SelectTag(uid)
|
||||||
|
|
||||||
|
# Dump the data
|
||||||
|
MIFAREReader.MFRC522_DumpClassic1K(key, uid)
|
||||||
|
|
||||||
|
# Stop
|
||||||
|
MIFAREReader.MFRC522_StopCrypto1()
|
66
MFRC522.py
Normal file → Executable file
66
MFRC522.py
Normal file → Executable file
|
@ -1,6 +1,7 @@
|
||||||
import RPi.GPIO as GPIO
|
import RPi.GPIO as GPIO
|
||||||
import spi
|
import spi
|
||||||
import signal
|
import signal
|
||||||
|
import time
|
||||||
|
|
||||||
class MFRC522:
|
class MFRC522:
|
||||||
NRSTPD = 22
|
NRSTPD = 22
|
||||||
|
@ -290,24 +291,40 @@ class MFRC522:
|
||||||
|
|
||||||
def MFRC522_Auth(self, authMode, BlockAddr, Sectorkey, serNum):
|
def MFRC522_Auth(self, authMode, BlockAddr, Sectorkey, serNum):
|
||||||
buff = []
|
buff = []
|
||||||
|
|
||||||
|
# First byte should be the authMode (A or B)
|
||||||
buff.append(authMode)
|
buff.append(authMode)
|
||||||
|
|
||||||
|
# Second byte is the trailerBlock (usually 7)
|
||||||
buff.append(BlockAddr)
|
buff.append(BlockAddr)
|
||||||
|
|
||||||
|
# Now we need to append the authKey which usually is 6 bytes of 0xFF
|
||||||
i = 0
|
i = 0
|
||||||
while(i < len(Sectorkey)):
|
while(i < len(Sectorkey)):
|
||||||
buff.append(Sectorkey[i])
|
buff.append(Sectorkey[i])
|
||||||
i = i + 1
|
i = i + 1
|
||||||
i = 0
|
i = 0
|
||||||
while(i < len(serNum)):
|
|
||||||
|
# Next we append the first 4 bytes of the UID
|
||||||
|
while(i < 4):
|
||||||
buff.append(serNum[i])
|
buff.append(serNum[i])
|
||||||
i = i +1
|
i = i +1
|
||||||
|
|
||||||
|
# Now we start the authentication itself
|
||||||
(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT,buff)
|
(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_AUTHENT,buff)
|
||||||
|
|
||||||
|
# Check if an error occurred
|
||||||
if not(status == self.MI_OK):
|
if not(status == self.MI_OK):
|
||||||
print "AUTH ERROR!!"
|
print "AUTH ERROR!!"
|
||||||
if not (self.Read_MFRC522(self.Status2Reg) & 0x08) != 0:
|
if not (self.Read_MFRC522(self.Status2Reg) & 0x08) != 0:
|
||||||
print "AUTH ERROR(status2reg & 0x08) != 0"
|
print "AUTH ERROR(status2reg & 0x08) != 0"
|
||||||
|
|
||||||
|
# Return the status
|
||||||
return status
|
return status
|
||||||
|
|
||||||
|
def MFRC522_StopCrypto1(self):
|
||||||
|
self.ClearBitMask(self.Status2Reg, 0x08)
|
||||||
|
|
||||||
def MFRC522_Read(self, blockAddr):
|
def MFRC522_Read(self, blockAddr):
|
||||||
recvData = []
|
recvData = []
|
||||||
recvData.append(self.PICC_READ)
|
recvData.append(self.PICC_READ)
|
||||||
|
@ -318,8 +335,6 @@ class MFRC522:
|
||||||
(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, recvData)
|
(status, backData, backLen) = self.MFRC522_ToCard(self.PCD_TRANSCEIVE, recvData)
|
||||||
if not(status == self.MI_OK):
|
if not(status == self.MI_OK):
|
||||||
print "Error while reading!"
|
print "Error while reading!"
|
||||||
|
|
||||||
print "Got data size: "+str(backLen)
|
|
||||||
i = 0
|
i = 0
|
||||||
if len(backData) == 16:
|
if len(backData) == 16:
|
||||||
print "Sector "+str(blockAddr)+" "+str(backData)
|
print "Sector "+str(blockAddr)+" "+str(backData)
|
||||||
|
@ -349,8 +364,18 @@ class MFRC522:
|
||||||
if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A):
|
if not(status == self.MI_OK) or not(backLen == 4) or not((backData[0] & 0x0F) == 0x0A):
|
||||||
print "Error while writing"
|
print "Error while writing"
|
||||||
if status == self.MI_OK:
|
if status == self.MI_OK:
|
||||||
print "Data writen"
|
print "Data written"
|
||||||
|
|
||||||
|
def MFRC522_DumpClassic1K(self, key, uid):
|
||||||
|
i = 0
|
||||||
|
while i < 64:
|
||||||
|
status = self.MFRC522_Auth(self.PICC_AUTHENT1A, i, key, uid)
|
||||||
|
# Check if authenticated
|
||||||
|
if status == self.MI_OK:
|
||||||
|
self.MFRC522_Read(i)
|
||||||
|
else:
|
||||||
|
print "Authentication error"
|
||||||
|
i = i+1
|
||||||
|
|
||||||
def MFRC522_Init(self):
|
def MFRC522_Init(self):
|
||||||
GPIO.output(self.NRSTPD, 1)
|
GPIO.output(self.NRSTPD, 1)
|
||||||
|
@ -366,36 +391,3 @@ class MFRC522:
|
||||||
self.Write_MFRC522(self.TxAutoReg, 0x40)
|
self.Write_MFRC522(self.TxAutoReg, 0x40)
|
||||||
self.Write_MFRC522(self.ModeReg, 0x3D)
|
self.Write_MFRC522(self.ModeReg, 0x3D)
|
||||||
self.AntennaOn()
|
self.AntennaOn()
|
||||||
|
|
||||||
continue_reading = True
|
|
||||||
# Capture SIGINT
|
|
||||||
def end_read(signal,frame):
|
|
||||||
global continue_reading
|
|
||||||
print "Ctrl+C captured, ending read."
|
|
||||||
continue_reading = False
|
|
||||||
GPIO.cleanup() # Suggested by Marjan Trutschl
|
|
||||||
|
|
||||||
signal.signal(signal.SIGINT, end_read)
|
|
||||||
|
|
||||||
MIFAREReader = MFRC522()
|
|
||||||
|
|
||||||
while continue_reading:
|
|
||||||
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
|
|
||||||
|
|
||||||
if status == MIFAREReader.MI_OK:
|
|
||||||
print "Card detected"
|
|
||||||
|
|
||||||
(status,backData) = MIFAREReader.MFRC522_Anticoll()
|
|
||||||
if status == MIFAREReader.MI_OK:
|
|
||||||
print "Card read UID: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4])
|
|
||||||
|
|
||||||
key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
|
|
||||||
|
|
||||||
MIFAREReader.MFRC522_SelectTag(backData)
|
|
||||||
|
|
||||||
status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 11, key, backData)
|
|
||||||
if status == MIFAREReader.MI_OK:
|
|
||||||
print "AUTH OK"
|
|
||||||
else:
|
|
||||||
print "AUTH ERROR"
|
|
||||||
|
|
||||||
|
|
31
README.md
31
README.md
|
@ -5,21 +5,26 @@ A small class to interface with the NFC reader Module MFRC522 on the Raspberry P
|
||||||
|
|
||||||
This is a Python port of the example code for the NFC module MF522-AN.
|
This is a Python port of the example code for the NFC module MF522-AN.
|
||||||
|
|
||||||
Pre Requisites
|
##Requirements
|
||||||
==============
|
This code requires you to have SPI-Py installed from the following repository:
|
||||||
|
|
||||||
You will need to install SPI-Py from lthiery from the following address:
|
|
||||||
|
|
||||||
https://github.com/lthiery/SPI-Py
|
https://github.com/lthiery/SPI-Py
|
||||||
|
|
||||||
More Info
|
##Examples
|
||||||
==============
|
This repository includes a couple of examples showing how to read, write, and dump data from a chip. They are thoroughly commented, and should be easy to understand.
|
||||||
|
|
||||||
For more information visit: http://fuenteabierta.teubi.co/
|
## Pins
|
||||||
|
You can use [this](http://i.imgur.com/y7Fnvhq.png) image for reference.
|
||||||
|
|
||||||
Usage
|
| Name | Pin # | Pin name |
|
||||||
==============
|
|------|-------|------------|
|
||||||
|
| SDA | 24 | GPIO8 |
|
||||||
|
| SCK | 23 | GPIO11 |
|
||||||
|
| MOSI | 19 | GPIO10 |
|
||||||
|
| MISO | 21 | GPIO9 |
|
||||||
|
| IRQ | None | None |
|
||||||
|
| GND | Any | Any Ground |
|
||||||
|
| RST | 22 | GPIO25 |
|
||||||
|
| 3.3V | 1 | 3V3 |
|
||||||
|
|
||||||
Just run the following command:
|
##Usage
|
||||||
|
Import the class by importing MFRC522 in the top of your script. For more info see the examples.
|
||||||
sudo python MFRC522.py
|
|
||||||
|
|
56
Read.py
Executable file
56
Read.py
Executable file
|
@ -0,0 +1,56 @@
|
||||||
|
import RPi.GPIO as GPIO
|
||||||
|
import MFRC522
|
||||||
|
import signal
|
||||||
|
|
||||||
|
continue_reading = True
|
||||||
|
|
||||||
|
# Capture SIGINT for cleanup when the script is aborted
|
||||||
|
def end_read(signal,frame):
|
||||||
|
global continue_reading
|
||||||
|
print "Ctrl+C captured, ending read."
|
||||||
|
continue_reading = False
|
||||||
|
GPIO.cleanup()
|
||||||
|
|
||||||
|
# Hook the SIGINT
|
||||||
|
signal.signal(signal.SIGINT, end_read)
|
||||||
|
|
||||||
|
# Create an object of the class MFRC522
|
||||||
|
MIFAREReader = MFRC522.MFRC522()
|
||||||
|
|
||||||
|
# This loop keeps checking for chips. If one is near it will get the UID and authenticate
|
||||||
|
while continue_reading:
|
||||||
|
|
||||||
|
# Scan for cards
|
||||||
|
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
|
||||||
|
|
||||||
|
# If a card is found
|
||||||
|
if status == MIFAREReader.MI_OK:
|
||||||
|
print "Card detected"
|
||||||
|
|
||||||
|
# Get the UID of the card
|
||||||
|
(status,uid) = MIFAREReader.MFRC522_Anticoll()
|
||||||
|
|
||||||
|
# If we have the UID, continue
|
||||||
|
if status == MIFAREReader.MI_OK:
|
||||||
|
|
||||||
|
# Print UID
|
||||||
|
print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])
|
||||||
|
|
||||||
|
# This is the default key for authentication
|
||||||
|
key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
|
||||||
|
|
||||||
|
# Select the scanned tag
|
||||||
|
MIFAREReader.MFRC522_SelectTag(uid)
|
||||||
|
|
||||||
|
# Authenticate
|
||||||
|
status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)
|
||||||
|
|
||||||
|
# Check if authenticated
|
||||||
|
if status == MIFAREReader.MI_OK:
|
||||||
|
MIFAREReader.MFRC522_Read(8)
|
||||||
|
MIFAREReader.MFRC522_StopCrypto1()
|
||||||
|
else:
|
||||||
|
print "Authentication error"
|
||||||
|
|
||||||
|
# Make sure to stop scanning for cards
|
||||||
|
continue_reading = false
|
94
Write.py
Executable file
94
Write.py
Executable file
|
@ -0,0 +1,94 @@
|
||||||
|
import RPi.GPIO as GPIO
|
||||||
|
import MFRC522
|
||||||
|
import signal
|
||||||
|
|
||||||
|
continue_reading = True
|
||||||
|
|
||||||
|
# Capture SIGINT for cleanup when the script is aborted
|
||||||
|
def end_read(signal,frame):
|
||||||
|
global continue_reading
|
||||||
|
print "Ctrl+C captured, ending read."
|
||||||
|
continue_reading = False
|
||||||
|
GPIO.cleanup()
|
||||||
|
|
||||||
|
# Hook the SIGINT
|
||||||
|
signal.signal(signal.SIGINT, end_read)
|
||||||
|
|
||||||
|
# Create an object of the class MFRC522
|
||||||
|
MIFAREReader = MFRC522.MFRC522()
|
||||||
|
|
||||||
|
# This loop keeps checking for chips. If one is near it will get the UID and authenticate
|
||||||
|
while continue_reading:
|
||||||
|
|
||||||
|
# Scan for cards
|
||||||
|
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
|
||||||
|
|
||||||
|
# If a card is found
|
||||||
|
if status == MIFAREReader.MI_OK:
|
||||||
|
print "Card detected"
|
||||||
|
|
||||||
|
# Get the UID of the card
|
||||||
|
(status,uid) = MIFAREReader.MFRC522_Anticoll()
|
||||||
|
|
||||||
|
# If we have the UID, continue
|
||||||
|
if status == MIFAREReader.MI_OK:
|
||||||
|
|
||||||
|
# Print UID
|
||||||
|
print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])
|
||||||
|
|
||||||
|
# This is the default key for authentication
|
||||||
|
key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
|
||||||
|
|
||||||
|
# Select the scanned tag
|
||||||
|
MIFAREReader.MFRC522_SelectTag(uid)
|
||||||
|
|
||||||
|
# Authenticate
|
||||||
|
status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)
|
||||||
|
print "\n"
|
||||||
|
|
||||||
|
# Check if authenticated
|
||||||
|
if status == MIFAREReader.MI_OK:
|
||||||
|
|
||||||
|
# Variable for the data to write
|
||||||
|
data = []
|
||||||
|
|
||||||
|
# Fill the data with 0xFF
|
||||||
|
for x in range(0,16):
|
||||||
|
data.append(0xFF)
|
||||||
|
|
||||||
|
print "Sector 8 looked like this:"
|
||||||
|
# Read block 8
|
||||||
|
MIFAREReader.MFRC522_Read(8)
|
||||||
|
print "\n"
|
||||||
|
|
||||||
|
print "Sector 8 will now be filled with 0xFF:"
|
||||||
|
# Write the data
|
||||||
|
MIFAREReader.MFRC522_Write(8, data)
|
||||||
|
print "\n"
|
||||||
|
|
||||||
|
print "It now looks like this:"
|
||||||
|
# Check to see if it was written
|
||||||
|
MIFAREReader.MFRC522_Read(8)
|
||||||
|
print "\n"
|
||||||
|
|
||||||
|
data = []
|
||||||
|
# Fill the data with 0x00
|
||||||
|
for x in range(0,16):
|
||||||
|
data.append(0x00)
|
||||||
|
|
||||||
|
print "Now we fill it with 0x00:"
|
||||||
|
MIFAREReader.MFRC522_Write(8, data)
|
||||||
|
print "\n"
|
||||||
|
|
||||||
|
print "It is now empty:"
|
||||||
|
# Check to see if it was written
|
||||||
|
MIFAREReader.MFRC522_Read(8)
|
||||||
|
print "\n"
|
||||||
|
|
||||||
|
# Stop
|
||||||
|
MIFAREReader.MFRC522_StopCrypto1()
|
||||||
|
|
||||||
|
# Make sure to stop reading for cards
|
||||||
|
continue_reading = False
|
||||||
|
else:
|
||||||
|
print "Authentication error"
|
Loading…
Reference in a new issue