2016-06-07 2 views
-1

Итак, я написал этот код python в своем RPI, чтобы создать цифровой плакат, который говорит с моим процессором управления crestron. По какой-то причине мой код перестает отвечать через некоторое время. Я не знаю, почему. Я не знаю, будет ли мой Pi спать, но если кто-нибудь может указать что-нибудь в моем коде, что может вызвать это, пожалуйста, дайте мне знать. Python TCP Server останавливает ответ после A

РЕДАКТИРОВАТЬ: Я НАПРЯМУСЬ НА МОЕМ СОБСТВЕННОСТИ. Большое спасибо всем, кто прокомментировал.

Я создавал новый процесс FBI каждый раз, когда я проходил цикл, и я закончил тем, что использовал всю RAM Pi, пока он не остановился, потому что у него не осталось никаких проблем. Теперь я убиваю процесс ФБР после загрузки изображения, которое исправлено. Спасибо за помощь всем.

Мои функции и настройки Материал:

import socket 
import os 
import thread 
import sys 
import urllib 
from time import ctime 
from PIL import Image 
import time 
import random 
import logging 

frameBufferCommand = "sudo fbi -a -T 1 -d /dev/fb0 -noverbose " 
moviePosterLocation = "/home/pi/movieposters/" 
openBlackImage = "/home/pi/movieposters/special/black.jpg" 
killFrameBuffer = "sudo killall fbi" 
turnOffScreen = "sudo /opt/vc/bin/tvservice -o" 
turnOnScreen = "sudo /opt/vc/bin/tvservice -p" 

def splitString(input): 
    stringList = input.split("/x00/") 
    return stringList 

def displayRandomPoster(): 
    displayingPoster = False 
    fileCount = next(os.walk(moviePosterLocation))[2] #get the number of available posters 
    print('Current # Of Posters in Directory: ' + str(len(fileCount))) 

    attemptNumber = 0 

    while not displayingPoster: 
     posterToDisplay = random.randint(0, len(fileCount)) 
     print('Trying To Display A Random Poster') 
     attemptNumber += 1 

     try: 
      image = Image.open(moviePosterLocation + fileCount[posterToDisplay]) #open the current image 
      width, height = image.size 
     except IndexError as msg: 
      print("encountered an IndexError while opening an image") 
      width = 0 
      height = 0  
     except IOError as msg: 
      print(msg) 
     try: 
      conn.send(msg) 
     except socket.error as msg: 
      print("Socket Error") 


    if width > height: 
     if attemptNumber > 5: 
      print("Too Many Attempts, Stopping") 
      break 
     else: 
      print("We Think This Isnt A Poster, Trying Again")    
      continue  
    else: 
     try: 
      conn.send(" Displaying Poster: " + str(fileCount[posterToDisplay])) 
     except socket.error as msg: 
      print msg     
     os.system(frameBufferCommand + moviePosterLocation + fileCount[posterToDisplay]) 
     displayingPoster = True 
     return 

Нить, слушает, и основной цикл:

#-- CLIENT THREAD -- 

def client(conn): 
    try: 
     conn.send("Connected With Raspberry Pi") 
     os.system(frameBufferCommand + openBlackImage) 
    except socket.Error as msg: 
     print(msg) 

print(str(bindSuccess)) 

while 1:  
    dataReceived = conn.recv(1024) 
    reply = "OK.. " 
    conn.send(reply + dataReceived) 
    dataList = splitString(dataReceived) 
    print(dataList) 
    if dataList[6] == "": 
     print("dataList[6] is empty, displaying a random poster") 
     displayRandomPoster() 
    else: 
     try:  
      moviePosterURL = dataList[6]    
      splitPosterURL = moviePosterURL.split("%")    
      moviePosterFilename = splitPosterURL[7]     
      urllib.urlretrieve(moviePosterURL, moviePosterLocation + moviePosterFilename)     
      conn.send("XBMC Movie Poster Downloading") 
      conn.send("Movie Poster saved as: " + moviePosterLocation + moviePosterFilename) 
      print("Movie Poster saved as: " + moviePosterLocation + moviePosterFilename)        
     except socket.error: 
      print("Encountered Socket Error While Downloading Poster - Line 80")    
     try: 
      os.system(frameBufferCommand + moviePosterLocation + moviePosterFilename) 
      print('Opening Downloaded Poster') 
     except OSError as msg: 
      print(str(msg[0]) + str(msg[1])) 
    if not dataReceived: 
     break 
    time.sleep(1) 


#-- MAIN FUNCTION -- 

host = '' 
communicationPort = 5005 

bindSuccess = False 

crestronSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

print("Socket Created Successfully") 

try: 
    crestronSocket.bind((host, communicationPort)) 
    bindSuccess = True 
except socket.Error as msg: 
    bindSuccess = False 
    print("Socket Bind Error" + msg) 
    sys.exit() 

crestronSocket.listen(1) 
print("Crestron Socket Listening") 

while bindSuccess == True: 
    #wait to accept a connection - blocking call 
    conn, addr = crestronSocket.accept() 
    print('Connected with Client: ' + addr[0] + ':' + str(addr[1]))  
    thread.start_new_thread(client , (conn,)) 
crestronSocket.close() 
+0

Путь слишком много кода. Попробуйте обрезать его до [MVCE] (http://stackoverflow.com/help/mcve). –

+0

@LexScarisbrick вы имеете в виду для целей отладки? – ryanjblajda

+0

Пожалуйста, прочитайте ссылку в моем другом комментарии. Суть в том, что чем больше людей кода просеивают, тем меньше вероятность получить ответ. –

ответ

0

я создавал новый процесс ФБР каждый раз, когда я прошел через петлю, и я закончил тем, что использовал всю RAM Pi, пока она не остановилась, потому что у нее не осталось никаких проблем. Теперь я убиваю процесс ФБР после загрузки изображения, которое исправлено. Спасибо за помощь всем.

Я также выяснил некоторые другие вещи, которые заставляют его работать лучше/плавно.

Смежные вопросы