라즈베리 파이 3에서 실행되는 클라이언트 스크립트가 있습니다. 클라이언트가 서버에서 TRUE 또는 FALSE를 수신하고 있습니다. 그런 다음 디코딩 된 바이트와 유사한 객체를 수신하고이 정보를 사용하여 GUI에 이미지를 표시합니다.항상 socket.recv()를 평가하십시오.
GPIO 핀이 버튼 누름에서 TRUE가되는지 확인한 후 첫 번째 .recv()로 돌아갑니다.
"새 게임"이라는 메시지가 나타나면 클라이언트가 항상 확인하고, 그렇다면 첫 번째 .recv()로 이동하여 TRUE 또는 FALSE인지 확인합니다.
하지만 내 .recv() 함수 블록이 있기 때문에 거기에 붙어있는 동안 아무것도 할 수 없습니다.
GPIO 상태가 TRUE로 변경되는지 계속 확인하면서 정보를 수신하는지 어떻게 확인할 수 있습니까?
이#imports needed
import socket
import RPi.GPIO as GPIO
import time
import tkinter as tk
import pygame
#Setup of GPIO pin for buttons used as bumpers
GPIO.setmode(GPIO.BOARD)
GPIO.setup(36, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Pin 36 = GPIO16
#Setup of root window for the GUI and the different images
root = tk.Tk()
root.attributes('-fullscreen',True)
image6 = tk.PhotoImage(file="/home/pi/Desktop/wav/wrong.gif")
wronglabel = tk.Label(image=image6)
image5 = tk.PhotoImage(file="/home/pi/Desktop/wav/correct.gif")
correctlabel = tk.Label(image=image5)
image4 = tk.PhotoImage(file="/home/pi/Desktop/wav/questionmark.gif")
questionlabel = tk.Label(image=image4)
pygame.init()
#Setup of the different sounds to use in the project
correctsound = pygame.mixer.Sound('/home/pi/Desktop/wav/correct.wav')
wrongsound = pygame.mixer.Sound('/home/pi/Desktop/wav/wrong.wav')
HOST = '192.168.1.34' # The remote host,
PORT = 50007 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((HOST, PORT))
except:
print("FAILED. Sleep briefly & try again")
time.sleep(10)
continue
questionlabel.pack()
root.update()
while True:
data = s.recv(1024)
if data == b'True':
print('I am the true cone')
state = True
if data == b'False':
print('I am the false cone')
state = False
byte_string = s.recv(1024)
path = '/home/pi/Desktop/wav/%s.gif' % byte_string.decode()
questionlabel.pack_forget()
image1 = tk.PhotoImage(file=path) #x should change accordingly to the received message
Thelabel = tk.Label(image=image1)
Thelabel.pack()
root.update()
i=0
while i==0:
if GPIO.input(36) == True:
if state == True:
Thelabel.pack_forget()
correctlabel.pack()
root.update()
correctsound.play()
s.sendall(b'True Hit')
time.sleep(5)
correctlabel.pack_forget()
questionlabel.pack()
root.update()
if state == False:
Thelabel.pack_forget()
wronglabel.pack()
root.update()
wrongsound.play()
time.sleep(5)
wronglabel.pack_forget()
questionlabel.pack()
root.update()
i=1
을 비동기 I/O이며, 여러 가지 방법으로 처리 할 수 있습니다. 가능한 해결책은'select.poll'을 사용하거나, 쓰레드를 사용하거나, asynchio 모듈을 조사하는 것입니다 (다른 것들 중에서!). 'Rpi.GPIO'는 비동기 콜백 기반의 인터럽트 메카니즘을 구현하여'recv'에 대한 블로킹 호출을 계속하면서 솔루션을 구현할 수 있습니다. 어쩌면 다양한 옵션을 조사하는 데 시간이 걸릴 수 있습니다. – larsks
와우, 많은 것들이 잘못되었으므로 어디에서 시작해야할지 모르겠다./어쨌든, 당신은 클라이언트/서버를 확인하기 위해 다른 스레드가 필요하다. – dgan
@dgan 변경이나 비평을위한 제안이 자유롭게 와야한다. 올바른 메시지를받을 때이 스레드를 다른 스레드로 다시 시작하게 할 수 있습니까? –