Python-Socket-über wifi in raspberry pi
Habe ich programmiert, socket in python. Grundsätzlich gibt es 2 raspberry pi ' s die mit einander sprechen und senden Sie die gpio-Daten über wifi mit einem socket. Der code funktioniert völlig in Ordnung, zu Zeiten, aber manchmal ist es entweder nicht funktionieren oder zeigt eine Menge lag. Was kann das mögliche Problem. Habe ich etwas verpasst. Ich bin neu in Netzwerk-und python. Bitte helfen Sie mir!!
Server-code ist
#!/usr/bin/python
import RPi.GPIO as GPIO
import socket
HOST='192.168.0.106'
PORT=5002
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr=s.accept()
s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
print 'Connected by', addr
GPIO.setmode(GPIO.BCM)
GPIO.setup(04, GPIO.IN)
GPIO.setup(17, GPIO.IN)
GPIO.setup(27, GPIO.IN)
while True:
if (GPIO.input(04)==True):
if (GPIO.input(17)==False):
if (GPIO.input(27)==False):
conn.send('0')
elif(GPIO.input(27)==True):
conn.send('1')
elif (GPIO.input(17)==True):
if (GPIO.input(27)==False):
conn.send('2')
elif (GPIO.input(27)==True):
conn.send('3')
elif (GPIO.input(04)==False):
conn.send('5')
s.close()
Den client-code ist hier
#!/usr/bin/python
import socket
import RPi.GPIO as GPIO
HOST='192.168.0.106'
PORT=5002
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
GPIO.setmode(GPIO.BCM)
GPIO.setup(02, GPIO.OUT)
GPIO.setup(03, GPIO.OUT)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(10, GPIO.OUT)
while 1:
data=s.recv(8096)
if data=='0':
print 'Forward'
GPIO.output(02,True)
GPIO.output(03, False)
GPIO.output(11, False)
elif data=='1':
print 'Backward'
GPIO.output(02, False)
GPIO.output(03, True)
GPIO.output(11, True)
GPIO.output(10, False)
elif data=='2':
print 'Left'
GPIO.output(02, False)
GPIO.output(03, False)
GPIO.output(11, False)
GPIO.output(10, True)
elif data=='3':
print 'Right'
GPIO.output(02, True)
GPIO.output(03, False)
GPIO.output(11, False)
GPIO.output(10, False)
elif data=='5':
print 'Stop'
GPIO.output(02, False)
GPIO.output(03, False)
GPIO.output(11, False)
GPIO.output(10, False)
s.close()
Was eine "Menge" von lag? Was erwartest du, was passieren wird und was tatsächlich passiert?
Ich möchte die übertragung der gpio-status über den socket in Echtzeit. Die Verzögerung ist nicht fest jedes mal. Manchmal ist das Programm hängen geblieben ist, manchmal gibt es eine Verzögerung, die variabel ist und sogar Pakete verloren gegangen sind und manchmal funktioniert der code auch völlig glatt. Nicht in der Lage, zu identifizieren, was genau das problem hier.
Was zählt als "glatt"? Was zählt als "lag"? Sprichst du von einem 10ms Verzögerung oder 10.000 ms Verzögerung?
10ms Verzögerung ist in Ordnung..Manchmal ist die Verzögerung fast zu viel. Noch eine minute, manchmal. Manchmal reagiert er nicht mehr nur. Nicht in der Lage zu überprüfen, was falsch ist.
Ich möchte die übertragung der gpio-status über den socket in Echtzeit. Die Verzögerung ist nicht fest jedes mal. Manchmal ist das Programm hängen geblieben ist, manchmal gibt es eine Verzögerung, die variabel ist und sogar Pakete verloren gegangen sind und manchmal funktioniert der code auch völlig glatt. Nicht in der Lage, zu identifizieren, was genau das problem hier.
Was zählt als "glatt"? Was zählt als "lag"? Sprichst du von einem 10ms Verzögerung oder 10.000 ms Verzögerung?
10ms Verzögerung ist in Ordnung..Manchmal ist die Verzögerung fast zu viel. Noch eine minute, manchmal. Manchmal reagiert er nicht mehr nur. Nicht in der Lage zu überprüfen, was falsch ist.
InformationsquelleAutor Meet Desai | 2014-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einige Dinge, die nicht idiomatische über Ihren code. Es gibt auch einige Dinge, die einen Unterschied in seinem Verhalten.
Schreiben Sie diese Anweisung wie folgt statt:
Den Klammern habe ich entfernt, sind völlig überflüssig. Sie machen keinen Unterschied.
Ich auch geändert
04
zu4
weil04
ist ein oktal-literal. Es macht keinen Unterschied für diese besonderen Wert, weil oktal 4 dezimal und 4 sind den gleichen Wert. Es ist verwirrend und überraschend, zu verwenden, eine oktale hier, obwohl (wenn es Redewendungen zu finden, um GPIO-pins mit oktal -, das könnte ein Grund für die Verwendung von oktal hier, aber soweit ich weiß ist es nicht). Da Ihre pin-Nummern, die zufällig 8 oder höher sind nicht geschrieben, mit oktal-notation hier, ich nehme an, das ist unbeabsichtigt.Ich habe auch entfernt die explizite Vergleich gegen
True
. Sie sollten fast nie vergleichen, gegenTrue
.GPIO.input(4) == True
ausgewertetTrue
wennGPIO.input(4)
zurückTrue
. So können Sie auch überspringen Sie den extra-Vergleich (oder aus der anderen Perspektive, warum schreibst du nichtif (GPIO.input(4) == True) == True:
?).Ähnlich wie bei einer Zeile wie:
Notieren Sie sich dieses, statt:
Sollten Sie fast nie vergleichen, gegen
False
.Vielleicht mehr ernst:
Ich glaube nicht, dass es für Ihre Anwendung wichtig zum Beispiel diese pin zweimal an diesem Punkt in Ihrem Programm - aber das ist, was du tust. Es ist durchaus möglich, dass die erste
GPIO.input(27)
zurückTrue
und der zweite Aufruf zurückFalse
. In diesem Fall Ihr Programm nicht nehmen Sie entweder die Aktion mit wer weiß was für Folgen.Stattdessen sollten Sie so etwas schreiben:
Und vielleicht am wichtigsten ist
Dies ist eine falsche Verwendung der socket-API. Sie fragte nach bei den meisten 8096 bytes und dann wird man behandelt das Ergebnis als ob Sie gebeten hatte, für mehr als 1 byte. Es spielt keine Rolle, dass die Begleiter-Programm schreibt immer 1 byte zu einem Zeitpunkt. TCP ist erlaubt, verschmelzen diese schreibt zusammen.
Stattdessen sollten Sie schreiben:
Gut, das ist nicht wirklich die ideale Sache zu schreiben, aber es ist die kleinste Veränderung um den code zu tun, was Sie wollen.
Es ist nicht klar, dass jede dieser verwandt ist das problem, das Sie erlebt haben, aber es fehlt bestimmte hardware bezweifle ich, jemand kann wirklich reproduzieren dieses problem.
Nach beheben dieser Probleme mit dem code, den Ihr weiter Debuggen Schritt sollte sein, um einzugrenzen, wo die Verzögerung das erste mal erscheint.
Vielleicht die GPIO-pins auf der sendenden Seite werden gestört und Daten hält coming-out. Vielleicht etwas in die GPIO-library Verhalten ist unter bestimmten Reihe von Eingaben. Vielleicht ist der Netzwerk-stack auf einem der raspberrypis Probleme hat - aufgrund knapper Ressourcen oder ausgefallene hardware oder etwas anderes, das ich nicht erraten kann - etc.
Also instrument der Absender, so kann man sagen, wenn es Daten sendet regelmäßig oder wenn die Verspätungen werden dort vorgestellt. Wenn es Daten sendet regelmäßig dann instrument, das der Empfänger zu sehen, wenn es empfangen regelmäßig Daten. Wenn es dann vielleicht werden Sie verengt das problem auf die GPIO-Bibliothek oder pins auf der empfangenden Seite.
Die Instrumentierung kann ganz einfach sein. Zum Beispiel, versuchen Sie, ein paar Drucke zusammen mit aufrufen an
time.time()
innerhalb der Schleife. So können Sie sehen, wie oft der schleifenrumpf ausgeführt wird. Wenn Sie bemerken, Lücken in der Zeit, dann hast du den ersten Hinweis.Vielen Dank!! Die en.recv(2) für mich gearbeitet. Ich danke Ihnen sehr.
InformationsquelleAutor Jean-Paul Calderone