NFCpy에 UI를 추가하고 싶습니다.

15681 단어 파이썬MacpygameNFC

동기



리더 위에 뭔가 올리면 정보가 표시되는 것을 만들고 싶다.
예를 들어, 마약을 올리면 무엇에 사용할 것인지 표시되거나 여러 가지 사용할 수 있습니다.

구성



쉽게 할 수 있을까 생각했습니다만, 솜씨 부족 때문에 어려웠습니다
결과에서 말하면, UI와 Reader를 나누어, watchdog로 텍스트 감시해 변화가 있으면 내용을 읽는 방식으로 했습니다
안 되었던 것은, 1 파일로 같은 루프내에 쓰면 어느 쪽인가가 멈추는, Scocket 통신에서도 멈추었습니다

스크립트



실행 파일과 동일한 계층 구조에 temp/nfc.txt가 있으며,
Reader -> nfc.txt 쓰기
UI  -> nfc.txt 감시 변화가 있으면 내용을 읽는다 tag1,2,3이면 대응한 정지화면을 표시

Reader



nfcsimple.py
import nfc
import binascii
import sys
import os

globalDirpath = os.path.dirname(__file__)
txtpath = globalDirpath+'/temp/nfc.txt'

def on_connect(tag):

    if tag.ndef:
        if tag.ndef.length > 0:
            print("NDEF Message:")
            for i, record in enumerate(tag.ndef.records):
                print(record.text) #tag1
                with open(txtpath, mode='w') as f:
                    f.write(record.text)

    return True



def main():

    while True:
        with nfc.ContactlessFrontend("usb") as clf:
            rdwr = {
                'on-connect': on_connect
            }
            clf.connect(rdwr=rdwr)


if __name__ == '__main__':
    main()


우이



ui.py
import pygame
import sys
import os
from pygame.locals import *
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import threading

imgBtlBG = pygame.image.load("img/bg.jpg")
imgBtl1 = pygame.image.load("img/01.jpg")
imgBtl2 = pygame.image.load("img/02.jpg")
imgBtl3 = pygame.image.load("img/03.jpg")

globalDirpath = os.path.dirname(__file__)
dirpath = globalDirpath+'/temp/'

class ChangeHandler(FileSystemEventHandler):

    isPlay = False
    NfcTag = "None"

    def StopOverlay(self):
        self.isPlay = False
        self.NfcTag = "None"

    def on_modified(self, event):
        filepath = event.src_path
        filename = os.path.basename(filepath)
        if filename=="nfc.txt":
            with open(filepath) as f:
                s = f.read()
                print(s)
                self.isPlay = True
                self.NfcTag = s
                t=threading.Timer(3,self.StopOverlay)
                t.start()


event_handler = ChangeHandler()
observer = Observer()
observer.schedule(event_handler, dirpath, recursive=True)
observer.start()

def draw(bg):
    global isPlay,NfcTag

    if event_handler.isPlay:
        if  event_handler.NfcTag=="tag1":
            bg.blit(imgBtl1, [0,0])
        elif event_handler.NfcTag=="tag2":
            bg.blit(imgBtl2, [0,0])
        elif event_handler.NfcTag=="tag3":
            bg.blit(imgBtl3, [0,0])
    else:
        bg.blit(imgBtlBG, [0, 0])



def main():
    pygame.init()
    pygame.display.set_caption("Title")
    flags = pygame.DOUBLEBUF | pygame.HWSURFACE | pygame.FULLSCREEN
    screen = pygame.display.set_mode((0, 0), flags)
    clock = pygame.time.Clock()

    while True:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                observer.stop()
                observer.join()
                pygame.quit()
                sys.exit()


        draw(screen)
        pygame.display.update()

        clock.tick(30)

if __name__ == '__main__':
    main()


실행



cd/projectdir
python3 nfcsimple.py & python3 ui.py

gif





youtube 모든 패턴



태그에 쓰는 경우 여기

좋은 웹페이지 즐겨찾기