Kısa Tanıtım
Akıllı ev, teknolojinin gelişmesiyle giderek daha yaygın hale geliyor, bu makale akıllı erişim kontrolü projesinin güvenlik yönlerine odaklanacak.
Bu makalede STONE'ın dokunmatik ekranı Röleyi ve MFRC522 modülünü kontrol etmek için MCU'ya komutlar göndermek için.
Kart okuma prensibi: RFID-RC522 modülünü sürerek, kimlik kartına yakın kimlik kartı kimliğini tanımlayın ve ardından kimliğin tipik kelimesinin veritabanında bulunup bulunmadığını belirleyin, kimlik, doğrulamanın varlığı durumunda kelimenin tipik değeridir. ve ardından ilgili adı yazdırın ve ardından elektromanyetik kilidi aynı şekilde sürün.
Gerekli malzemeler
- ESP32
- KOB elektronik kilit
- Röle
- STONE STWI070WT-01 dokunmatik panel ekranı
- MFRC522 modülü
Gerçekleşen fonksiyon
- kart kaydı.
- kullanıcı adı ve şifre kaydı.
- elektronik kilidin kilidini açmak için kartı kaydırın.
- Elektronik kilidin kilidini açmak için kullanıcı adı ve şifre.
Ana donanım açıklaması
RFID Modülü
Bu modül, çeşitli okuyucu modüllerine doğrudan yüklenebilir. Sadece birkaç kablo ile SPI arayüzü aracılığıyla 3.3V'luk bir voltaj kullanır. Doğrudan bir CPU anakartına bağlı olan modül, bir mesafe kart okuyucusu olarak istikrarlı ve güvenilir bir şekilde çalışabilir.
STWI070WT-01, TFT monitör ve Dokunmatik kontrolör olarak tasarlanmıştır. İşlemci, kontrol programı, sürücü, flash bellek, RS232/RS422/RS485/TTL/LAN bağlantı noktası, Wi-Fi/Bluetooth, dokunmatik ekran, güç kaynağı vb. içerir, bu nedenle güçlü ve kolay Herhangi bir MCU tarafından kontrol edilebilen işletim sistemi.
GUI tasarımı
Kod paylaşımı
içe aktar mfrc522
ithalat zamanı
_thread'i içe aktar
os import uname'den
makineden içe aktarma Pin, UART
#pyb'den UART'ı içe aktar
#ithalat makinesi
suos = Pim(32,Pin.ÇIKIŞ)
uart2 = UART(2, baud hızı=115200, rx=16,tx=17,zaman aşımı=10)
ESP32_HSPI_SAAT = 14
ESP32_HSPI_SLAVE_SELECT = 15
ESP32_HSPI_MISO = 12
ESP32_HSPI_MOSI = 13
ESP32_MFRC522_RST = 5
rx3 = []
rx_adı = []
user_id_flag = Yanlış
password_flag = Yanlış
temp_id = ”
temp_mima = ”
personel_kimliği = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}
personel_ps = {'zbw':'zbw3366′,'lbw':'lbwnb'}
admin_password = ('yyds')
butonu_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():
deneyin:
(stat, etiket_türü) = rdr.request(rdr.REQIDL)
eğer stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
eğer stat == rdr.OK:
print(“Yeni kart algılandı”)
print(” – etiket tipi: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
Yazdır("")
rdr.select_tag(raw_uid) == rdr.OK ise:
anahtar = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, anahtar, 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()
eğer stat == rdr.OK:
print(“Karta yazılan veri”)
Başka:
print(“Karta veri yazılamadı”)
Başka:
print(“Doğrulama hatası”)
Başka:
print(“Etiket seçilemedi”)
KeyboardInterrupt hariç:
print(“yazma hatası”)
tanım do_read():
True iken:
deneyin:
(stat, etiket_türü) = rdr.request(rdr.REQIDL)
eğer stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
eğer stat == rdr.OK:
print(“Yeni kart algılandı”)
print(” – etiket tipi: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
yazdır (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
Yazdır("")
rdr.select_tag(raw_uid) == rdr.OK ise:
anahtar = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, anahtar, raw_uid) == rdr.OK:
print(“Adres 8 verisi: %s” % rdr.read(8))
staff_id içindeki ps için:
if raw_uid[0:4:1] == staff_id.get(ps):
suos.değer(1)
yazdır(ps)
uart_write(ps, *raw_uid[0:4:1])
time.sleep (3)
uart2.sendbreak()
kırılma
rdr.stop_crypto1()
time.sleep (3)
suos.değer(0)
Başka:
print(“Doğrulama hatası”)
Başka:
print(“Etiket seçilemedi”)
uart2.any()>1 ise:
rx2 = []
veri_adı2 = ”
bin_veri = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_veri)
rx1'deki öğe için:
rx2.append(chr(öğe))
yazdır(rx2)
rx1[3:5:1] == button_cmd ise:
veri_adı_len = rx1[6] – 1
veri_adı = rx2[7:veri_adı_len+7:1]
data_name2 = ”.join(veri_adı)
yazdır(veri_adı2)
if data_name2 == 'back3':
dönüş
KeyboardInterrupt hariç:
print(“okuma hatası”)
def do_read2 (idd):
yazdır(idd)
True iken:
deneyin:
(stat, etiket_türü) = rdr.request(rdr.REQIDL)
eğer stat == rdr.OK:
(stat, raw_uid) = rdr.anticoll()
eğer stat == rdr.OK:
print(“Yeni kart algılandı”)
print(” – etiket tipi: 0x%02x” % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
yazdır (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
Yazdır("")
rdr.select_tag(raw_uid) == rdr.OK ise:
anahtar = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
if rdr.auth(rdr.AUTHENT1A, 8, anahtar, raw_uid) == rdr.OK:
print(“Adres 8 verisi: %s” % rdr.read(8))
staff_id[idd] = raw_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
Başka:
print(“Doğrulama hatası”)
Başka:
print(“Etiket seçilemedi”)
uart2.any()>1 ise:
rx2 = []
veri_adı2 = ”
bin_veri = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_veri)
rx1'deki öğe için:
rx2.append(chr(öğe))
rx1[3:5:1] == button_cmd ise:
veri_adı_len = rx1[6] – 1
veri_adı = rx2[7:veri_adı_len+7:1]
data_name2 = ”.join(veri_adı)
yazdır(veri_adı2)
if data_name2 == 'back1':
dönüş
KeyboardInterrupt hariç:
print(“okuma hatası”)
def uart_write(metin, *kimlikler):
# print(metin, *id)
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″,”metin”:”””}>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')
tanım uart_write2(metin,metin2):
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')
tanım 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”,”metin”:”””}>ET')
tanım uart_write4(metin,metin2):
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')
tanımlı 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”,”metin”:”””}>ET')
def kart_zhuce():
True iken:
eğer uart2.any():
kullanıcı_kimliği = ”
şifre = ”
rx2 = []
rx_say = 0
bin_veri = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_veri)
rx1'deki öğe için:
rx2.append(chr(öğe))
rx_say += 1
veri_end = rx_num-5
veri_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
yazdır(veri_id_st2)
data_id_st2 == 'edit1' ise:
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
yazdır(veri_id_st4)
eğer data_id_st4 != ”:
isim = Doğru
elif data_id_st2 == 'düzenleme2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
data_id_st6 == admin_password ise:
yönetici = Doğru
uart_write2('Doğrulama geçti!','Lütfen kartı yerleştirin!')
do_read2(veri_id_st4)
dönüş
tanım mima_zuce():
temp_id3 = ”
temp_mima3 = ”
True iken:
eğer uart2.any():
kullanıcı_kimliği = ”
şifre = ”
rx2 = []
rx_say = 0
# data_end = 0
bin_veri = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_veri)
rx1'deki öğe için:
rx2.append(chr(öğe))
rx_say += 1
# if (rx2[rx_num] == 'T') ve (rx2[rx_num-1] == 'E') ve (rx2[rx_num-2] == '>'):
# kırmak
veri_end = rx_num-5
veri_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
yazdır(veri_id_st2)
rx1[3:5:1] == button_cmd ise:
veri_adı_len = rx1[6] – 1
veri_adı = rx2[7:veri_adı_len+7:1]
data_name2 = ”.join(veri_adı)
yazdır(veri_adı2)
if data_name2 == 'back2':
dönüş
data_id_st2 == 'edit3' ise:
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
yazdır(veri_id_st4)
user_id_flag = Doğru
temp_id3 = data_id_st4
# staff_ps[temp_id] = raw_uid[0:4:1]
elif data_id_st2 == 'düzenleme4':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
yazdır(veri_id_st6)
# if staff_ps.get(temp_id) == data_id_st6:
password_flag = Doğru
temp_mima3 = data_id_st6
# staff_ps[temp_id] = password_flag
# print(rx2,user_id_flag,şifre_flag)
elif data_id_st2 == 'düzenleme7':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
if (data_id_st6 == admin_password) ve (password_flag == True) ve (user_id_flag == True):
yönetici = Doğru
personel_ps[temp_id3] = temp_mima3
password_flag = Yanlış
user_id_flag = Yanlış
uart_write4('Doğrulama geçti!','giriş başarılı!')
def şifre_loin():
temp_id2 = ”
temp_mima = ”
True iken:
eğer uart2.any():
kullanıcı_kimliği = ”
şifre = ”
rx2 = []
rx_say = 0
# data_end = 0
bin_veri = uart2.read(40)
uart2.sendbreak()
rx1 = liste(bin_veri)
rx1'deki öğe için:
rx2.append(chr(öğe))
rx_say += 1
# if (rx2[rx_num] == 'T') ve (rx2[rx_num-1] == 'E') ve (rx2[rx_num-2] == '>'):
# kırmak
veri_end = rx_num-5
veri_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
yazdır(veri_id_st2)
rx1[3:5:1] == button_cmd ise:
veri_adı_len = rx1[6] – 1
veri_adı = rx2[7:veri_adı_len+7:1]
data_name2 = ”.join(veri_adı)
yazdır(veri_adı2)
if data_name2 == 'back4':
dönüş
data_id_st2 == 'edit5' ise:
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
yazdır(veri_id_st4)
staff_ps'de data_id_st4 ise:
user_id_flag = Doğru
temp_id2 = data_id_st4
elif data_id_st2 == 'düzenleme6':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
yazdır(veri_id_st6)
yazdır(temp_id2)
yazdır(personel_ps)
eğer staff_ps.get(temp_id2) == data_id_st6:
password_flag = Doğru
# print(rx2,user_id_flag,şifre_flag)
print(user_id_flag,şifre_flag)
if (password_flag == True) ve (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = Yanlış
user_id_flag = Yanlış
suos.değer(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('öğrenci',")
suos.değer(0)
uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″,”visible”:false}>ET')
uart2.sendbreak()
True iken:
uart2.any()>1 ise:
rx2 = []
veri_adı2 = ”
bin_veri = uart2.read(40)
# zaman.uyku(1)
uart2.sendbreak()
# zaman.uyku(1)
rx1 = liste(bin_veri)
rx1'deki öğe için:
rx2.append(chr(öğe))
yazdır(rx2)
rx1[3:5:1] == button_cmd ise:
veri_adı_len = rx1[6] – 1
veri_adı = rx2[7:veri_adı_len+7:1]
data_name2 = ”.join(veri_adı)
yazdır(veri_adı2)
eğer data_name2 == 'kart1':
kart_zhuce()
elif data_name2 == 'şifre1':
mima_zuce()
elif data_name2 == 'kart2':
oku_oku()
elif data_name2 == 'şifre2':
şifre_loin()
MFRC522.py
makineden içe aktarma Pin, SPI
os import uname'den
sınıf MFRC522:
Tamam = 0
NOTAGER = 1
HATA = 2
GEREKLİ = 0x26
İSTEK = 0x52
KİMLİK1A = 0x60
KİMLİK1B = 0x61
def __init__(self, sck, mosi, miso, rst, cs):
self.sck = Pin(sck, Pin.OUT)
self.mosi = Pin(mosi, Pin.OUT)
self.miso = Sabitle(miso)
self.rst = Pin(rst, Pin.OUT)
self.cs = Pin(cs, Pin.OUT)
self.rst.value(0)
self.cs.value(1)
pano = unname()[0]
if board == 'WiPy' veya board == 'LoPy' veya board == 'FiPy':
self.spi = SPI(0)
self.spi.init(SPI.MASTER, baud hızı=1000000, pinler=(self.sck, self.mosi, self.miso))
elif kartı == 'esp32':
self.spi = SPI(baudrate=100000, polarite=0, faz=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
self.spi.init()
Başka:
RuntimeError'ı yükselt ("Desteklenmeyen platform")
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(kendisi, 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)
dönüş değeri[0]
def _sflags(self, reg, mask):
self._wreg(reg, self._rreg(reg) | maske)
def _cflags(kendi, kayıt, maske):
self._wreg(reg, self._rreg(reg) & (~mask))
def _tocard(kendi kendine, cmd, gönder):
geri alma = []
bitler = irq_en = wait_irq = n = 0
istatistik = öz.ERR
cmd == 0x0E ise:
irq_tr = 0x12
bekle_irq = 0x10
elif cmd == 0x0C:
irq_tr = 0x77
bekle_irq = 0x30
self._wreg(0x02, irq_en | 0x80)
self._cflags(0x04, 0x80)
self._sflags(0x0A, 0x80)
self._wreg(0x01, 0x00)
gönderilen c için:
self._wreg(0x09, c)
self._wreg(0x01, cmd)
cmd == 0x0C ise:
self._sflags(0x0D, 0x80)
i = 2000
True iken:
n = self._rreg(0x04)
ben -= 1
~((i != 0) ve ~(n & 0x01) ve ~(n & wait_irq) ise):
kırılma
self._cflags(0x0D, 0x80)
Eğer ben:
if (self._rreg(0x06) & 0x1B) == 0x00:
stat = kendini.Tamam
n & irq_en & 0x01 ise:
stat = self.NOTAGERR
elif cmd == 0x0C:
n = self._rreg(0x0A)
lbits = self._rreg(0x0C) & 0x07
lbit ise != 0:
bit = (n – 1) * 8 + lbit
Başka:
bit = n * 8
n == 0 ise:
n = 1
elif n > 16:
n = 16
(n) aralığındaki _ için:
recv.append(self._rreg(0x09))
Başka:
istatistik = öz.ERR
dönüş stat, recv, bit
def _crc(kendi, veri):
self._cflags(0x05, 0x04)
self._sflags(0x0A, 0x80)
verilerde c için:
self._wreg(0x09, c)
self._wreg(0x01, 0x03)
ben = 0xFF
True iken:
n = self._rreg(0x05)
ben -= 1
değilse ((i != 0) ve değilse (n & 0x04)):
kırılma
dönüş [self._rreg(0x22), self._rreg(0x21)]
tanım başlangıç(kendi):
kendini sıfırla()
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 sıfırlama(kendi):
self._wreg(0x01, 0x0F)
def anten_on(self, on=True):
açıksa ve ~(self._rreg(0x14) & 0x03):
self._sflags(0x14, 0x03)
Başka:
self._cflags(0x14, 0x03)
def request(self, mod):
self._wreg(0x0D, 0x07)
(stat, recv, bit) = self._tocard(0x0C, [mod])
if (stat != self.OK) | (bitler != 0x10):
istatistik = öz.ERR
dönüş stat, bit
def anticoll(kendi):
ser_chk = 0
seri = [0x93, 0x20]
self._wreg(0x0D, 0x00)
(stat, recv, bit) = self._tocard(0x0C, ser)
if stat == self.Tamam:
len(recv) == 5 ise:
i aralığında (4):
ser_chk = ser_chk ^ recv[i]
ser_chk != recv[4] ise:
istatistik = öz.ERR
Başka:
istatistik = öz.ERR
dönüş stat, recv
def select_tag(kendisi, ser):
tampon = [0x93, 0x70] + seri[:5]
tampon += self._crc(tampon)
(stat, recv, bit) = self._tocard(0x0C, buf)
geri self.OK if (stat == self.OK) ve (bit == 0x18) else self.ERR
def auth(self, mode, addr, sekt, ser):
dönüş self._tocard(0x0E, [mod, adres] + sect + ser[:4])[0]
def stop_crypto1(kendi kendine):
self._cflags(0x08, 0x08)
def okuma(kendi, adres):
veri = [0x30, adres]
veri += self._crc(veri)
(stat, recv, _) = self._tocard(0x0C, veri)
stat == self ise recv döndür. Tamam başka Yok
def yazma(self, addr, data):
arabellek = [0xA0, adres]
tampon += self._crc(tampon)
(stat, recv, bit) = self._tocard(0x0C, buf)
değilse (stat == self.OK) veya not (bit == 4) veya değil ((recv[0] & 0x0F) == 0x0A):
istatistik = öz.ERR
Başka:
tampon = []
i aralığında (16):
tampon.append(veri[i])
tampon += self._crc(tampon)
(stat, recv, bit) = self._tocard(0x0C, buf)
değilse (stat == self.OK) veya not (bit == 4) veya değil ((recv[0] & 0x0F) == 0x0A):
istatistik = öz.ERR
dönüş statüsü
Kaynak: Plato Data Intelligence