IOT

STONE TFT LCD ve ESP32'ye dayalı akıllı erişim kontrolü

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

Gerçekleşen fonksiyon

  1. kart kaydı.
  2. kullanıcı adı ve şifre kaydı.
  3. elektronik kilidin kilidini açmak için kartı kaydırın.
  4. 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.

STONE TFT LCD ve ESP32 IOT PlatoBlockchain Veri Zekasını temel alan akıllı erişim kontrolü. Dikey Arama. Ai.
STONE TFT LCD ve ESP32'ye dayalı akıllı erişim kontrolü

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.

STONE TFT LCD ve ESP32 IOT PlatoBlockchain Veri Zekasını temel alan akıllı erişim kontrolü. Dikey Arama. Ai.
STONE TFT LCD ve ESP32'ye dayalı akıllı erişim kontrolü

GUI tasarımı

STONE TFT LCD ve ESP32 IOT PlatoBlockchain Veri Zekasını temel alan akıllı erişim kontrolü. Dikey Arama. Ai.
STONE TFT LCD ve ESP32'ye dayalı akıllı erişim kontrolü

Kod paylaşımı

STONE TFT LCD ve ESP32 IOT PlatoBlockchain Veri Zekasını temel alan akıllı erişim kontrolü. Dikey Arama. Ai.
STONE TFT LCD ve ESP32'ye dayalı akıllı erişim kontrolü

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