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.
Raspberry Pi b+ kommunizieren
-
Black -
14. Januar 2015 um 10:00 -
Erledigt
-
-
Raspberry Pi b+ kommunizieren? Schau mal ob du hier fündig wirst!
-
- Offizieller Beitrag
Warum so umständlich? Den Pi ins Netzwerk und ein Socketserver/ Client Konstrukt aufsetzen. Was osll denn gesendet werden..und wie oft?
-
Was sind denn die Bedingungen für die Verbindung?
* Wie weit stehen die PI's von einander entfernt?
* Besteht eine LAN / WLAN Verbindung untereinander? -
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.
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
-
- Offizieller Beitrag
Welches Schweinderl hätten sie denn gern xD. Welche Sprache soll denn sein?
-
Ich möchte die ganze Geschichte gerne in python realisieren. Welche davon wäre denn am schnellsten und Ressourcen sparender ?
-
- Offizieller Beitrag
Ich mag den Socket Server (weiter unten ist ein Beispiel). Im Zusammenspiel mit Rpi.GPIO modul sollte das ganze recht zügig umgesetzt sein.
-
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 = Falseif 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):
passif __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 sysHOST, 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 -
Wie sieht denn dein angepasster Code aus? Bitte vollständig posten - ansonsten kann man hier nur mit den Schultern zucken
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!