簡単な紹介
スマートホームはテクノロジーの開発とともにますます一般的になっています。この記事では、インテリジェントアクセス制御プロジェクトのセキュリティ面に焦点を当てます。
この記事は STONEのタッチスクリーン リレーとMFRC522モジュールを制御するコマンドをMCUに送信します。
カード読み取りの原則: RFID-RC522モジュールを駆動することにより、IDカードに近いIDカードIDを識別し、IDが典型的な単語のデータベースに存在するかどうかを判断します。 、次に対応する名前を印刷し、同じ方法で電磁ロックを駆動します。
必要な材料
実現機能
- カード登録。
- ユーザー名とパスワードの登録。
- カードをスワイプして電子ロックのロックを解除します。
- 電子ロックのロックを解除するためのユーザー名とパスワード。
主なハードウェアの説明
RFIDモジュール
このモジュールは、さまざまなリーダーモジュールに直接ロードできます。 数本のワイヤーでSPIインターフェースを介して3.3Vの電圧を利用します。 モジュールはCPUマザーボードに直接接続されており、距離カードリーダーとして安定した信頼性の高い方法で動作します。
STWI070WT-01はTFTモニター&タッチコントローラーとして考案されました。 プロセッサ、制御プログラム、ドライバ、フラッシュメモリ、RS232 / RS422 / RS485 / TTL / LANポート、Wi-Fi / Bluetooth、タッチスクリーン、電源などが含まれているため、パワフルで簡単なディスプレイシステム全体です。オペレーティングシステム。任意のMCUで制御できます。
GUIデザイン
コードシェア
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
統計を返す
出典:プラトンデータインテリジェンス