add 7/10 bytes ID

This commit is contained in:
danjperron
2019-09-20 15:16:54 -04:00
parent e910c28ed8
commit 950cdee303
3 changed files with 334 additions and 325 deletions

View File

@@ -1,46 +1,41 @@
import mfrc522 import mfrc522
from os import uname from os import uname
def do_read(): def uidToString(uid):
mystring = ""
if uname()[0] == 'WiPy': for i in uid:
rdr = mfrc522.MFRC522("GP14", "GP16", "GP15", "GP22", "GP17") mystring = "%02X" % i + mystring
elif uname()[0] == 'esp8266': return mystring
rdr = mfrc522.MFRC522(0, 2, 4, 5, 14)
else: def do_read():
raise RuntimeError("Unsupported platform")
if uname()[0] == 'WiPy':
print("") rdr = mfrc522.MFRC522("GP14", "GP16", "GP15", "GP22", "GP17")
print("Place card before reader to read from address 0x08") elif uname()[0] == 'esp32':
print("") rdr = mfrc522.MFRC522(sck=18,mosi=23,miso=19,rst=22,cs=21)
else:
try: raise RuntimeError("Unsupported platform")
while True:
print("")
(stat, tag_type) = rdr.request(rdr.REQIDL) print("Place card before reader to read from address 0x08")
print("")
if stat == rdr.OK:
try:
(stat, raw_uid) = rdr.anticoll() while True:
if stat == rdr.OK: (stat, tag_type) = rdr.request(rdr.REQIDL)
print("New card detected")
print(" - tag type: 0x%02x" % tag_type) if stat == rdr.OK:
print(" - uid : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
print("") (stat, uid) = rdr.SelectTagSN()
if rdr.select_tag(raw_uid) == rdr.OK: if stat == rdr.OK:
print("Card detected %s" % uidToString(uid))
key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] else:
print("Authentication error")
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
print("Address 8 data: %s" % rdr.read(8)) except KeyboardInterrupt:
rdr.stop_crypto1() print("Bye")
else:
print("Authentication error")
else:
print("Failed to select tag")
except KeyboardInterrupt:
print("Bye")

View File

@@ -1,50 +0,0 @@
import mfrc522
from os import uname
def do_write():
if uname()[0] == 'WiPy':
rdr = mfrc522.MFRC522("GP14", "GP16", "GP15", "GP22", "GP17")
elif uname()[0] == 'esp8266':
rdr = mfrc522.MFRC522(0, 2, 4, 5, 14)
else:
raise RuntimeError("Unsupported platform")
print("")
print("Place card before reader to write address 0x08")
print("")
try:
while True:
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
if stat == rdr.OK:
print("New card detected")
print(" - tag type: 0x%02x" % tag_type)
print(" - uid : 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
print("")
if rdr.select_tag(raw_uid) == rdr.OK:
key = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:
stat = rdr.write(8, b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f")
rdr.stop_crypto1()
if stat == rdr.OK:
print("Data written to card")
else:
print("Failed to write data to card")
else:
print("Authentication error")
else:
print("Failed to select tag")
except KeyboardInterrupt:
print("Bye")

View File

@@ -1,229 +1,293 @@
from machine import Pin, SPI from machine import Pin, SPI
from os import uname from os import uname
class MFRC522: class MFRC522:
OK = 0 DEBUG = False
NOTAGERR = 1 OK = 0
ERR = 2 NOTAGERR = 1
ERR = 2
REQIDL = 0x26
REQALL = 0x52 REQIDL = 0x26
AUTHENT1A = 0x60 REQALL = 0x52
AUTHENT1B = 0x61 AUTHENT1A = 0x60
AUTHENT1B = 0x61
def __init__(self, sck, mosi, miso, rst, cs):
PICC_ANTICOLL1 = 0x93
self.sck = Pin(sck, Pin.OUT) PICC_ANTICOLL2 = 0x95
self.mosi = Pin(mosi, Pin.OUT) PICC_ANTICOLL3 = 0x97
self.miso = Pin(miso)
self.rst = Pin(rst, Pin.OUT)
self.cs = Pin(cs, Pin.OUT) def __init__(self, sck, mosi, miso, rst, cs):
self.rst.value(0) self.sck = Pin(sck, Pin.OUT)
self.cs.value(1) self.mosi = Pin(mosi, Pin.OUT)
self.miso = Pin(miso)
board = uname()[0] self.rst = Pin(rst, Pin.OUT)
self.cs = Pin(cs, Pin.OUT)
if board == 'WiPy' or board == 'LoPy' or board == 'FiPy':
self.spi = SPI(0) self.rst.value(0)
self.spi.init(SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso)) self.cs.value(1)
elif board == 'esp8266':
self.spi = SPI(baudrate=100000, polarity=0, phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso) board = uname()[0]
self.spi.init()
else: if board == 'WiPy' or board == 'LoPy' or board == 'FiPy':
raise RuntimeError("Unsupported platform") self.spi = SPI(0)
self.spi.init(SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso))
self.rst.value(1) elif (board == 'esp8266') or (board == 'esp32'):
self.init() self.spi = SPI(baudrate=100000, polarity=0, phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
self.spi.init()
def _wreg(self, reg, val): else:
raise RuntimeError("Unsupported platform")
self.cs.value(0)
self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e))) self.rst.value(1)
self.spi.write(b'%c' % int(0xff & val)) self.init()
self.cs.value(1)
def _wreg(self, reg, val):
def _rreg(self, reg):
self.cs.value(0)
self.cs.value(0) self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))
self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80))) self.spi.write(b'%c' % int(0xff & val))
val = self.spi.read(1) self.cs.value(1)
self.cs.value(1)
def _rreg(self, reg):
return val[0]
self.cs.value(0)
def _sflags(self, reg, mask): self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))
self._wreg(reg, self._rreg(reg) | mask) val = self.spi.read(1)
self.cs.value(1)
def _cflags(self, reg, mask):
self._wreg(reg, self._rreg(reg) & (~mask)) return val[0]
def _tocard(self, cmd, send): def _sflags(self, reg, mask):
self._wreg(reg, self._rreg(reg) | mask)
recv = []
bits = irq_en = wait_irq = n = 0 def _cflags(self, reg, mask):
stat = self.ERR self._wreg(reg, self._rreg(reg) & (~mask))
if cmd == 0x0E: def _tocard(self, cmd, send):
irq_en = 0x12
wait_irq = 0x10 recv = []
elif cmd == 0x0C: bits = irq_en = wait_irq = n = 0
irq_en = 0x77 stat = self.ERR
wait_irq = 0x30
if cmd == 0x0E:
self._wreg(0x02, irq_en | 0x80) irq_en = 0x12
self._cflags(0x04, 0x80) wait_irq = 0x10
self._sflags(0x0A, 0x80) elif cmd == 0x0C:
self._wreg(0x01, 0x00) irq_en = 0x77
wait_irq = 0x30
for c in send:
self._wreg(0x09, c) self._wreg(0x02, irq_en | 0x80)
self._wreg(0x01, cmd) self._cflags(0x04, 0x80)
self._sflags(0x0A, 0x80)
if cmd == 0x0C: self._wreg(0x01, 0x00)
self._sflags(0x0D, 0x80)
for c in send:
i = 2000 self._wreg(0x09, c)
while True: self._wreg(0x01, cmd)
n = self._rreg(0x04)
i -= 1 if cmd == 0x0C:
if ~((i != 0) and ~(n & 0x01) and ~(n & wait_irq)): self._sflags(0x0D, 0x80)
break
i = 2000
self._cflags(0x0D, 0x80) while True:
n = self._rreg(0x04)
if i: i -= 1
if (self._rreg(0x06) & 0x1B) == 0x00: if ~((i != 0) and ~(n & 0x01) and ~(n & wait_irq)):
stat = self.OK break
if n & irq_en & 0x01: self._cflags(0x0D, 0x80)
stat = self.NOTAGERR
elif cmd == 0x0C: if i:
n = self._rreg(0x0A) if (self._rreg(0x06) & 0x1B) == 0x00:
lbits = self._rreg(0x0C) & 0x07 stat = self.OK
if lbits != 0:
bits = (n - 1) * 8 + lbits if n & irq_en & 0x01:
else: stat = self.NOTAGERR
bits = n * 8 elif cmd == 0x0C:
n = self._rreg(0x0A)
if n == 0: lbits = self._rreg(0x0C) & 0x07
n = 1 if lbits != 0:
elif n > 16: bits = (n - 1) * 8 + lbits
n = 16 else:
bits = n * 8
for _ in range(n):
recv.append(self._rreg(0x09)) if n == 0:
else: n = 1
stat = self.ERR elif n > 16:
n = 16
return stat, recv, bits
for _ in range(n):
def _crc(self, data): recv.append(self._rreg(0x09))
else:
self._cflags(0x05, 0x04) stat = self.ERR
self._sflags(0x0A, 0x80)
return stat, recv, bits
for c in data:
self._wreg(0x09, c) def _crc(self, data):
self._wreg(0x01, 0x03) self._cflags(0x05, 0x04)
self._sflags(0x0A, 0x80)
i = 0xFF
while True: for c in data:
n = self._rreg(0x05) self._wreg(0x09, c)
i -= 1
if not ((i != 0) and not (n & 0x04)): self._wreg(0x01, 0x03)
break
i = 0xFF
return [self._rreg(0x22), self._rreg(0x21)] while True:
n = self._rreg(0x05)
def init(self): i -= 1
if not ((i != 0) and not (n & 0x04)):
self.reset() break
self._wreg(0x2A, 0x8D)
self._wreg(0x2B, 0x3E) return [self._rreg(0x22), self._rreg(0x21)]
self._wreg(0x2D, 30)
self._wreg(0x2C, 0) def init(self):
self._wreg(0x15, 0x40)
self._wreg(0x11, 0x3D) self.reset()
self.antenna_on() self._wreg(0x2A, 0x8D)
self._wreg(0x2B, 0x3E)
def reset(self): self._wreg(0x2D, 30)
self._wreg(0x01, 0x0F) self._wreg(0x2C, 0)
self._wreg(0x15, 0x40)
def antenna_on(self, on=True): self._wreg(0x11, 0x3D)
self.antenna_on()
if on and ~(self._rreg(0x14) & 0x03):
self._sflags(0x14, 0x03) def reset(self):
else: self._wreg(0x01, 0x0F)
self._cflags(0x14, 0x03)
def antenna_on(self, on=True):
def request(self, mode):
if on and ~(self._rreg(0x14) & 0x03):
self._wreg(0x0D, 0x07) self._sflags(0x14, 0x03)
(stat, recv, bits) = self._tocard(0x0C, [mode]) else:
self._cflags(0x14, 0x03)
if (stat != self.OK) | (bits != 0x10):
stat = self.ERR def request(self, mode):
return stat, bits self._wreg(0x0D, 0x07)
(stat, recv, bits) = self._tocard(0x0C, [mode])
def anticoll(self):
if (stat != self.OK) | (bits != 0x10):
ser_chk = 0 stat = self.ERR
ser = [0x93, 0x20]
return stat, bits
self._wreg(0x0D, 0x00)
(stat, recv, bits) = self._tocard(0x0C, ser) def anticoll(self,anticolN):
if stat == self.OK: ser_chk = 0
if len(recv) == 5: ser = [anticolN, 0x20]
for i in range(4):
ser_chk = ser_chk ^ recv[i] self._wreg(0x0D, 0x00)
if ser_chk != recv[4]: (stat, recv, bits) = self._tocard(0x0C, ser)
stat = self.ERR
else: if stat == self.OK:
stat = self.ERR if len(recv) == 5:
for i in range(4):
return stat, recv ser_chk = ser_chk ^ recv[i]
if ser_chk != recv[4]:
def select_tag(self, ser): stat = self.ERR
else:
buf = [0x93, 0x70] + ser[:5] stat = self.ERR
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf) return stat, recv
return self.OK if (stat == self.OK) and (bits == 0x18) else self.ERR
def auth(self, mode, addr, sect, ser): def PcdSelect(self, serNum,anticolN):
return self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0] backData = []
buf = []
def stop_crypto1(self): buf.append(anticolN)
self._cflags(0x08, 0x08) buf.append(0x70)
i = 0
def read(self, addr): while i<5:
buf.append(serNum[i])
data = [0x30, addr] i = i + 1
data += self._crc(data) pOut = self._crc(buf)
(stat, recv, _) = self._tocard(0x0C, data) buf.append(pOut[0])
return recv if stat == self.OK else None buf.append(pOut[1])
(status, backData, backLen) = self._tocard( 0x0C, buf)
def write(self, addr, data): if (status == self.OK) and (backLen == 0x18):
return 1
buf = [0xA0, addr] else:
buf += self._crc(buf) return 0
(stat, recv, bits) = self._tocard(0x0C, buf)
if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A): def SelectTagSN(self):
stat = self.ERR valid_uid=[]
else: (status,uid)= self.anticoll(self.PICC_ANTICOLL1)
buf = [] if status != self.OK:
for i in range(16): return (self.ERR,[])
buf.append(data[i])
buf += self._crc(buf) if self.DEBUG: print("anticol(1) {}".format(uid))
(stat, recv, bits) = self._tocard(0x0C, buf) if self.PcdSelect(uid,self.PICC_ANTICOLL1) == 0:
if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A): return (self.MI_ERR,[])
stat = self.ERR if self.DEBUG: print("pcdSelect(1) {}".format(uid))
return stat #check if first byte is 0x88
if uid[0] == 0x88 :
#ok we have another type of card
valid_uid.extend(uid[1:4])
(status,uid)=self.anticoll(self.PICC_ANTICOLL2)
if status != self.OK:
return (self.ERR,[])
if self.DEBUG: print("Anticol(2) {}".format(uid))
rtn = self.PcdSelect(uid,self.PICC_ANTICOLL2)
if self.DEBUG: print("pcdSelect(2) return={} uid={}".format(rtn,uid))
if rtn == 0:
return (self.ERR,[])
if self.DEBUG: print("PcdSelect2() {}".format(uid))
#now check again if uid[0] is 0x88
if uid[0] == 0x88 :
valid_uid.extend(uid[1:4])
(status , uid) = self.anticoll(self.PICC_ANTICOLL3)
if status != self.OK:
return (self.ERR,[])
if self.DEBUG: print("Anticol(3) {}".format(uid))
if self.MFRC522_PcdSelect(uid,self.PICC_ANTICOLL3) == 0:
return (self.ERR,[])
if self.DEBUG: print("PcdSelect(3) {}".format(uid))
valid_uid.extend(uid[0:4])
return (self.OK , valid_uid)
def auth(self, mode, addr, sect, ser):
return self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]
def stop_crypto1(self):
self._cflags(0x08, 0x08)
def read(self, addr):
data = [0x30, addr]
data += self._crc(data)
(stat, recv, _) = self._tocard(0x0C, data)
return recv if stat == self.OK else None
def write(self, addr, data):
buf = [0xA0, addr]
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
else:
buf = []
for i in range(16):
buf.append(data[i])
buf += self._crc(buf)
(stat, recv, bits) = self._tocard(0x0C, buf)
if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):
stat = self.ERR
return stat