IOT

Inteligentna kontrola dostopa na podlagi STONE TFT LCD in ESP32

Kratek uvod

Pametni dom z razvojem tehnologije postaja vse pogostejši, ta članek se bo osredotočil na varnostne vidike projekta inteligentnega nadzora dostopa.

Ta članek uporablja STONE zaslon na dotik za pošiljanje ukazov MCU za nadzor releja in modula MFRC522.

Načelo branja kartic: s pogonom modula RFID-RC522 identificirajte ID izkaznice blizu osebne izkaznice in nato ugotovite, ali ID obstaja v bazi podatkov besede tipično, ID je tipična vrednost besede, če obstoj preverjanja prek , nato pa natisnite ustrezno ime in nato na enak način zaženite elektromagnetno ključavnico.

Potrebni materiali

Realizirana funkcija

  1. registracija kartice.
  2. registracija z uporabniškim imenom in geslom.
  3. povlecite kartico, da odklenete elektronsko ključavnico.
  4. Uporabniško ime in geslo za odklepanje elektronske ključavnice.

Opis glavne strojne opreme

RFID modul

Ta modul je mogoče neposredno naložiti v različne module bralnikov. Uporablja napetost 3.3 V, prek vmesnika SPI z le nekaj žicami. Neposredno povezan z matično ploščo CPU lahko modul deluje stabilno in zanesljivo kot bralnik kartic na daljavo.

Intelligent access control based on STONE TFT LCD and ESP32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Inteligentna kontrola dostopa na podlagi STONE TFT LCD in ESP32

STWI070WT-01 je bil zasnovan kot TFT monitor in krmilnik na dotik. Vključuje procesor, krmilni program, gonilnik, bliskovni pomnilnik, vrata RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, zaslon na dotik, napajalnik itd., tako da je celoten zaslonski sistem, ki temelji na zmogljivem in enostavnem operacijski sistem, ki ga lahko nadzira kateri koli MCU.

Intelligent access control based on STONE TFT LCD and ESP32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Inteligentna kontrola dostopa na podlagi STONE TFT LCD in ESP32

Oblikovanje GUI

Intelligent access control based on STONE TFT LCD and ESP32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Inteligentna kontrola dostopa na podlagi STONE TFT LCD in ESP32

Skupna raba kode

Intelligent access control based on STONE TFT LCD and ESP32 IOT PlatoBlockchain Data Intelligence. Vertical Search. Ai.
Inteligentna kontrola dostopa na podlagi STONE TFT LCD in ESP32

uvoz mfrc522

čas uvoza

uvozi _nit

iz OS import uname

iz stroja uvoz Pin, UART

#from pyb uvoz UART

#uvozni stroj

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 = []

ime_rx = []

user_id_flag = False

geslo_zastavica = False

temp_id = ”

temp_mima = ”

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

personnel_ps = {‘zbw’:’zbw3366′,’lbw’:’lbwnb’}

skrbniško_geslo = ('yyds')

gumb_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():

poskusi:

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

if stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

if stat == rdr.OK:

print(“Zaznana nova kartica”)

print(”  – vrsta oznake: 0x%02x” % vrsta_oznake)

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

natisni(“”)

if rdr.select_tag(raw_uid) == rdr.OK:

ključ = [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:

print(“Podatki, zapisani na kartico”)

drugo:

print(“Zapis podatkov na kartico ni uspel”)

drugo:

print(“Napaka pri preverjanju pristnosti”)

drugo:

natisni (»Izbira oznake ni uspela«)

razen KeyboardInterrupt:

natisni ("napaka pri pisanju")

def do_read():

medtem ko je resnično:

poskusi:

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

if stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

if stat == rdr.OK:

print(“Zaznana nova kartica”)

print(”  – vrsta oznake: 0x%02x” % vrsta_oznake)

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

natisni (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

natisni(“”)

if rdr.select_tag(raw_uid) == rdr.OK:

ključ = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

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

print(“Podatki o naslovu 8: %s” % rdr.read(8))

za ps v personnel_id:

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

suos.value(1)

natisni (ps)

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

čas.spi (3)

uart2.sendbreak()

odmor

rdr.stop_crypto1()

čas.spi (3)

suos.value(0)

drugo:

print(“Napaka pri preverjanju pristnosti”)

drugo:

natisni (»Izbira oznake ni uspela«)

če uart2.any()>1:

rx2 = []

ime_podatka2 = ”

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = seznam (bin_podatki)

za element v rx1:

rx2.append(chr(element))

natisni (rx2)

if rx1[3:5:1] == button_cmd:

ime_podatka_len = rx1[6] – 1

ime_podatka = rx2[7:ime_podatka_len+7:1]

ime_podatka2 = ”.pridruži se(ime_podatka)

natisni (ime_podatkov2)

if data_name2 == ‘back3’:

vrnitev

razen KeyboardInterrupt:

natisni (“napaka branja”)

def do_read2 (idd):

natisni (idd)

medtem ko je resnično:

poskusi:

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

if stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

if stat == rdr.OK:

print(“Zaznana nova kartica”)

print(”  – vrsta oznake: 0x%02x” % vrsta_oznake)

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

natisni (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])

natisni(“”)

if rdr.select_tag(raw_uid) == rdr.OK:

ključ = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

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

print(“Podatki o naslovu 8: %s” % rdr.read(8))

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

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

rdr.stop_crypto1()

drugo:

print(“Napaka pri preverjanju pristnosti”)

drugo:

natisni (»Izbira oznake ni uspela«)

če uart2.any()>1:

rx2 = []

ime_podatka2 = ”

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = seznam (bin_podatki)

za element v rx1:

rx2.append(chr(element))

if rx1[3:5:1] == button_cmd:

ime_podatka_len = rx1[6] – 1

ime_podatka = rx2[7:ime_podatka_len+7:1]

ime_podatka2 = ”.pridruži se(ime_podatka)

natisni (ime_podatkov2)

if data_name2 == ‘back1’:

vrnitev

razen KeyboardInterrupt:

natisni (“napaka branja”)

def uart_write(besedilo, *ids):

#              print(text, *ids)

uart2.write('STET' )

uart2.write('STET' )

uart2.write(‘STET’)

čas.spi (3)

uart2.write(‘STET’)

uart2.write(‘STET’)

uart2.write(‘STET’)

def uart_write2(besedilo,besedilo2):

uart2.write(‘STET’)

čas.spi (3)

uart2.write(‘STET’)

uart2.write(‘STET’)

def uart_write3(*id2):

uart2.write('STET' )

čas.spi (3)

uart2.write(‘STET’)

def uart_write4(besedilo,besedilo2):

uart2.write(‘STET’)

čas.spi (1)

uart2.write(‘STET’)

čas.spi (1)

uart2.write(‘STET’)

uart2.write(‘STET’)

uart2.write(‘STET’)

def uart_write5():

uart2.write('STET' )

čas.spi (3)

uart2.write(‘STET’)

def card_zhuce():

medtem ko je resnično:

če uart2.any():

user_id = ”

geslo = ”

rx2 = []

rx_num = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = seznam (bin_podatki)

za element v rx1:

rx2.append(chr(element))

rx_num += 1

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

natisni (id_podatkov_st2)

if data_id_st2 == 'uredi1':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

natisni (id_podatkov_st4)

if data_id_st4 != ”:

ime = res

elif data_id_st2 == 'uredi2':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

if data_id_st6 == admin_password:

admin = res

uart_write2('Preverjanje opravljeno!','Prosimo, položite kartico!')

do_read2(data_id_st4)

vrnitev

def mima_zuce():

temp_id3 = ”

temp_mima3 = ”

medtem ko je resnično:

če uart2.any():

user_id = ”

geslo = ”

rx2 = []

rx_num = 0

#                                              data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = seznam (bin_podatki)

za element v rx1:

rx2.append(chr(element))

rx_num += 1

#                                                                 če (rx2[rx_num] == ‘T’) in (rx2[rx_num-1] == ‘E’) in (rx2[rx_num-2] == ‘>’):

#                                                                                  odmor

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

natisni (id_podatkov_st2)

if rx1[3:5:1] == button_cmd:

ime_podatka_len = rx1[6] – 1

ime_podatka = rx2[7:ime_podatka_len+7:1]

ime_podatka2 = ”.pridruži se(ime_podatka)

natisni (ime_podatkov2)

if data_name2 == ‘back2’:

vrnitev

if data_id_st2 == 'uredi3':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

natisni (id_podatkov_st4)

user_id_flag = True

temp_id3 = data_id_st4

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

elif data_id_st2 == 'uredi4':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

natisni (id_podatkov_st6)

#                                                              če personnel_ps.get(temp_id) == data_id_st6:

password_flag = True

temp_mima3 = data_id_st6

#                                                                               personal_ps[temp_id] = password_flag

#                                              print(rx2,user_id_flag,password_flag)

elif data_id_st2 == 'uredi7':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

if (data_id_st6 == admin_password) in (password_flag == True) in (user_id_flag == True):

admin = res

personal_ps[temp_id3] = temp_mima3

geslo_zastavica = False

user_id_flag = False

uart_write4('Preverjanje opravljeno!','prijava je bila uspešna!')

def password_loin():

temp_id2 = ”

temp_mima = ”

medtem ko je resnično:

če uart2.any():

user_id = ”

geslo = ”

rx2 = []

rx_num = 0

#                                              data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = seznam (bin_podatki)

za element v rx1:

rx2.append(chr(element))

rx_num += 1

#                                                                 če (rx2[rx_num] == ‘T’) in (rx2[rx_num-1] == ‘E’) in (rx2[rx_num-2] == ‘>’):

#                                                                                  odmor

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

natisni (id_podatkov_st2)

if rx1[3:5:1] == button_cmd:

ime_podatka_len = rx1[6] – 1

ime_podatka = rx2[7:ime_podatka_len+7:1]

ime_podatka2 = ”.pridruži se(ime_podatka)

natisni (ime_podatkov2)

if data_name2 == ‘back4’:

vrnitev

if data_id_st2 == 'uredi5':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

natisni (id_podatkov_st4)

če data_id_st4 v personnel_ps:

user_id_flag = True

temp_id2 = data_id_st4

elif data_id_st2 == 'uredi6':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

natisni (id_podatkov_st6)

natisni (temp_id2)

natisni (personnel_ps)

if personnel_ps.get(temp_id2) == data_id_st6:

password_flag = True

#                                              print(rx2,user_id_flag,password_flag)

print(user_id_flag,password_flag)

if (password_flag == True) in (user_id_flag == True):

uart_write(temp_id2,temp_id2)

geslo_zastavica = False

user_id_flag = False

suos.value(1)

uart2.write(‘STET’)

uart2.write(‘STET’)

uart2.write(‘STET’)

čas.spi (3)

#                                                                                              uart_write('študent',”)

suos.value(0)

uart2.write(‘STET’)

uart2.sendbreak()

medtem ko je resnično:

če uart2.any()>1:

rx2 = []

ime_podatka2 = ”

bin_data = uart2.read(40)

#                              time.sleep(1)

uart2.sendbreak()

#                              time.sleep(1)

rx1 = seznam (bin_podatki)

za element v rx1:

rx2.append(chr(element))

natisni (rx2)

if rx1[3:5:1] == button_cmd:

ime_podatka_len = rx1[6] – 1

ime_podatka = rx2[7:ime_podatka_len+7:1]

ime_podatka2 = ”.pridruži se(ime_podatka)

natisni (ime_podatkov2)

if data_name2 == 'card1':

card_zhuce()

elif data_name2 == 'geslo1':

mima_zuce()

elif data_name2 == 'card2':

do_read()

elif data_name2 == 'geslo2':

password_loin()

MFRC522.py

iz uvoza stroja Pin, SPI

iz OS import uname

razred MFRC522:

OK = 0

NOTAGERR = 1

ERR = 2

REQIDL = 0x26

REQALL = 0x52

AVTENT1A = 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 = Pin(miso)

self.rst = Pin(prvi, Pin.OUT)

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

self.prva.vrednost(0)

self.cs.value(1)

tabla = uname()[0]

če je tabla == 'WiPy' ali tabla == 'LoPy' ali tabla == 'FiPy':

self.spi = SPI(0)

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

plošča elif == 'esp32':

self.spi = SPI(baudrate=100000, polarity=0,phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)

self.spi.init()

drugo:

dvig RuntimeError(“Nepodprta platforma”)

self.prva.vrednost(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(sam, 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)

povratna vrednost[0]

def _sflags(self, reg, mask):

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

def _cflags(self, reg, mask):

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

def _tocard(self, cmd, send):

recv = []

bits = irq_en = čakaj_irq = n = 0

stat = self.ERR

če je cmd == 0x0E:

irq_en = 0x12

čakaj_irq = 0x10

elif cmd == 0x0C:

irq_en = 0x77

čakaj_irq = 0x30

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

self._cflags(0x04, 0x80)

self._sflags(0x0A, 0x80)

self._wreg(0x01, 0x00)

za c in pošlji:

self._wreg(0x09, c)

self._wreg(0x01, cmd)

če je cmd == 0x0C:

self._sflags(0x0D, 0x80)

i = 2000

medtem ko je resnično:

n = self._rreg(0x04)

i -= 1

if ~((i != 0) and ~(n & 0x01) and ~(n & wait_irq)):

odmor

self._cflags(0x0D, 0x80)

če jaz:

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

stat = jaz.OK

če je n & irq_en & 0x01:

stat = self.NOTAGERR

elif cmd == 0x0C:

n = self._rreg(0x0A)

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

če je lbits != 0:

bitov = (n – 1) * 8 + lbitov

drugo:

bitov = n * 8

če je n == 0:

n = 1

elif n > 16:

n = 16

za _ v območju (n):

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

drugo:

stat = self.ERR

return stat, recv, bits

def _crc(sam, podatki):

self._cflags(0x05, 0x04)

self._sflags(0x0A, 0x80)

za c v podatkih:

self._wreg(0x09, c)

self._wreg(0x01, 0x03)

i = 0xFF

medtem ko je resnično:

n = self._rreg(0x05)

i -= 1

če ne ((i != 0) in ne (n & 0x04)):

odmor

vrni [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):

če je vklopljen in ~(self._rreg(0x14) & 0x03):

self._sflags(0x14, 0x03)

drugo:

self._cflags(0x14, 0x03)

def zahteva (sam, način):

self._wreg(0x0D, 0x07)

(stat, recv, bits) = self._tocard(0x0C, [način])

if (stat != self.OK) | (biti != 0x10):

stat = self.ERR

vrni statistiko, bitov

def anticoll(self):

ser_chk = 0

ser = [0x93, 0x20]

self._wreg(0x0D, 0x00)

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

if stat == self.OK:

če je len(recv) == 5:

za i v območju (4):

ser_chk = ser_chk ^ recv[i]

if ser_chk != recv[4]:

stat = self.ERR

drugo:

stat = self.ERR

return stat, recv

def select_tag(self, ser):

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

buf += self._crc(buf)

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

vrni self.OK if (stat == self.OK) in (bits == 0x18) else self.ERR

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

vrni self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]

def stop_crypto1(self):

self._cflags(0x08, 0x08)

def branje (sam, naslov):

podatki = [0x30, naslov]

podatki += self._crc(podatki)

(stat, recv, _) = self._tocard(0x0C, podatki)

return recv if stat == self.OK else None

def write(self, addr, data):

buf = [0xA0, naslov]

buf += self._crc(buf)

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

če ne (stat == self.OK) ali ne (biti == 4) ali ne ((recv[0] & 0x0F) == 0x0A):

stat = self.ERR

drugo:

buf = []

za i v območju (16):

buf.append(podatki[i])

buf += self._crc(buf)

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

če ne (stat == self.OK) ali ne (biti == 4) ali ne ((recv[0] & 0x0F) == 0x0A):

stat = self.ERR

vrni stat

Vir: Plato Data Intelligence