2016-06-07 94 views
-1

因此,我在RPI上编写了这个python代码,以创建一个与我的crestron控制处理器进行对话的数字海报。出于某种原因,我的代码在一段时间后停止响应。我不知道为什么。 我不知道我的Pi是否会睡觉,但如果有人可以指出我的代码中可能导致此问题的任何信息,请让我知道。 Python TCP服务器在一段时间后停止响应

编辑:我找到了我自己。非常感谢所有评论过的人。

我每次经历循环时都创建了一个新的FBI进程,并且我最终用完了所有Pi的RAM,直到它停止,因为它没有剩下任何东西。我现在杀死FBI过程后加载固定的图像。感谢大家的帮助。

我的功能和设置的东西:

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

我每次我通过循环去时创建一个新的FBI过程中,我最终用完了所有的Pi内存,直到它停下来,因为它没有剩下任何东西。我现在杀死FBI过程后加载固定的图像。感谢大家的帮助。

我还想出了一些使其更好/更无缝地运行的其他功能。

相关问题