IOT

Intelligent adgangskontrol baseret på STONE TFT LCD og ESP32

Kort introduktion

Smart home bliver mere og mere almindeligt med udviklingen af ​​teknologi, denne artikel vil fokusere på sikkerhedsaspekterne af det intelligente adgangskontrolprojekt.

Denne artikel bruger STONEs touchskærm at sende kommandoer til MCU'en for at styre relæet og MFRC522-modulet.

Princippet om kortlæsning: ved at køre RFID-RC522-modulet, identificere ID-kort-id'et tæt på ID-kortet og derefter afgøre, om ID'et findes i databasen for ordet typisk, ID er den typiske værdi af ordet, hvis eksistensen af ​​verifikationen gennem , og udskriv derefter det tilsvarende navn, og kør derefter den elektromagnetiske lås på samme måde.

Nødvendige materialer

Realiseret funktion

  1. kortregistrering.
  2. brugernavn og adgangskode registrering.
  3. stryg kort for at låse den elektroniske lås op.
  4. Brugernavn og adgangskode til at låse den elektroniske lås op.

Den vigtigste hardwarebeskrivelse

RFID-modul

Dette modul kan indlæses direkte i forskellige læsermoduler. Den bruger en spænding på 3.3V gennem SPI-grænsefladen med blot et par ledninger. Direkte forbundet med et CPU-bundkort kan modulet fungere på en stabil og pålidelig måde som en afstandskortlæser.

Intelligent adgangskontrol baseret på STONE TFT LCD og ESP32 IOT PlatoBlockchain Data Intelligence. Lodret søgning. Ai.
Intelligent adgangskontrol baseret på STONE TFT LCD og ESP32

STWI070WT-01 er blevet udtænkt som TFT-skærm & Touch-controller. Det inkluderer processor, kontrolprogram, driver, flashhukommelse, RS232/RS422/RS485/TTL/LAN-port, Wi-Fi/Bluetooth, touchskærm, strømforsyning etc., så det er et helt displaysystem baseret på det kraftfulde og nemme operativsystem, som kan styres af enhver MCU.

Intelligent adgangskontrol baseret på STONE TFT LCD og ESP32 IOT PlatoBlockchain Data Intelligence. Lodret søgning. Ai.
Intelligent adgangskontrol baseret på STONE TFT LCD og ESP32

GUI design

Intelligent adgangskontrol baseret på STONE TFT LCD og ESP32 IOT PlatoBlockchain Data Intelligence. Lodret søgning. Ai.
Intelligent adgangskontrol baseret på STONE TFT LCD og ESP32

Kodedeling

Intelligent adgangskontrol baseret på STONE TFT LCD og ESP32 IOT PlatoBlockchain Data Intelligence. Lodret søgning. Ai.
Intelligent adgangskontrol baseret på STONE TFT LCD og ESP32

importer mfrc522

importtid

importer _tråd

fra os importer uname

fra maskinimport Pin, UART

#fra pyb import UART

#import maskine

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 = Falsk

password_flag = Falsk

temp_id = ”

temp_mima = ”

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

prøve:

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

hvis stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

hvis stat == rdr.OK:

print ("Nyt kort fundet")

print(" – tagtype: 0x%02x" % tag_type)

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

Print("")

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

tast = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

hvis rdr.auth(rdr.AUTHENT1A, 8, nøgle, 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()

hvis stat == rdr.OK:

print(“Data skrevet til kortet”)

andet:

print ("Kunnede ikke skrive data til kortet")

andet:

print ("godkendelsesfejl")

andet:

print ("Kunne ikke vælge tag")

undtagen KeyboardInterrupt:

print(“skrivefejl”)

def do_read():

mens det er sandt:

prøve:

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

hvis stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

hvis stat == rdr.OK:

print ("Nyt kort fundet")

print(" – tagtype: 0x%02x" % tag_type)

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

print (rå_uid[0], rå_uid[1], rå_uid[2], rå_uid[3])

Print("")

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

tast = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

hvis rdr.auth(rdr.AUTHENT1A, 8, nøgle, raw_uid) == rdr.OK:

print(“Adresse 8 data: %s” % rdr.read(8))

for ps i personnel_id:

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

suos.value(1)

print(ps)

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

time.sleep (3)

uart2.sendbreak()

bryde

rdr.stop_crypto1()

time.sleep (3)

suos.value(0)

andet:

print ("godkendelsesfejl")

andet:

print ("Kunne ikke vælge tag")

if uart2.any()>1:

rx2 = []

data_navn2 = ”

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = liste(bin_data)

for element i rx1:

rx2.append(chr(item))

print (rx2)

if 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)

print(data_navn2)

if data_name2 == 'back3':

afkast

undtagen KeyboardInterrupt:

print ("læsefejl")

def do_read2 (idd):

print(idd)

mens det er sandt:

prøve:

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

hvis stat == rdr.OK:

(stat, raw_uid) = rdr.anticoll()

hvis stat == rdr.OK:

print ("Nyt kort fundet")

print(" – tagtype: 0x%02x" % tag_type)

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

print (rå_uid[0], rå_uid[1], rå_uid[2], rå_uid[3])

Print("")

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

tast = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]

hvis rdr.auth(rdr.AUTHENT1A, 8, nøgle, raw_uid) == rdr.OK:

print(“Adresse 8 data: %s” % rdr.read(8))

personnel_id[idd] = rå_uid[0:4:1]

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

rdr.stop_crypto1()

andet:

print ("godkendelsesfejl")

andet:

print ("Kunne ikke vælge tag")

if uart2.any()>1:

rx2 = []

data_navn2 = ”

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = liste(bin_data)

for element i rx1:

rx2.append(chr(item))

if 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)

print(data_navn2)

if data_name2 == 'back1':

afkast

undtagen KeyboardInterrupt:

print ("læsefejl")

def uart_write(tekst, *ids):

# print(tekst, *id'er)

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(tekst,tekst2):

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(tekst,tekst2):

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

mens det er sandt:

if uart2.any():

bruger_id = ”

adgangskode = ”

rx2 = []

rx_num = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = liste(bin_data)

for element i rx1:

rx2.append(chr(item))

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 != ”:

navn = Sandt

elif data_id_st2 == 'edit2':

data_id_st5 = rx2[15:data_end:1]

data_id_st6 = ”.join(data_id_st5)

hvis data_id_st6 == admin_adgangskode:

admin = Sandt

uart_write2('Bekræftelse bestået!','Placer venligst kortet!')

do_read2(data_id_st4)

afkast

def mima_zuce():

temp_id3 = ”

temp_mima3 = ”

mens det er sandt:

if uart2.any():

bruger_id = ”

adgangskode = ”

rx2 = []

rx_num = 0

# data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = liste(bin_data)

for element i rx1:

rx2.append(chr(item))

rx_num += 1

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

# pause

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

print(data_id_st2)

if 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)

print(data_navn2)

if data_name2 == 'back2':

afkast

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 = Sand

temp_id3 = data_id_st4

# personnel_ps[temp_id] = rå_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 = Sand

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)

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

admin = Sandt

personnel_ps[temp_id3] = temp_mima3

password_flag = Falsk

user_id_flag = Falsk

uart_write4('Bekræftelse bestået!','login lykkedes!')

def password_loin():

temp_id2 = ”

temp_mima = ”

mens det er sandt:

if uart2.any():

bruger_id = ”

adgangskode = ”

rx2 = []

rx_num = 0

# data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = liste(bin_data)

for element i rx1:

rx2.append(chr(item))

rx_num += 1

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

# pause

data_end = rx_num-5

data_id_st = rx2[8:13:1]

data_id_st2 = ”.join(data_id_st)

print(data_id_st2)

if 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)

print(data_navn2)

if data_name2 == 'back4':

afkast

if data_id_st2 == 'edit5':

data_id_st3 = rx2[15:data_end:1]

data_id_st4 = ”.join(data_id_st3)

print(data_id_st4)

if data_id_st4 i personnel_ps:

user_id_flag = Sand

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)

print(temp_id2)

print(personnel_ps)

hvis personnel_ps.get(temp_id2) == data_id_st6:

password_flag = Sand

# print(rx2,user_id_flag,password_flag)

print (bruger_id_flag, adgangskode_flag)

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

uart_write(temp_id2,temp_id2)

password_flag = Falsk

user_id_flag = Falsk

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('student',")

suos.value(0)

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

uart2.sendbreak()

mens det er sandt:

if uart2.any()>1:

rx2 = []

data_navn2 = ”

bin_data = uart2.read(40)

# time.sleep(1)

uart2.sendbreak()

# time.sleep(1)

rx1 = liste(bin_data)

for element i rx1:

rx2.append(chr(item))

print (rx2)

if 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)

print(data_navn2)

hvis data_name2 == 'kort1':

card_zhuce()

elif data_name2 == 'adgangskode1':

mima_zuce()

elif data_name2 == 'kort2':

do_read()

elif data_name2 == 'adgangskode2':

password_loin()

MFRC522.py

fra maskinimport Pin, SPI

fra os importer uname

klasse MFRC522:

OK = 0

NOTAGERR = 1

ERR = 2

REQIDL = 0x26

REQALL = 0x52

AUTHENT1A = 0x60

AUTHENT1B = 0x61

def __init__(selv, sck, mosi, miso, først, cs):

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

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

self.miso = Pin(miso)

self.rst = Pin(første, Pin.OUT)

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

self.rst.value(0)

self.cs.value(1)

board = unavn()[0]

hvis board == 'WiPy' eller board == 'LoPy' eller 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, polaritet=0, fase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)

self.spi.init()

andet:

raise RuntimeError(“Ikke-understøttet platform”)

self.rst.value(1)

self.init()

def _wreg(selv, 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(selv, 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)

returværdi[0]

def _sflags(selv, reg, maske):

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

def _cflags(selv, reg, maske):

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

def _tocard(selv, cmd, send):

recv = []

bits = irq_en = wait_irq = n = 0

stat = selv.FEJL

hvis cmd == 0x0E:

irq_da = 0x12

wait_irq = 0x10

elif cmd == 0x0C:

irq_da = 0x77

wait_irq = 0x30

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

self._cflags(0x04, 0x80)

self._sflags(0x0A, 0x80)

self._wreg(0x01, 0x00)

for c i send:

self._wreg(0x09, c)

self._wreg(0x01, cmd)

hvis cmd == 0x0C:

self._sflags(0x0D, 0x80)

i = 2000

mens det er sandt:

n = self._rreg(0x04)

i -= 1

hvis ~((i != 0) og ~(n & 0x01) og ~(n & wait_irq)):

bryde

self._cflags(0x0D, 0x80)

hvis jeg:

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

stat = selv.OK

if n & irq_en & 0x01:

stat = selv.NOTAGERR

elif cmd == 0x0C:

n = self._rreg(0x0A)

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

hvis lbs != 0:

bit = (n – 1) * 8 + lbs

andet:

bit = n * 8

hvis n == 0:

n = 1

elif n > 16:

n = 16

for _ i område(n):

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

andet:

stat = selv.FEJL

returstat, recv, bits

def _crc(selv, data):

self._cflags(0x05, 0x04)

self._sflags(0x0A, 0x80)

for c i data:

self._wreg(0x09, c)

self._wreg(0x01, 0x03)

i = 0xFF

mens det er sandt:

n = self._rreg(0x05)

i -= 1

hvis ikke ((i != 0) og ikke (n & 0x04)):

bryde

returner [self._rreg(0x22), self._rreg(0x21)]

def init(selv):

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

self._wreg(0x01, 0x0F)

def antenna_on(self, on=True):

hvis til og ~(self._rreg(0x14) & 0x03):

self._sflags(0x14, 0x03)

andet:

self._cflags(0x14, 0x03)

def request (selv, tilstand):

self._wreg(0x0D, 0x07)

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

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

stat = selv.FEJL

returstat, bits

def anticoll(selv):

ser_chk = 0

ser = [0x93, 0x20]

self._wreg(0x0D, 0x00)

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

if stat == self.OK:

hvis len(recv) == 5:

for i i området(4):

ser_chk = ser_chk ^ recv[i]

if ser_chk != recv[4]:

stat = selv.FEJL

andet:

stat = selv.FEJL

returstat, recv

def select_tag(selv, ser):

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

buf += self._crc(buf)

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

returner self.OK if (stat == self.OK) og (bits == 0x18) else self.ERR

def auth(selv, tilstand, addr, sekt, ser):

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

def stop_crypto1(selv):

self._cflags(0x08, 0x08)

def read (selv, addr):

data = [0x30, adr]

data += self._crc(data)

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

return recv if stat == self.OK else Ingen

def write(selv, addr, data):

buf = [0xA0, addr]

buf += self._crc(buf)

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

hvis ikke (stat == self.OK) eller ej (bits == 4) eller ej ((recv[0] & 0x0F) == 0x0A):

stat = selv.FEJL

andet:

buf = []

for i i området(16):

buf.append(data[i])

buf += self._crc(buf)

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

hvis ikke (stat == self.OK) eller ej (bits == 4) eller ej ((recv[0] & 0x0F) == 0x0A):

stat = selv.FEJL

returstat

Kilde: Platon Data Intelligence