IOT

کنترل دسترسی هوشمند بر اساس STONE TFT LCD و ESP32

معرفی مختصر

خانه های هوشمند با توسعه فناوری روز به روز رایج تر می شوند، این مقاله بر جنبه های امنیتی پروژه کنترل دسترسی هوشمند تمرکز می کند.

این مقاله استفاده می کند صفحه لمسی STONE برای ارسال دستورات به MCU برای کنترل رله و ماژول MFRC522.

اصل کارت خوانی: با رانندگی ماژول RFID-RC522، شناسه کارت شناسایی نزدیک به کارت شناسایی را شناسایی کنید، و سپس تعیین کنید که آیا شناسه در پایگاه داده کلمه معمولی وجود دارد یا خیر، ID مقدار معمول کلمه است، در صورت وجود تأیید از طریق و سپس نام مربوطه را پرینت بگیرید و سپس قفل الکترومغناطیسی را به همین ترتیب برانید.

مواد مورد نیاز

عملکرد تحقق یافته است

  1. ثبت نام کارت
  2. ثبت نام کاربری و رمز عبور
  3. برای باز کردن قفل الکترونیکی، کارت را بکشید.
  4. نام کاربری و رمز عبور برای باز کردن قفل الکترونیکی.

توضیحات سخت افزار اصلی

ماژول RFID

این ماژول می تواند به طور مستقیم در ماژول های خواننده مختلف بارگذاری شود. از ولتاژ 3.3 ولت، از طریق رابط SPI فقط با چند سیم استفاده می کند. این ماژول که مستقیماً به یک مادربرد CPU متصل می شود، می تواند به صورت پایدار و قابل اعتماد به عنوان یک کارت خوان از راه دور کار کند.

کنترل دسترسی هوشمند بر اساس STONE TFT LCD و ESP32 IOT PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.
کنترل دسترسی هوشمند بر اساس STONE TFT LCD و ESP32

STWI070WT-01 به عنوان مانیتور TFT و کنترلر لمسی در نظر گرفته شده است. این شامل پردازنده، برنامه کنترل، درایور، فلش مموری، پورت RS232/RS422/RS485/TTL/LAN، Wi-Fi/Bluetooth، صفحه نمایش لمسی، منبع تغذیه و غیره است، بنابراین یک سیستم نمایش کامل بر اساس قدرتمند و آسان است. سیستم عامل، که می تواند توسط هر MCU کنترل شود.

کنترل دسترسی هوشمند بر اساس STONE TFT LCD و ESP32 IOT PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.
کنترل دسترسی هوشمند بر اساس STONE TFT LCD و ESP32

طراحی رابط کاربری گرافیکی

کنترل دسترسی هوشمند بر اساس STONE TFT LCD و ESP32 IOT PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.
کنترل دسترسی هوشمند بر اساس STONE TFT LCD و ESP32

به اشتراک گذاری کد

کنترل دسترسی هوشمند بر اساس STONE TFT LCD و ESP32 IOT PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.
کنترل دسترسی هوشمند بر اساس STONE TFT LCD و ESP32

واردات mfrc522

زمان واردات

import _thread

از os import unname

از پین واردات ماشین، UART

#from pyb import UART

#ماشین واردات

suos = پین (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]}

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

admin_password = ("Yds")

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

تلاش كردن:

(state, 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:

چاپ ("داده های نوشته شده روی کارت")

دیگری:

چاپ ("نوشتن داده ها روی کارت ناموفق بود")

دیگری:

چاپ ("خطای احراز هویت")

دیگری:

چاپ ("انتخاب برچسب ناموفق")

به جز KeyboardInterrupt:

چاپ ("اشتباه نوشتن")

def do_read():

در حالی که درست است:

تلاش كردن:

(state, 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])

زمان. خواب (3)

uart2.sendbreak()

شکستن

rdr.stop_crypto1()

زمان. خواب (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':

برگشت

به جز KeyboardInterrupt:

چاپ ("خطای خواندن")

def do_read2 (idd):

چاپ (idd)

در حالی که درست است:

تلاش كردن:

(state, 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':

برگشت

به جز KeyboardInterrupt:

چاپ ("خطای خواندن")

def uart_write(text، *ids):

#              چاپ (متن، *شناسه)

uart2.write('STET' )

uart2.write('STET' )

uart2.write('STET')

زمان. خواب (3)

uart2.write("STET")

uart2.write("STET")

uart2.write('STET')

def uart_write2(text,text2):

uart2.write('STET')

زمان. خواب (3)

uart2.write('STET')

uart2.write("STET")

def uart_write3(*id2):

uart2.write('STET' )

زمان. خواب (3)

uart2.write('STET")

def uart_write4(text,text2):

uart2.write('STET')

زمان. خواب (1)

uart2.write('STET')

زمان. خواب (1)

uart2.write("STET")

uart2.write("STET")

uart2.write("STET")

def uart_write5():

uart2.write('STET' )

زمان. خواب (3)

uart2.write('STET")

def card_zhuce():

در حالی که درست است:

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)

اگر data_id_st6 == admin_password:

مدیر = درست است

uart_write2 («تأیید تأیید شد!»، «لطفاً کارت را قرار دهید!»)

do_read2 (data_id_st4)

برگشت

def mima_zuce():

temp_id3 = ”

temp_mima3 = ”

در حالی که درست است:

if uart2.any():

user_id = ”

رمز عبور = ”

rx2 = []

rx_num = 0

#                                              پایان_داده = 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)

اگر 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)

#                                                       اگر personnel_ps.get(temp_id) == data_id_st6:

password_flag = درست است

temp_mima3 = data_id_st6

#                                                                                             personnel_ps[temp_id] = رمز

#                                              چاپ (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):

مدیر = درست است

personel_ps[temp_id3] = temp_mima3

password_flag = نادرست

user_id_flag = نادرست

uart_write4 («تأیید تأیید شد!»، «ورود با موفقیت انجام شد!»)

Def password_loin():

temp_id2 = ”

temp_mima = ”

در حالی که درست است:

if uart2.any():

user_id = ”

رمز عبور = ”

rx2 = []

rx_num = 0

#                                              پایان_داده = 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)

اگر 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)

if 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 = درست است

#                                              چاپ (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('STET')

uart2.write("STET")

uart2.write("STET")

زمان. خواب (3)

#                                                                                                        

suos.value(0)

uart2.write('STET')

uart2.sendbreak()

در حالی که درست است:

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)

if 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

از پین واردات ماشین، SPI

از os import unname

کلاس MFRC522:

خوب = 0

NOTAGERR = 1

ERR = 2

REQIDL = 0x26

REQALL = 0x52

AUTHENT1A = 0x60

AUTHENT1B = 0x61

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

self.sck = پین (sck, Pin.OUT)

self.mosi = پین (mosi، Pin.OUT)

self.miso = پین (miso)

self.rst = پین (rst، Pin.OUT)

self.cs = پین (cs، Pin.OUT)

self.rst.value(0)

self.cs.value(1)

تابلو = uname()[0]

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

self.spi = SPI(0)

self.spi.init(SPI.MASTER، baudrate=1000000، پین=(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 = []

بیت = irq_en = انتظار_irq = n = 0

stat = self.ERR

اگر 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)

من = 2000

در حالی که درست است:

n = self._rreg(0x04)

i - = 1

اگر ~((i != 0) و ~(n & 0x01) و ~(n & wait_irq)):

شکستن

self._cflags(0x0D، 0x80)

اگر من:

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

آمار = خود. خوب

اگر n & irq_en و 0x01:

stat = خود.NOTAGERR

elif cmd == 0x0C:

n = self._rreg(0x0A)

بیت = self._rreg(0x0C) و 0x07

اگر بیت != 0:

بیت = (n – 1) * 8 + بیت

دیگری:

بیت = n * 8

اگر n == 0:

1 نفر

elif n > 16:

16 نفر

برای _ در محدوده(n):

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

دیگری:

stat = self.ERR

بازگشت آمار، recv، بیت ها

def _crc (خود، داده):

self._cflags(0x05، 0x04)

self._sflags(0x0A، 0x80)

برای c در داده:

self._wreg(0x09, c)

self._wreg (0x01، 0x03)

i = 0xFF

در حالی که درست است:

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

تنظیم مجدد (خود):

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 (خود، حالت):

self._wreg(0x0D، 0x07)

(stat، recv، بیت ها) = self._tocard(0x0C، [حالت])

if (stat != self.OK) | (بیت != 0x10):

stat = self.ERR

بازگشت آمار، بیت

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 = self.ERR

دیگری:

stat = self.ERR

بازگشت آمار، 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) else 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، addr]

داده += self._crc(داده)

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

بازگشت recv اگر stat == self. Ok other هیچ

def write (self, addr, 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 = self.ERR

دیگری:

بوف = []

برای i در محدوده (16):

buf.append(داده[i])

buf += self._crc(buf)

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

اگر نه (stat == self.OK) یا نه (bit == 4) یا نه ((recv[0] & 0x0F) == 0x0A):

stat = self.ERR

بازگشت آمار

منبع: اطلاعات داده های افلاطون