Raspberry Pi b+ kommunizieren

  • Guten Tag liebe Community. Für ein Projekt müssen 2 raspberry Pis verbunden werden der eine Pi muss dem anderen "Befehle" senden und die Ausgabe auslesen. Ich habe es mit Paramiko schon getestet nur ist mir die Verbindung zu langsam...
    Ich danke schonmal im Voraus.

  • Also die gpios sollen geschaltet werden und der Status der gpios soll abgefragt werden. Die Geräte stehen direkt neben einander und sind mit lan verbunden. Wegen den Sockets kann einer ein beiSpiel schicken mit einer Abfrage ?

    Der erste pi ist mit Schaltern verbunden und der zweite pi soll je nachdem ob die Led an oder aus ist die led ansteuern.

  • Wenn die PI's nur wenige cm von einander entfernt stehen, hättest du mehr als eine Möglichkeit. Um einen LAN Ausfall zu umgehen würde sich eine Verbindung über UART anbieten. Was der 1.Pi sendet geht bei diesem über TX raus und beim 2.PI über RX rein. Was der 2.PI sendet geht über TX raus und beim 1.PI über RX rein.

    Code
    1.PI     2.PI
    ------|--------
    TX       RX
    RX       TX

    Eine weitere Möglichkeit wäre wie von dbv schon erwähnt, übers Netzwerk und einem Socket. Dazu braucht man einen SocketServer und einen SocketClient. Welchen der beiden PI's du zu was machst ist relativ egal, wobei ich eher dazu tendieren würde den 2. als Server zu deklarieren.

    Eine weitere Möglichkeit wäre aber auch über den Webserver, indem der 1.PI eine Webseite bzw PHP Script auf dem 2.PI aufruft, ein Befehl absetzt und die Ausgabe weiterverarbeitet.


    Für welche der Möglichkeiten möchtest Du dich entscheiden :huh:

  • Dann wäre SocketServer das beste.

    Hier eine Vorlage:

    "Server.py"


    [code=php]#!/usr/bin/python
    # -*- coding: utf-8 -*-
    #
    # Starts a Thread for Socket Server waiting for Connections
    #
    # thread docu: http://www.tutorialspoint.com/python/python_multithreading.htm
    # signal docu: http://stackoverflow.com/questions/1112…igint-in-python
    # socketserver docu: https://docs.python.org/2/library/socketserver.html
    #
    import RPi.GPIO as GPIO
    import threading
    import time
    import sys
    import socket
    import subprocess
    try:
    import SocketServer as socketserver
    except ImportError:
    import socketserver

    #-------------------------------------------------------------------
    DEBUG = True
    #DEBUG = False
    SocketHost = "0.0.0.0"
    SocketPort = 7060
    #-------------------------------------------------------------------

    try:
    DEBUG
    except NameError:
    DEBUG = False

    if DEBUG:
    print("Enabling DEBUG mode!")
    else:
    print("Disabling DEBUG mode!")

    def printD(message):
    if DEBUG:
    print(message)
    sys.stdout.flush()

    #parse Socket request (e.g. from Client.py)
    def ParseSocketRequest(request):
    printD("Parsing SocketRequest: "+request)
    returnlist = ""
    request = request.strip()
    requestsplit = request.split(':')
    requestsplit.append("dummy")
    command = requestsplit[0]
    value = requestsplit[1]
    if value == "dummy":
    value = "0"

    elif command == "system.power":
    if value == "off":
    subprocess.Popen(["shutdown","-h","now"])
    return "system.power:ok"
    elif value == "reboot":
    subprocess.Popen(["shutdown","-r","now"])
    return "system.power:ok"

    else:
    return "ERROR: Invalid Command"


    class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler):
    def handle(self):
    # self.rfile is a file-like object created by the handler;
    # we can now use e.g. readline() instead of raw recv() calls
    self.data = self.rfile.readline().strip()
    printD("SocketRequest: {}".format(self.data))
    try:
    self.wfile.write(ParseSocketRequest(self.data))
    except Exception, e2:
    print("Error in ThreadedTCPRequestHandler: " + str(e2))
    except (KeyboardInterrupt, SystemExit):
    exit()

    class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

    if __name__ == '__main__':
    try:
    HOST, PORT = SocketHost, SocketPort
    socket_server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
    ip, port = socket_server.server_address
    # Start a thread with the server - that thread will then start one more thread for each request
    socket_server_thread = threading.Thread(target=socket_server.serve_forever)
    socket_server_thread.start()
    except Exception, e1:
    print("Error...: " + str(e1))
    except (KeyboardInterrupt, SystemExit):
    print("\nSchliesse Programm..\n")
    exit()


    [/php]

    "Client.py"


    [code=php]#!/usr/bin/python
    # -*- coding: utf-8 -*-

    import socket
    import sys

    HOST, PORT = "192.168.178.10", 7060
    data = " ".join(sys.argv[1:])

    # Create a socket (SOCK_STREAM means a TCP socket)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
    # Connect to server and send data
    sock.connect((HOST, PORT))
    sock.sendall(data + "\n")

    # Receive data from the server and shut down
    received = sock.recv(1024)
    finally:
    sock.close()

    print "Sent: {}".format(data)
    print "Received: {}".format(received),[/php]Aufruf: ./Client.py system.power:reboot

  • Danke ging alles :thumbs1:
    Nur bekomme ich wenn ich einen GPIO.input zurückgeben möchte folgenden error
    [code=php]Error in ThreadedTCPRequestHandler: an integer is required
    [/php]
    und schaffe es ihn nicht zu beheben

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!