Forum: PC-Programmierung RasPi telent LED blnken


von Marcus (Gast)


Lesenswert?

Hallo, ich möchte gerne auf dem RaspberryPi eine LED über telnet 
ansteuern.

Dazu habe ich dieses Script gefunden:
http://stackoverflow.com/questions/39973653/python-socket-programming-and-led-interfacing
1
#!/usr/bin/python             # This is server.py file
2
import socket                 # Import socket module
3
4
def led_blink(msg):
5
        print "got msg", msg         # Debug msg
6
7
s = socket.socket()           # Create a socket object
8
host = "127.0.0.1"        # Get local machine name
9
port = 12345                  # Port
10
s.bind((host, port))          # Bind to the port
11
s.listen(5)                   # Now wait for client connection.
12
print "Listening"
13
c, addr = s.accept()       # Establish connection with client.
14
while True:
15
    msg = c.recv(1024)
16
    print 'Got connection from', addr
17
    if msg == "Exit":
18
        break
19
    led_blink(msg)
20
c.close()
Ich kann damit die Verbindung zum RasPi herstellen, aber wenn ich den 
Code richtig verstehe, sollte das senden von "Exit" den Server beenden. 
Das tut er aber nicht, er bleibt immer im Empfangsmodus.
Wenn man den Server manuell mit CTRL-C beendet, ist der Port beim 
nächsten Start blockiert und man muss einen anderen nehmen.

Weiß jemand Rat?

von Daniel A. (daniel-a)


Lesenswert?

Kommt eventuell noch ein \r oder ein \r\n von telnet an? (zeilenende)

von Marcus (Gast)


Lesenswert?

Danke für die Antwort. Du hast Recht, das war das Problem.

Ich habe den Code jetzt so geändert und die LED blinkt jetzt.

1
#!/usr/bin/python             
2
# modified from
3
# http://stackoverflow.com/questions/39973653/python-socket-programming-and-led-interfacing
4
5
6
import socket                 # Import socket module
7
import time
8
import RPi.GPIO as GPIO
9
10
ARDUINO_LED = 4 # Raspberry GPIO 4
11
12
GPIO.setmode(GPIO.BCM)  # set board mode to Broadcom
13
GPIO.setup(4, GPIO.OUT)
14
15
def led_blink(msg):
16
    print "got msg", msg         # Debug msg
17
    GPIO.output(ARDUINO_LED, GPIO.HIGH)
18
    time.sleep(0.1)
19
    GPIO.output(ARDUINO_LED, GPIO.LOW)
20
21
s = socket.socket()           # Create a socket object
22
host = ''                     # all interfaces
23
port = 5004                   # Port
24
s.bind((host, port))          # Bind to the port
25
s.listen(5)                   # Now wait for client connection.
26
print "Listening"
27
c, addr = s.accept()          # Establish connection with client.
28
29
while True:
30
    msg = c.recv(1024)
31
    print type(msg)
32
    print map(ord,msg)
33
    print 'Got connection from', addr
34
    if msg[0:4] == "Exit":
35
        print "EXIT !!"
36
        break
37
    led_blink(msg)
38
c.close()

Jetzt bin ich mal gespannt, welche maximal Blink-Rate ich mit der 
TCP-Verbindung erreichen kann. ( Eine Art Led Ping )

von Daniel A. (daniel-a)


Lesenswert?

Eventuell solltest du statt direkt recv zu verwenden, zuerst mit 
c.makefile() eine File stream erzeugen, und davon mit readline lesen. 
TCP ist ein Stream, und TCP Packete können unterwegs und nach dem 
Empfang aufgespalten oder Zusammengesetzt werden. Also wenn "test" und 
"hallo" gesendet wird, könnte es z.B. als "te" "stha" und "llo" 
empfangen werden. Wenn man daraus aber ein File macht und mit readline 
zeilen liest, sollte readline immer ganze Linien zurückliefern.

von Marcus (Gast)


Lesenswert?

> ... zuerst mit c.makefile() eine File stream erzeugen ...
Danke für den Hinweis. Im Moment versuche ich gerade, die 
SPI-Schnittstelle in die TCP-Kommunikation einzubinden:

Beitrag "Raspi telnet SPI Schnittstelle"

Das klappt aber leider noch nicht so ganz.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.