Pengantar singkat
Rumah pintar menjadi semakin umum dengan perkembangan teknologi, artikel ini akan fokus pada aspek keamanan dari proyek kontrol akses cerdas.
Artikel ini menggunakan Layar sentuh BATU untuk mengirim perintah ke MCU untuk mengontrol relai dan modul MFRC522.
Prinsip membaca kartu: dengan menggerakkan modul RFID-RC522, mengidentifikasi ID kartu ID dekat dengan kartu ID, dan kemudian menentukan apakah ID ada di database kata khas, ID adalah nilai khas kata, jika keberadaan verifikasi melalui , lalu cetak nama yang sesuai, lalu dorong kunci elektromagnetik dengan cara yang sama.
Bahan yang dibutuhkan
- ESP32
- kunci elektronik KOB
- menyampaikan
- BATU STWI070WT-01 layar panel sentuh
- Modul MFRC522
Fungsi yang direalisasikan
- pendaftaran kartu.
- pendaftaran nama pengguna dan kata sandi.
- gesek kartu untuk membuka kunci elektronik.
- Nama pengguna dan kata sandi untuk membuka kunci elektronik.
Deskripsi perangkat keras utama
Modul RFID
Modul ini dapat langsung dimuat ke berbagai modul pembaca. Ini menggunakan tegangan 3.3V, melalui antarmuka SPI hanya dengan beberapa kabel. Terhubung langsung dengan motherboard CPU, modul ini dapat bekerja dengan stabil dan andal sebagai pembaca kartu jarak jauh.
STWI070WT-01 telah disusun sebagai monitor TFT & pengontrol Sentuh. Ini termasuk prosesor, program kontrol, driver, memori flash, port RS232/RS422/RS485/TTL/LAN, Wi-Fi/Bluetooth, layar sentuh, catu daya, dll., Jadi ini adalah sistem tampilan keseluruhan berdasarkan yang kuat & mudah sistem operasi, yang dapat dikendalikan oleh Setiap MCU.
desain GUI
Berbagi kode
impor mfrc522
waktu impor
impor _utas
dari os impor uname
dari pin impor mesin, UART
#dari pyb impor UART
#mesin impor
suos = Pin(32,Pin.OUT)
uart2 = UART(2, baudrate=115200, rx=16,tx=17,waktu habis=10)
ESP32_HSPI_JAM = 14
ESP32_HSPI_SLAVE_SELECT = 15
ESP32_HSPI_MISO = 12
ESP32_HSPI_MOSI = 13
ESP32_MFRC522_RST = 5
rx3 = []
rx_nama = []
user_id_flag = Salah
password_flag = Salah
suhu_id = ”
suhu_mima = ”
personil_id = {'zbw':[236,230,169,47],'lbw':[19,165,93,4]}
personel_ps = {'zbw':'zbw3366′,'lbw':'lbwnb'}
admin_password = ('yyds')
tombol_cmd = [16,1]
edit1_cmd = [16,112]
edit2_cmd = [16,113]
edit3_cmd = [16,114]
jika uname()[0] == 'esp32':
rdr = mfrc522.MFRC522(ESP32_HSPI_JAM, ESP32_HSPI_MOSI, ESP32_HSPI_MISO, ESP32_MFRC522_RST, ESP32_HSPI_SLAVE_SELECT)
def do_write():
coba:
(stat, jenis_tag) = rdr.permintaan(rdr.REQIDL)
jika stat == rdr.OK:
(status, raw_uid) = rdr.anticoll()
jika stat == rdr.OK:
print("Kartu baru terdeteksi")
print(" – jenis tag: 0x%02x" % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
mencetak("")
jika rdr.select_tag(raw_uid) == rdr.OK:
kunci = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
jika rdr.auth(rdr.AUTHENT1A, 8, kunci, 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()
jika stat == rdr.OK:
print("Data ditulis ke kartu")
lain:
print("Gagal menulis data ke kartu")
lain:
print("Kesalahan otentikasi")
lain:
print("Gagal memilih tag")
kecuali KeyboardInterrupt:
print("kesalahan penulisan")
def do_read():
sementara Benar:
coba:
(stat, jenis_tag) = rdr.permintaan(rdr.REQIDL)
jika stat == rdr.OK:
(status, raw_uid) = rdr.anticoll()
jika stat == rdr.OK:
print("Kartu baru terdeteksi")
print(" – jenis tag: 0x%02x" % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
cetak (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
mencetak("")
jika rdr.select_tag(raw_uid) == rdr.OK:
kunci = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
jika rdr.auth(rdr.AUTHENT1A, 8, kunci, raw_uid) == rdr.OK:
print(“Data alamat 8: %s” % rdr.read(8))
untuk ps di personel_id:
if raw_uid[0:4:1] == personel_id.get(ps):
suos.nilai(1)
cetak
uart_write(ps, *raw_uid[0:4:1])
time.sleep (3)
uart2.sendbreak()
istirahat
rdr.stop_crypto1()
time.sleep (3)
suos.nilai(0)
lain:
print("Kesalahan otentikasi")
lain:
print("Gagal memilih tag")
jika uart2.any()>1:
rx2 = []
data_nama2 = ”
bin_data = uart2.baca(40)
uart2.sendbreak()
rx1 = daftar(bin_data)
untuk item di rx1:
rx2.tambahkan(chr(item))
cetak(rx2)
jika rx1[3:5:1] == button_cmd:
nama_data_len = rx1[6] – 1
nama_data = rx2[7:nama_data_len+7:1]
data_name2 = ”.join(nama_data)
cetak(nama_data2)
jika data_name2 == 'back3':
kembali
kecuali KeyboardInterrupt:
print("kesalahan membaca")
def do_read2 (id):
cetak (id)
sementara Benar:
coba:
(stat, jenis_tag) = rdr.permintaan(rdr.REQIDL)
jika stat == rdr.OK:
(status, raw_uid) = rdr.anticoll()
jika stat == rdr.OK:
print("Kartu baru terdeteksi")
print(" – jenis tag: 0x%02x" % tag_type)
print(” – uid : 0x%02x%02x%02x%02x” % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3]))
cetak (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
mencetak("")
jika rdr.select_tag(raw_uid) == rdr.OK:
kunci = [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
jika rdr.auth(rdr.AUTHENT1A, 8, kunci, raw_uid) == rdr.OK:
print(“Data alamat 8: %s” % rdr.read(8))
personal_id[idd] = raw_uid[0:4:1]
uart_write3(*raw_uid[0:4:1])
rdr.stop_crypto1()
lain:
print("Kesalahan otentikasi")
lain:
print("Gagal memilih tag")
jika uart2.any()>1:
rx2 = []
data_nama2 = ”
bin_data = uart2.baca(40)
uart2.sendbreak()
rx1 = daftar(bin_data)
untuk item di rx1:
rx2.tambahkan(chr(item))
jika rx1[3:5:1] == button_cmd:
nama_data_len = rx1[6] – 1
nama_data = rx2[7:nama_data_len+7:1]
data_name2 = ”.join(nama_data)
cetak(nama_data2)
jika data_name2 == 'back1':
kembali
kecuali KeyboardInterrupt:
print("kesalahan membaca")
def uart_write(teks, *id):
# cetak(teks, *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(id)+'”}>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(teks,teks2):
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(teks,teks2):
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():
sementara Benar:
jika uart2.any():
ID_pengguna = ”
kata sandi = ”
rx2 = []
rx_num = 0
bin_data = uart2.baca(40)
uart2.sendbreak()
rx1 = daftar(bin_data)
untuk item di rx1:
rx2.tambahkan(chr(item))
rx_num += 1
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
cetak(data_id_st2)
jika data_id_st2 == 'edit1':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
cetak(data_id_st4)
jika data_id_st4 != ”:
nama = benar
elif data_id_st2 == 'edit2':
data_id_st5 = rx2[15:data_end:1]
data_id_st6 = ”.join(data_id_st5)
jika data_id_st6 == admin_password:
admin = benar
uart_write2('Verifikasi lulus!','Silakan letakkan kartunya!')
lakukan_baca2(data_id_st4)
kembali
def mima_zuce():
temp_id3 = ”
suhu_mima3 = ”
sementara Benar:
jika uart2.any():
ID_pengguna = ”
kata sandi = ”
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.baca(40)
uart2.sendbreak()
rx1 = daftar(bin_data)
untuk item di rx1:
rx2.tambahkan(chr(item))
rx_num += 1
# if (rx2[rx_num] == 'T') dan (rx2[rx_num-1] == 'E') dan (rx2[rx_num-2] == '>'):
# merusak
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
cetak(data_id_st2)
jika rx1[3:5:1] == button_cmd:
nama_data_len = rx1[6] – 1
nama_data = rx2[7:nama_data_len+7:1]
data_name2 = ”.join(nama_data)
cetak(nama_data2)
jika data_name2 == 'back2':
kembali
jika data_id_st2 == 'edit3':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
cetak(data_id_st4)
user_id_flag = Benar
temp_id3 = data_id_st4
# personel_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)
cetak(data_id_st6)
# jika personel_ps.get(temp_id) == data_id_st6:
password_flag = Benar
temp_mima3 = data_id_st6
# personel_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) dan (password_flag == True) dan (user_id_flag == True):
admin = benar
personel_ps[temp_id3] = temp_mima3
password_flag = Salah
user_id_flag = Salah
uart_write4('Verifikasi lulus!','login berhasil!')
def kata sandi_loin():
temp_id2 = ”
suhu_mima = ”
sementara Benar:
jika uart2.any():
ID_pengguna = ”
kata sandi = ”
rx2 = []
rx_num = 0
# data_end = 0
bin_data = uart2.baca(40)
uart2.sendbreak()
rx1 = daftar(bin_data)
untuk item di rx1:
rx2.tambahkan(chr(item))
rx_num += 1
# if (rx2[rx_num] == 'T') dan (rx2[rx_num-1] == 'E') dan (rx2[rx_num-2] == '>'):
# merusak
data_end = rx_num-5
data_id_st = rx2[8:13:1]
data_id_st2 = ”.join(data_id_st)
cetak(data_id_st2)
jika rx1[3:5:1] == button_cmd:
nama_data_len = rx1[6] – 1
nama_data = rx2[7:nama_data_len+7:1]
data_name2 = ”.join(nama_data)
cetak(nama_data2)
jika data_name2 == 'back4':
kembali
jika data_id_st2 == 'edit5':
data_id_st3 = rx2[15:data_end:1]
data_id_st4 = ”.join(data_id_st3)
cetak(data_id_st4)
jika data_id_st4 di personel_ps:
user_id_flag = Benar
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)
cetak(data_id_st6)
cetak(temp_id2)
cetak(personel_ps)
jika personel_ps.get(temp_id2) == data_id_st6:
password_flag = Benar
# print(rx2,user_id_flag,password_flag)
cetak(user_id_flag,password_flag)
if (password_flag == True) dan (user_id_flag == True):
uart_write(temp_id2,temp_id2)
password_flag = Salah
user_id_flag = Salah
suos.nilai(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('siswa',”)
suos.nilai(0)
uart2.write('ST<{“cmd_code”:”set_visible”,”type”:”widget”,”widget”:”lock2″,”visible”:false}>ET')
uart2.sendbreak()
sementara Benar:
jika uart2.any()>1:
rx2 = []
data_nama2 = ”
bin_data = uart2.baca(40)
# waktu.tidur(1)
uart2.sendbreak()
# waktu.tidur(1)
rx1 = daftar(bin_data)
untuk item di rx1:
rx2.tambahkan(chr(item))
cetak(rx2)
jika rx1[3:5:1] == button_cmd:
nama_data_len = rx1[6] – 1
nama_data = rx2[7:nama_data_len+7:1]
data_name2 = ”.join(nama_data)
cetak(nama_data2)
jika data_name2 == 'card1':
kartu_zhuce()
elif data_name2 == 'password1':
mima_zuce()
elif data_name2 == 'card2':
lakukan_baca()
elif data_name2 == 'password2':
kata sandi_ pinggang()
MFRC522.py
dari pin impor mesin, SPI
dari os impor uname
kelas MFRC522:
Oke = 0
PEMBERITAHUAN = 1
KESALAHAN = 2
PERSYARATAN = 0x26
PERTANYAAN = 0x52
ASLI1A = 0x60
ASLI1B = 0x61
def __init__(sendiri, sck, mosi, miso, pertama, cs):
self.sck = Pin(sck, Pin.OUT)
self.mosi = Pin(mosi, Pin.OUT)
self.miso = Pin(miso)
self.rst = Pin(pertama, Pin.OUT)
self.cs = Pin(cs, Pin.OUT)
diri.pertama.nilai(0)
diri.cs.nilai(1)
papan = unama()[0]
jika papan == 'WiPy' atau papan == 'LoPy' atau papan == 'FiPy':
diri.spi = SPI(0)
self.spi.init(SPI.MASTER, baudrate=1000000, pin=(self.sck, self.mosi, self.miso))
papan elif == 'esp32':
self.spi = SPI(baudrate=100000, polaritas=0, fase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
diri.spi.init()
lain:
meningkatkan RuntimeError("Platform tidak didukung")
diri.pertama.nilai(1)
diri.init()
def _wreg(sendiri, reg, val):
diri.cs.nilai(0)
self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))
self.spi.write(b'%c' % int(0xff & val))
diri.cs.nilai(1)
def _rreg(sendiri, reg):
diri.cs.nilai(0)
self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))
val = self.spi.baca(1)
diri.cs.nilai(1)
nilai kembali[0]
def _sflags(mandiri, reg, topeng):
self._wreg(reg, self._rreg(reg) | topeng)
def _cflags(mandiri, reg, topeng):
self._wreg(reg, self._rreg(reg) & (~mask))
def _tocard(sendiri, cmd, kirim):
terima = []
bit = irq_en = wait_irq = n = 0
stat = diri.ERR
jika cmd == 0x0E:
irq_en = 0x12
tunggu_irq = 0x10
elif cmd == 0x0C:
irq_en = 0x77
tunggu_irq = 0x30
diri._wreg(0x02, irq_en | 0x80)
diri._cflags(0x04, 0x80)
self._sflags (0x0A, 0x80)
diri._wreg(0x01, 0x00)
untuk c di kirim:
diri._wreg(0x09, c)
diri._wreg(0x01, cmd)
jika cmd == 0x0C:
diri._sflags(0x0D, 0x80)
i = 2000
sementara Benar:
n = diri._rreg(0x04)
saya -= 1
jika ~((i != 0) dan ~(n & 0x01) dan ~(n & wait_irq)):
istirahat
diri._cflags(0x0D, 0x80)
jika saya:
if (self._rreg(0x06) & 0x1B) == 0x00:
stat = diri sendiri.OK
jika n & irq_en & 0x01:
stat = diri.NOTAGERR
elif cmd == 0x0C:
n = diri._rreg(0x0A)
lbs = self._rreg(0x0C) & 0x07
jika lbit != 0:
bit = (n – 1) * 8 + lbit
lain:
bit = n * 8
jika n == 0:
n = 1
elif n > 16:
n = 16
untuk _ dalam rentang (n):
recv.append(self._rreg(0x09))
lain:
stat = diri.ERR
kembali stat, recv, bit
def _crc(diri, data):
diri._cflags(0x05, 0x04)
self._sflags (0x0A, 0x80)
untuk c dalam data:
diri._wreg(0x09, c)
diri._wreg(0x01, 0x03)
saya = 0xFF
sementara Benar:
n = diri._rreg(0x05)
saya -= 1
jika tidak ((i != 0) dan tidak (n & 0x04)):
istirahat
kembali [self._rreg (0x22), self._rreg (0x21)]
def init (diri sendiri):
reset sendiri()
diri._wreg(0x2A, 0x8D)
diri._wreg(0x2B, 0x3E)
self._wreg(0x2D, 30)
diri._wreg(0x2C, 0)
diri._wreg(0x15, 0x40)
diri._wreg(0x11, 0x3D)
diri.antena_on()
def reset (sendiri):
diri._wreg(0x01, 0x0F)
def antena_on(diri, aktif=Benar):
jika aktif dan ~(self._rreg(0x14) & 0x03):
self._sflags (0x14, 0x03)
lain:
diri._cflags(0x14, 0x03)
permintaan def (mandiri, mode):
diri._wreg(0x0D, 0x07)
(stat, recv, bit) = self._tocard(0x0C, [mode])
if (stat != self.OK) | (bit != 0x10):
stat = diri.ERR
kembali stat, bit
def anticol (sendiri):
ser_chk = 0
ser = [0x93, 0x20]
diri._wreg(0x0D, 0x00)
(stat, recv, bit) = self._tocard(0x0C, ser)
jika stat == self.OK:
jika len(recv) == 5:
untuk i dalam kisaran (4):
ser_chk = ser_chk ^ penerimaan[i]
jika ser_chk != recv[4]:
stat = diri.ERR
lain:
stat = diri.ERR
kembali stat, recv
def select_tag(sendiri, ser):
buf = [0x93, 0x70] + ser[:5]
buf += diri._crc(buf)
(stat, recv, bit) = self._tocard(0x0C, buf)
kembalikan self.OK jika (stat == self.OK) dan (bit == 0x18) else self.ERR
def auth(diri, mode, alamat, sekte, ser):
kembalikan self._tocard(0x0E, [mode, addr] + sekte + ser[:4])[0]
def stop_crypto1(sendiri):
diri._cflags(0x08, 0x08)
def read(sendiri, addr):
data = [0x30, tambahan]
data += diri._crc(data)
(stat, penerimaan, _) = self._tocard(0x0C, data)
kembalikan recv jika stat == self.OK else Tidak ada
def menulis (diri, addr, data):
buf = [0xA0, tambahan]
buf += diri._crc(buf)
(stat, recv, bit) = self._tocard(0x0C, buf)
jika tidak (stat == self.OK) atau tidak (bits == 4) atau tidak ((recv[0] & 0x0F) == 0x0A):
stat = diri.ERR
lain:
bu = []
untuk i dalam kisaran (16):
buf.tambahkan(data[i])
buf += diri._crc(buf)
(stat, recv, bit) = self._tocard(0x0C, buf)
jika tidak (stat == self.OK) atau tidak (bits == 4) atau tidak ((recv[0] & 0x0F) == 0x0A):
stat = diri.ERR
status kembali
Sumber: Plato Data Intelligence