IOT

Έξυπνος έλεγχος πρόσβασης βασισμένος σε STONE TFT LCD και ESP32

Σύντομη εισαγωγή

Το έξυπνο σπίτι γίνεται όλο και πιο κοινό με την ανάπτυξη της τεχνολογίας, αυτό το άρθρο θα επικεντρωθεί στις πτυχές ασφάλειας του έργου έξυπνου ελέγχου πρόσβασης.

Αυτό το άρθρο χρησιμοποιεί Η οθόνη αφής της STONE για αποστολή εντολών στο MCU για έλεγχο του ρελέ και της μονάδας MFRC522.

Η αρχή της ανάγνωσης καρτών: οδηγώντας τη μονάδα RFID-RC522, αναγνωρίστε το αναγνωριστικό της ταυτότητας κοντά στην ταυτότητα και, στη συνέχεια, προσδιορίστε εάν το αναγνωριστικό υπάρχει στη βάση δεδομένων της λέξης τυπικό, ID είναι η τυπική τιμή της λέξης, εάν η ύπαρξη της επαλήθευσης μέσω , και στη συνέχεια εκτυπώστε το αντίστοιχο όνομα και, στη συνέχεια, οδηγήστε την ηλεκτρομαγνητική κλειδαριά με τον ίδιο τρόπο.

Απαιτούμενα υλικά

Πραγματοποιημένη λειτουργία

  1. εγγραφή κάρτας.
  2. εγγραφή ονόματος χρήστη και κωδικού πρόσβασης.
  3. σύρετε την κάρτα για να ξεκλειδώσετε την ηλεκτρονική κλειδαριά.
  4. Όνομα χρήστη και κωδικός πρόσβασης για να ξεκλειδώσετε την ηλεκτρονική κλειδαριά.

Περιγραφή του κύριου υλικού

Μονάδα RFID

Αυτή η ενότητα μπορεί να φορτωθεί απευθείας σε διάφορες μονάδες ανάγνωσης. Χρησιμοποιεί τάση 3.3 V, μέσω της διεπαφής SPI με λίγα μόνο καλώδια. Άμεσα συνδεδεμένη με μια μητρική πλακέτα CPU, η μονάδα μπορεί να λειτουργήσει με σταθερό και αξιόπιστο τρόπο ως συσκευή ανάγνωσης καρτών απόστασης.

Έξυπνος έλεγχος πρόσβασης που βασίζεται σε STONE TFT LCD και ESP32 IOT PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Έξυπνος έλεγχος πρόσβασης βασισμένος σε STONE TFT LCD και ESP32

Το STWI070WT-01 έχει σχεδιαστεί ως οθόνη TFT και ελεγκτής αφής. Περιλαμβάνει επεξεργαστή, πρόγραμμα ελέγχου, πρόγραμμα οδήγησης, μνήμη flash, θύρα RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, οθόνη αφής, τροφοδοτικό κ.λπ., επομένως είναι ένα ολόκληρο σύστημα οθόνης που βασίζεται στο πανίσχυρο και εύκολο λειτουργικό σύστημα, το οποίο μπορεί να ελεγχθεί από Οποιοδήποτε MCU.

Έξυπνος έλεγχος πρόσβασης που βασίζεται σε STONE TFT LCD και ESP32 IOT PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Έξυπνος έλεγχος πρόσβασης βασισμένος σε STONE TFT LCD και ESP32

Σχεδιασμός GUI

Έξυπνος έλεγχος πρόσβασης που βασίζεται σε STONE TFT LCD και ESP32 IOT PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Έξυπνος έλεγχος πρόσβασης βασισμένος σε STONE TFT LCD και ESP32

Κοινή χρήση κώδικα

Έξυπνος έλεγχος πρόσβασης που βασίζεται σε STONE TFT LCD και ESP32 IOT PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Έξυπνος έλεγχος πρόσβασης βασισμένος σε STONE TFT LCD και ESP32

εισαγωγή mfrc522

χρόνος εισαγωγής

import _thread

από το os import uname

από Pin εισαγωγής μηχανής, UART

#from pyb εισαγωγή UART

#εισαγωγή μηχάνημα

suos = Pin(32,Pin.OUT)

uart2 = UART(2, baudrate=115200, rx=16,tx=17, timeout=10)

ESP32_HSPI_CLOCK = 14

ESP32_HSPI_SLAVE_SELECT = 15

ESP32_HSPI_MISO = 12

ESP32_HSPI_MOSI = 13

ESP32_MFRC522_RST = 5

rx3 = []

rx_name = []

user_id_flag = Λάθος

password_flag = Λάθος

temp_id = "

temp_mima = ”

personel_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}

personnel_ps = {'zbw':'zbw3366','lbw':'lbwnb'}

admin_password = ('yyds')

button_cmd = [16,1]

edit1_cmd = [16,112]

edit2_cmd = [16,113]

edit3_cmd = [16,114]

if uname()[0] == 'esp32':

rdr = mfrc522.MFRC522(ESP32_HSPI_CLOCK, ESP32_HSPI_MOSI, ESP32_HSPI_MISO, ESP32_MFRC522_RST, ESP32_HSPI_SLAVE_SELECT)

def do_write():

δοκιμάστε:

(stat, tag_type) = rdr.request(rdr.REQIDL)

if stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

if stat == rdr.OK:

εκτύπωση ("Εντοπίστηκε νέα κάρτα")

print(” – τύπος ετικέτας: 0x%02x” % tag_type)

print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

Τυπώνω("")

αν rdr.select_tag(raw_uid) == rdr.OK:

κλειδί = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:

stat = rdr.write(8, b”\x00\x53\x00\x54\x00\x4F\x00\x4E\x00\x45\x0a\x0b\x0c\x0d\x0e\x0f”)

rdr.stop_crypto1()

if stat == rdr.OK:

εκτύπωση ("Δεδομένα γραμμένα στην κάρτα")

αλλού:

εκτύπωση ("Αποτυχία εγγραφής δεδομένων στην κάρτα")

αλλού:

εκτύπωση ("Σφάλμα ελέγχου ταυτότητας")

αλλού:

εκτύπωση ("Αποτυχία επιλογής ετικέτας")

εκτός από το πληκτρολόγιο Διακοπή:

εκτύπωση ("σφάλμα εγγραφής")

def do_read():

ενώ True:

δοκιμάστε:

(stat, tag_type) = rdr.request(rdr.REQIDL)

if stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

if stat == rdr.OK:

εκτύπωση ("Εντοπίστηκε νέα κάρτα")

print(” – τύπος ετικέτας: 0x%02x” % tag_type)

print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

εκτύπωση (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

Τυπώνω("")

αν rdr.select_tag(raw_uid) == rdr.OK:

κλειδί = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:

print("Δεδομένα διεύθυνσης 8: %s" % rdr.read(8))

για ps στο personel_id:

if raw_uid[0:4:1] == personnel_id.get(ps):

suos.value(1)

εκτύπωση (ps)

uart_write(ps, *raw_uid[0:4:1])

time.sleep (3)

uart2.sendbreak()

σπάσει

rdr.stop_crypto1()

time.sleep (3)

suos.value(0)

αλλού:

εκτύπωση ("Σφάλμα ελέγχου ταυτότητας")

αλλού:

εκτύπωση ("Αποτυχία επιλογής ετικέτας")

if uart2.any()>1:

rx2 = []

data_name2 = "

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = λίστα(bin_data)

για το στοιχείο σε rx1:

rx2.append(chr(στοιχείο))

εκτύπωση (rx2)

εάν rx1[3:5:1] == button_cmd:

data_name_len = rx1[6] – 1

data_name = rx2[7:data_name_len+7:1]

data_name2 = "join(data_name)

εκτύπωση(όνομα_δεδομένων2)

if data_name2 == 'back3':

απόδοση

εκτός από το πληκτρολόγιο Διακοπή:

εκτύπωση ("σφάλμα ανάγνωσης")

def do_read2 (idd):

εκτύπωση (idd)

ενώ True:

δοκιμάστε:

(stat, tag_type) = rdr.request(rdr.REQIDL)

if stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

if stat == rdr.OK:

εκτύπωση ("Εντοπίστηκε νέα κάρτα")

print(” – τύπος ετικέτας: 0x%02x” % tag_type)

print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))

εκτύπωση (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

Τυπώνω("")

αν rdr.select_tag(raw_uid) == rdr.OK:

κλειδί = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

if rdr.auth(rdr.AUTHENT1A, 8, key, raw_uid) == rdr.OK:

print("Δεδομένα διεύθυνσης 8: %s" % rdr.read(8))

personel_id[idd] = raw_uid[0:4:1]

uart_write3(*raw_uid[0:4:1])

rdr.stop_crypto1()

αλλού:

εκτύπωση ("Σφάλμα ελέγχου ταυτότητας")

αλλού:

εκτύπωση ("Αποτυχία επιλογής ετικέτας")

if uart2.any()>1:

rx2 = []

data_name2 = "

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = λίστα(bin_data)

για το στοιχείο σε rx1:

rx2.append(chr(στοιχείο))

εάν rx1[3:5:1] == button_cmd:

data_name_len = rx1[6] – 1

data_name = rx2[7:data_name_len+7:1]

data_name2 = "join(data_name)

εκτύπωση(όνομα_δεδομένων2)

if data_name2 == 'back1':

απόδοση

εκτός από το πληκτρολόγιο Διακοπή:

εκτύπωση ("σφάλμα ανάγνωσης")

def uart_write(κείμενο, *ids):

# εκτύπωση (κείμενο, *αναγνωριστικά)

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardname1″,”text”:”'+str(text)+'”}>ET' )

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid1″,”text”:”'+str(ids)+'”}>ET' )

uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock1″,”visible”:true}>ET')

time.sleep (3)

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardname1″,”text”:”””}>ET')

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid1″,”text”:”””}>ET')

uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock1″,”visible”:false}>ET”)

def uart_write2 (κείμενο, κείμενο2):

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”'+text+'”}>ET')

time.sleep (3)

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”'+text2+'”}>ET')

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit2″,”text”:”””}>ET')

def uart_write3(*id2):

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+str(id2)+'"}>ET' )

time.sleep (3)

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”””}>ET”)

def uart_write4 (κείμενο, κείμενο2):

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”login”,”text”:”'+text+'”}>ET')

time.sleep (1)

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"login","text":"'+text2+'"}>ET')

time.sleep (1)

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit3″,”text”:”””}>ET')

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit4″,”text”:”””}>ET')

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit7″,”text”:”””}>ET')

def uart_write5():

uart2.write('ST<{"cmd_code":"set_text","type":"label","widget":"cardid","text":"'+str(id2)+'"}>ET' )

time.sleep (3)

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”cardid”,”text”:”””}>ET”)

def card_zhuce():

ενώ True:

if uart2.any():

user_id = "

κωδικός = ”

rx2 = []

rx_num = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = λίστα(bin_data)

για το στοιχείο σε rx1:

rx2.append(chr(στοιχείο))

rx_num += 1

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = "join(data_id_st)

print(data_id_st2)

if data_id_st2 == 'edit1':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = .join(data_id_st3)

print(data_id_st4)

if data_id_st4 != ”:

όνομα = Αληθινό

elif data_id_st2 == 'edit2':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = .join(data_id_st5)

if data_id_st6 == admin_password:

admin = Αληθινό

uart_write2('Η επαλήθευση πέρασε!','Παρακαλώ τοποθετήστε την κάρτα!')

do_read2(data_id_st4)

απόδοση

def mima_zuce():

temp_id3 = "

temp_mima3 = "

ενώ True:

if uart2.any():

user_id = "

κωδικός = ”

rx2 = []

rx_num = 0

# data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = λίστα(bin_data)

για το στοιχείο σε rx1:

rx2.append(chr(στοιχείο))

rx_num += 1

# if (rx2[rx_num] == 'T') και (rx2[rx_num-1] == 'E') και (rx2[rx_num-2] == '>'):

# Διακοπή

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = "join(data_id_st)

print(data_id_st2)

εάν rx1[3:5:1] == button_cmd:

data_name_len = rx1[6] – 1

data_name = rx2[7:data_name_len+7:1]

data_name2 = "join(data_name)

εκτύπωση(όνομα_δεδομένων2)

if data_name2 == 'back2':

απόδοση

if data_id_st2 == 'edit3':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = .join(data_id_st3)

print(data_id_st4)

user_id_flag = Σωστό

temp_id3 = data_id_st4

# personnel_ps[temp_id] = raw_uid[0:4:1]

elif data_id_st2 == 'edit4':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = .join(data_id_st5)

print(data_id_st6)

# if personnel_ps.get(temp_id) == data_id_st6:

password_flag = Σωστό

temp_mima3 = data_id_st6

# personnel_ps[temp_id] = password_flag

# print(rx2,user_id_flag,password_flag)

elif data_id_st2 == 'edit7':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = .join(data_id_st5)

εάν (data_id_st6 == admin_password) και (password_flag == True) και (user_id_flag == True):

admin = Αληθινό

personel_ps[temp_id3] = temp_mima3

password_flag = Λάθος

user_id_flag = Λάθος

uart_write4('Η επαλήθευση πέρασε!','η σύνδεση ήταν επιτυχής!')

Def password_loin():

temp_id2 = "

temp_mima = ”

ενώ True:

if uart2.any():

user_id = "

κωδικός = ”

rx2 = []

rx_num = 0

# data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = λίστα(bin_data)

για το στοιχείο σε rx1:

rx2.append(chr(στοιχείο))

rx_num += 1

# if (rx2[rx_num] == 'T') και (rx2[rx_num-1] == 'E') και (rx2[rx_num-2] == '>'):

# Διακοπή

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = "join(data_id_st)

print(data_id_st2)

εάν rx1[3:5:1] == button_cmd:

data_name_len = rx1[6] – 1

data_name = rx2[7:data_name_len+7:1]

data_name2 = "join(data_name)

εκτύπωση(όνομα_δεδομένων2)

if data_name2 == 'back4':

απόδοση

if data_id_st2 == 'edit5':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = .join(data_id_st3)

print(data_id_st4)

εάν data_id_st4 στο personel_ps:

user_id_flag = Σωστό

temp_id2 = data_id_st4

elif data_id_st2 == 'edit6':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = .join(data_id_st5)

print(data_id_st6)

εκτύπωση(temp_id2)

εκτύπωση(personnel_ps)

εάν personnel_ps.get(temp_id2) == data_id_st6:

password_flag = Σωστό

# print(rx2,user_id_flag,password_flag)

print(user_id_flag,password_flag)

εάν (password_flag == True) και (user_id_flag == True):

uart_write(temp_id2,temp_id2)

password_flag = Λάθος

user_id_flag = Λάθος

suos.value(1)

uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″,”visible”:true}>ET')

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit5″,”text”:”””}>ET')

uart2.write('ST<{“cmd_code”:”set_text”,”type”:”label”,”widget”:”edit6″,”text”:”””}>ET')

time.sleep (3)

# uart_write('φοιτητής',")

suos.value(0)

uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″,”visible”:false}>ET”)

uart2.sendbreak()

ενώ True:

if uart2.any()>1:

rx2 = []

data_name2 = "

bin_data = uart2.read(40)

# time.sleep(1)

uart2.sendbreak()

# time.sleep(1)

rx1 = λίστα(bin_data)

για το στοιχείο σε rx1:

rx2.append(chr(στοιχείο))

εκτύπωση (rx2)

εάν rx1[3:5:1] == button_cmd:

data_name_len = rx1[6] – 1

data_name = rx2[7:data_name_len+7:1]

data_name2 = "join(data_name)

εκτύπωση(όνομα_δεδομένων2)

εάν data_name2 == 'card1':

card_zhuce()

elif data_name2 == 'password1':

mima_zuce()

elif data_name2 == 'card2':

do_read()

elif data_name2 == 'password2':

password_loin()

MFRC522.py

από Pin εισαγωγής μηχανής, SPI

από το os import uname

κλάση MFRC522:

ΟΚ = 0

NOTAGERR = 1

ΣΦΑΛΜΑ = 2

REQIDL = 0x26

REQALL = 0x52

AUTHENT1A = 0x60

AUTHENT1B = 0x61

def __init__(self, sck, mosi, miso, rst, cs):

self.sck = Pin(sck, Pin.OUT)

self.mosi = Pin(mosi, Pin.OUT)

self.miso = Καρφίτσωμα(miso)

self.rst = Καρφίτσωμα (πρώτο, Pin.OUT)

self.cs = Pin(cs, Pin.OUT)

self.rst.value(0)

self.cs.value(1)

πίνακας = uname()[0]

if board == 'WiPy' ή board == 'LoPy' ή board == 'FiPy':

self.spi = SPI(0)

self.spi.init(SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso))

elif board == 'esp32':

self.spi = SPI(baudrate=100000, πολικότητα=0, φάση=0, sck=self.sck, mosi=self.mosi, miso=self.miso)

self.spi.init()

αλλού:

αύξηση RuntimeError ("Μη υποστηριζόμενη πλατφόρμα")

self.rst.value(1)

self.init()

def _wreg(self, reg, val):

self.cs.value(0)

self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))

self.spi.write(b'%c' % int(0xff & val))

self.cs.value(1)

def _rreg(self, reg):

self.cs.value(0)

self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))

val = self.spi.read(1)

self.cs.value(1)

επιστροφή val[0]

def _sflags (self, reg, mask):

self._wreg(reg, self._rreg(reg) | mask)

def _cflags(self, reg, mask):

self._wreg(reg, self._rreg(reg) & (~mask))

def _tocard(self, cmd, send):

recv = []

bits = irq_en = αναμονή_irq = n = 0

stat = εαυτό.ΣΦΑΛΜΑ

εάν cmd == 0x0E:

irq_en = 0x12

wait_irq = 0x10

elif cmd == 0x0C:

irq_en = 0x77

wait_irq = 0x30

self._wreg(0x02, irq_en | 0x80)

self._cflags(0x04, 0x80)

self._sflags(0x0A, 0x80)

self._wreg(0x01, 0x00)

για c σε αποστολή:

self._wreg(0x09, c)

self._wreg(0x01, cmd)

αν cmd == 0x0C:

self._sflags(0x0D, 0x80)

i = 2000

ενώ True:

n = self._rreg(0x04)

i - = 1

αν ~((i != 0) και ~(n & 0x01) και ~(n & wait_irq)):

σπάσει

self._cflags(0x0D, 0x80)

αν εγώ:

if (self._rreg(0x06) & 0x1B) == 0x00:

stat = εαυτός.ΟΚ

εάν n & irq_en & 0x01:

stat = εαυτός.NOTAGERR

elif cmd == 0x0C:

n = self._rreg(0x0A)

lbits = self._rreg(0x0C) & 0x07

αν λίβρες != 0:

bits = (n – 1) * 8 + lbit

αλλού:

bit = n * 8

αν n == 0:

n = 1

elif n > 16:

n = 16

για _ στο εύρος(n):

recv.append(self._rreg(0x09))

αλλού:

stat = εαυτό.ΣΦΑΛΜΑ

επιστροφή stat, recv, bits

def _crc(self, data):

self._cflags(0x05, 0x04)

self._sflags(0x0A, 0x80)

για c σε δεδομένα:

self._wreg(0x09, c)

self._wreg(0x01, 0x03)

i = 0xFF

ενώ True:

n = self._rreg(0x05)

i - = 1

αν όχι ((i != 0) και όχι (n & 0x04)):

σπάσει

επιστροφή [self._rreg(0x22), self._rreg(0x21)]

def init(self):

self.reset()

self._wreg(0x2A, 0x8D)

self._wreg(0x2B, 0x3E)

self._wreg(0x2D, ​​30)

self._wreg(0x2C, 0)

self._wreg(0x15, 0x40)

self._wreg(0x11, 0x3D)

self.antenna_on()

Def reset(self):

self._wreg(0x01, 0x0F)

def antenna_on(self, on=True):

if on και ~(self._rreg(0x14) & 0x03):

self._sflags(0x14, 0x03)

αλλού:

self._cflags(0x14, 0x03)

def request (self, mode):

self._wreg(0x0D, 0x07)

(stat, recv, bits) = self._tocard(0x0C, [mode])

αν (stat != εαυτό.ΟΚ) | (bit != 0x10):

stat = εαυτό.ΣΦΑΛΜΑ

επιστροφή στατιστικών στοιχείων, bits

def anticoll(self):

ser_chk = 0

ser = [0x93, 0x20]

self._wreg(0x0D, 0x00)

(stat, recv, bits) = self._tocard(0x0C, ser)

if stat == self.OK:

αν len(recv) == 5:

για i στην περιοχή (4):

ser_chk = ser_chk ^ recv[i]

if ser_chk != recv[4]:

stat = εαυτό.ΣΦΑΛΜΑ

αλλού:

stat = εαυτό.ΣΦΑΛΜΑ

επιστροφή stat, recv

def select_tag(self, ser):

buf = [0x93, 0x70] + ser[:5]

buf += self._crc(buf)

(stat, recv, bits) = self._tocard(0x0C, buf)

επιστροφή self.OK εάν (stat == self.OK) και (bits == 0x18) αλλιώς self.ERR

def auth(self, mode, adr, sect, ser):

επιστροφή self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]

def stop_crypto1(self):

self._cflags(0x08, 0x08)

def read(self, adr):

δεδομένα = [0x30, adr]

data += self._crc(data)

(stat, recv, _) = self._tocard(0x0C, δεδομένα)

επιστροφή recv εάν stat == εαυτό.ΟΚ άλλο Κανένα

def write(self, adr, data):

buf = [0xA0, addr]

buf += self._crc(buf)

(stat, recv, bits) = self._tocard(0x0C, buf)

αν όχι (stat == self.OK) ή όχι (bit == 4) ή όχι ((recv[0] & 0x0F) == 0x0A):

stat = εαυτό.ΣΦΑΛΜΑ

αλλού:

buf = []

για i στην περιοχή (16):

buf.append(data[i])

buf += self._crc(buf)

(stat, recv, bits) = self._tocard(0x0C, buf)

αν όχι (stat == self.OK) ή όχι (bit == 4) ή όχι ((recv[0] & 0x0F) == 0x0A):

stat = εαυτό.ΣΦΑΛΜΑ

στατιστικά επιστροφής

Πηγή: Intelligence Data Intelligence