IoT

STONE TFTLCDおよびESP32に基づくインテリジェントアクセス制御

簡単な紹介

スマートホームはテクノロジーの開発とともにますます一般的になっています。この記事では、インテリジェントアクセス制御プロジェクトのセキュリティ面に焦点を当てます。

この記事は STONEのタッチスクリーン リレーとMFRC522モジュールを制御するコマンドをMCUに送信します。

カード読み取りの原則: RFID-RC522モジュールを駆動することにより、IDカードに近いIDカードIDを識別し、IDが典型的な単語のデータベースに存在するかどうかを判断します。 、次に対応する名前を印刷し、同じ方法で電磁ロックを駆動します。

必要な材料

実現機能

  1. カード登録。
  2. ユーザー名とパスワードの登録。
  3. カードをスワイプして電子ロックのロックを解除します。
  4. 電子ロックのロックを解除するためのユーザー名とパスワード。

主なハードウェアの説明

RFIDモジュール

このモジュールは、さまざまなリーダーモジュールに直接ロードできます。 数本のワイヤーでSPIインターフェースを介して3.3Vの電圧を利用します。 モジュールはCPUマザーボードに直接接続されており、距離カードリーダーとして安定した信頼性の高い方法で動作します。

STONE TFT LCD と ESP32 IOT PlatoBlockchain Data Intelligence に基づくインテリジェントなアクセス制御。 垂直検索。 あい。
STONE TFTLCDおよびESP32に基づくインテリジェントアクセス制御

STWI070WT-01はTFTモニター&タッチコントローラーとして考案されました。 プロセッサ、制御プログラム、ドライバ、フラッシュメモリ、RS232 / RS422 / RS485 / TTL / LANポート、Wi-Fi / Bluetooth、タッチスクリーン、電源などが含まれているため、パワフルで簡単なディスプレイシステム全体です。オペレーティングシステム。任意のMCUで制御できます。

STONE TFT LCD と ESP32 IOT PlatoBlockchain Data Intelligence に基づくインテリジェントなアクセス制御。 垂直検索。 あい。
STONE TFTLCDおよびESP32に基づくインテリジェントアクセス制御

GUIデザイン

STONE TFT LCD と ESP32 IOT PlatoBlockchain Data Intelligence に基づくインテリジェントなアクセス制御。 垂直検索。 あい。
STONE TFTLCDおよびESP32に基づくインテリジェントアクセス制御

コードシェア

STONE TFT LCD と ESP32 IOT PlatoBlockchain Data Intelligence に基づくインテリジェントなアクセス制御。 垂直検索。 あい。
STONE TFTLCDおよびESP32に基づくインテリジェントアクセス制御

mfrc522をインポートします

インポート時間

インポート_スレッド

os importunameから

マシンインポートピン、UARTから

#from pyb import UART

#importマシン

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

パスワードフラグ = False

temp_id =”

temp_mima =”

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

personal_ps = {'zbw': 'zbw3366'、 'lbw': 'lbwnb'}

admin_password =( 'yyds')

button_cmd = [16,1]

edit1_cmd = [16,112]

edit2_cmd = [16,113]

edit3_cmd = [16,114]

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

試してみてください。

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

stat == rdr.OKの場合:

(stat、raw_uid)= rdr.anticoll()

stat == rdr.OKの場合:

print(「新しいカードが検出されました」)

print(” –タグタイプ:0x%02x”%tag_type)

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

print(“”)

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

stat == rdr.OKの場合:

print(「カードに書き込まれたデータ」)

その他:

print( "カードへのデータの書き込みに失敗しました")

その他:

print( "認証エラー")

その他:

print( "タグの選択に失敗しました")

KeyboardInterruptを除く:

print(“書き込みエラー”)

def do_read():

Trueの場合:

試してみてください。

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

stat == rdr.OKの場合:

(stat、raw_uid)= rdr.anticoll()

stat == rdr.OKの場合:

print(「新しいカードが検出されました」)

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

print(“”)

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

personal_idのpsの場合:

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

破る

rdr.stop_crypto1()

time.sleep(3)

suos.value(0)

その他:

print( "認証エラー")

その他:

print( "タグの選択に失敗しました")

uart2.any()> 1の場合:

rx2 = []

data_name2 =”

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = list(bin_data)

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

if data_name2 == 'back3':

return

KeyboardInterruptを除く:

print( "読み取りエラー")

def do_read2(idd):

print(idd)

Trueの場合:

試してみてください。

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

stat == rdr.OKの場合:

(stat、raw_uid)= rdr.anticoll()

stat == rdr.OKの場合:

print(「新しいカードが検出されました」)

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

print(“”)

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

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

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

rdr.stop_crypto1()

その他:

print( "認証エラー")

その他:

print( "タグの選択に失敗しました")

uart2.any()> 1の場合:

rx2 = []

data_name2 =”

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = list(bin_data)

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

if data_name2 == 'back1':

return

KeyboardInterruptを除く:

print( "読み取りエラー")

def uart_write(text、* ids):

#print(text、* ids)

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(text、text2):

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(text、text2):

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

Trueの場合:

uart2.any()の場合:

user_id =”

パスワード=”

rx2 = []

rx_num = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = list(bin_data)

rx1のアイテムの場合:

rx2.append(chr(item))

rx_num + = 1

データエンド = 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!=”:

名前= True

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)

return

def mima_zuce():

temp_id3 =”

temp_mima3 =”

Trueの場合:

uart2.any()の場合:

user_id =”

パスワード=”

rx2 = []

rx_num = 0

#data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = list(bin_data)

rx1のアイテムの場合:

rx2.append(chr(item))

rx_num + = 1

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

# 壊す

データエンド = 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_name2)

if data_name2 == 'back2':

return

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

temp_id3 = データ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 = データ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)and(password_flag == True)and(user_id_flag == True):

管理者 = 真

personnel_ps [temp_id3] = temp_mima3

パスワードフラグ = False

user_id_flag = False

uart_write4( '検証に合格しました!'、 'ログインに成功しました!')

def password_loin():

temp_id2 =”

temp_mima =”

Trueの場合:

uart2.any()の場合:

user_id =”

パスワード=”

rx2 = []

rx_num = 0

#data_end = 0

bin_data = uart2.read(40)

uart2.sendbreak()

rx1 = list(bin_data)

rx1のアイテムの場合:

rx2.append(chr(item))

rx_num + = 1

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

# 壊す

データエンド = 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_name2)

if data_name2 == 'back4':

return

if data_id_st2 == 'edit5':

data_id_st3 = rx2 [15:data_end:1]

data_id_st4 =” .join(data_id_st3)

print(data_id_st4)

personal_psのdata_id_st4の場合:

user_id_flag = True

temp_id2 = データ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)

場合personnel_ps.get(temp_id2)== data_id_st6:

password_flag = 真

#print(rx2、user_id_flag、password_flag)

print(user_id_flag、password_flag)

if(password_flag == True)および(user_id_flag == True):

uart_write(temp_id2、temp_id2)

パスワードフラグ = False

user_id_flag = False

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

Trueの場合:

uart2.any()> 1の場合:

rx2 = []

data_name2 =”

bin_data = uart2.read(40)

#time.sleep(1)

uart2.sendbreak()

#time.sleep(1)

rx1 = list(bin_data)

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

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 importunameから

クラスMFRC522:

OK = 0

ノータガー = 1

エラー = 2

REQIDL = 0x26

リコール = 0x52

AUTHENT1A = 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(rst、Pin.OUT)

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

self.rst.value(0)

self.cs.value(1)

ボード= uname()[0]

ボード== 'WiPy'またはボード== 'LoPy'またはボード== 'FiPy'の場合:

self.spi = SPI(0)

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

elif ボード == 'esp32':

self.spi = SPI(baudrate = 100000、polarity = 0、phase = 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)|マスク)

def _cflags(self、reg、mask):

self._wreg(reg、self._rreg(reg)&(〜mask))

def _tocard(self、cmd、send):

受信 = []

ビット= irq_en = wait_irq = n = 0

統計 = 自己.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)

I = 2000

Trueの場合:

n = self._rreg(0x04)

i- = 1

〜((i!= 0)および〜(n&0x01)および〜(n&wait_irq))の場合:

破る

self._cflags(0x0D、0x80)

もし私が:

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

stat = self.OK

n&irq_en&0x01の場合:

stat = self.NOTAGERR

elif cmd == 0x0C:

n = self._rreg(0x0A)

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

lbits!= 0の場合:

ビット=(n – 1)* 8 + lbits

その他:

ビット= n * 8

n == 0の場合:

N = 1

elif n> 16:

N = 16

_ in range(n)の場合:

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

その他:

統計 = 自己.ERR

統計、受信、ビットを返す

def _crc(self、data):

self._cflags(0x05、0x04)

self._sflags(0x0A、0x80)

データ内のcの場合:

self._wreg(0x09、c)

self._wreg(0x01、0x03)

i = 0xFF

Trueの場合:

n = self._rreg(0x05)

i- = 1

そうでない場合((i!= 0)およびそうでない場合(n&0x04)):

破る

return [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)

defantenna_on(self、on = True):

オンの場合〜(self._rreg(0x14)&0x03):

self._sflags(0x14、0x03)

その他:

self._cflags(0x14、0x03)

def request(self、mode):

self._wreg(0x0D、0x07)

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

if(stat!= self.OK)| (ビット!= 0x10):

統計 = 自己.ERR

統計情報、ビットを返す

def anticoll(self):

ser_chk = 0

ser = [0x93、0x20]

self._wreg(0x0D、0x00)

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

stat == self.OKの場合:

len(recv)== 5の場合:

範囲(4)のiの場合:

ser_chk = ser_chk ^ recv [i]

ser_chk!= recv [4]の場合:

統計 = 自己.ERR

その他:

統計 = 自己.ERR

統計、受信を返す

def select_tag(self、ser):

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

buf + = self._crc(buf)

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

(stat == self.OK)および(bits == 0x18)elseself.ERRの場合はself.OKを返します

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

self._tocard(0x0E、[mode、addr] + sect + ser [:4])[0]を返します

def stop_crypto1(self):

self._cflags(0x08、0x08)

def read(self、addr):

データ= [0x30、addr]

データ+ = self._crc(data)

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

stat == self.OKelseなしの場合はrecvを返します

def write(self、addr、data):

buf = [0xA0、addr]

buf + = self._crc(buf)

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

そうでない場合(stat == self.OK)またはそうでない場合(ビット== 4)またはそうでない場合((recv [0]&0x0F)== 0x0A):

統計 = 自己.ERR

その他:

buf = []

範囲(16)のiの場合:

buf.append(data [i])

buf + = self._crc(buf)

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

そうでない場合(stat == self.OK)またはそうでない場合(ビット== 4)またはそうでない場合((recv [0]&0x0F)== 0x0A):

統計 = 自己.ERR

統計を返す

出典:プラトンデータインテリジェンス