Frage

Ich versuche, eine variable Länge Stream von einer Kamera mit Python zu empfangen, aber seltsames Verhalten bekommen. Dies ist Python 2.6.4 (R264: 75706) auf Linux (Ubuntu 9.10)

Die Nachricht sollte mit einem statischen Header durch die Größe und Rest des Stroms gefolgt kommen. hier ist der Code

from socket import *
import array
import select

HOST = '169.254.0.10'
PORT = 10001
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
tcpCliSock.setblocking(0)

def dump(x):
    dfile = open('dump','w')
    dfile.write(x)
    dfile.close


data='I'
tcpCliSock.send(data)
tcpCliSock.shutdown(1)
ready_to_read, ready_to_write, in_error = select.select(
        [tcpCliSock], 
        [], 
        [], 
        30)
if ready_to_read == []:
    print "sokadens"
data=''
while len(data)<10:
    chunk = tcpCliSock.recv(1024)
    print 'recv\'d %d bites'%len(data)
    data=data+chunk
index=data.find('##IMJ')
if index == -1:
    dump(data)
    raise RuntimeError, "imahe get error"
datarr = array.array('B',data)
size=datarr[6]+datarr[7]<<8+datarr[8]<<16+datarr[9]<<24
ready_to_read, ready_to_write, in_error = select.select(
        [tcpCliSock], 
        [], 
        [], 
        30)
if ready_to_read == []:
    print "sokadens"
while len(data)<size:
    chunk = tcpCliSock.recv(1024)
    data=data+chunk 

outfile=open('resim.jpg','w')
outfile.write(data[10:])
outfile.close

tcpCliSock.close()

Mit diesem Code, den ich entweder stecken in einer „recv \ 'd 0 Bisse“ Schleife (was selten vorkommt) oder diese:

`recv'd 0 bites`
Traceback (most recent call last):
  File "client.py", line 44, in <module>
    raise RuntimeError, "imahe get error"
RuntimeError: imahe get error

, welche total seltsam (0 Bytes empfängt, sondern aus der Schleife bekommen). Die gesicherten Daten sind falsch, was in dieser Situation zu erwarten ist

Edit 1: Das Gerät soll ein JPEG-Bild senden, die von einem Header 10-Byte vorangestellt. Wenn (if) ich nach der ersten Schleife zu bekommen, muss ich für die Richtigkeit und Größe info Header überprüfen. Das Programm endet mit falschen Datenfehler, und die Dump-Datei ist ein Bündel von binären Müll, also habe ich keine Ahnung, was ich am Ende erhalten. Ich bin ziemlich sicher, dass das Gerät auf der anderen Seite versucht, die richtigen Daten zu senden.

War es hilfreich?

Lösung 2

Problem behoben ist, interessanterweise Abschaltung (1) wurde das Problem verursacht, ist die andere Seite nicht http Stil Abschaltungen mag. Darüber hinaus gibt es offensichtliche Tippfehler und fehlende Kontrollen, aber sie sind nicht die Problem.

Andere Tipps

Sie wissen nicht wirklich, wie viele Bytes Sie erhalten haben, da Ihr Code:

data=''
while len(data)<10:
        chunk = tcpCliSock.recv(1024)
        print 'recv\'d %d bites'%len(data)
        data=data+chunk

d., Sind Sie Bytes in chunk empfangen, aber was Sie drucken ist len(data) bevor Sie data aktualisieren. So natürlich wird es 0 das erste Mal drucken, immer - dann wird es data und Ausfahrt aktualisieren, wenn die chunk mindestens 10 Byte ist

.

Diese Information ist nicht ausreichend, um Ihr Problem zu debuggen, aber Druck len (Brocken) und len (Daten) auf die Schleife austritt, kann nicht dem Versuch schaden, zu verstehen, was los ist. Auch, was ist in dump, wenn Sie mit der imahe get error Nachricht beenden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top