Hallo,
ich wollte an Projekt angehen. Ich möchte versuchen 2 Raspberry Pi's mittels TCP-Socket, kommunizieren lassen und mit Wireshark analysieren. Dabei wollte ich die Programmiersprache Python verwenden.
Ich bin neu in dem Themengebiet IOT. Kann mir vielleicht jemand ein gutes Buch oder Webseiten empfehlen, die meinem Projekt sehr nahe ist?
Ich weiß, dass es viel online in Bezug auf dieses Thema gibt und ich bin auch dabei mich einzuarbeiten. Trotzdem glaube ich, dass mein Projekt so speziel ist und ich der einzige bin der das macht.
Es sollten doch bestimmt viele Beispiele für die Kommunikation von 2 Raspberry Pi's mittels TCP-Socket in Python geben.
Schöne Grüße
Uwe
Raspberry Pi / TCP Socket
Es gibt dort draußen vor allem sehr viele Beispiele in denen die Kommunikation zwischen Sockets falsch gemacht wird. Das ist nicht nämlich deutlich komplexer, als man denkt.
Da du sowohl die Kommunikation als auch das Protokoll entwickeln müstest, empfehle ich dir aus eigener Erfahrung, lieber ein bestehendes Protokoll zu verwenden. Zum Beispiel HTTP. Dafür gibt es etablierte Frameworks.
Da du sowohl die Kommunikation als auch das Protokoll entwickeln müstest, empfehle ich dir aus eigener Erfahrung, lieber ein bestehendes Protokoll zu verwenden. Zum Beispiel HTTP. Dafür gibt es etablierte Frameworks.
99.999% aller Beispiele im Netz über TCP-Programmierung sind Schrott.
Ein einigermaßen guter Einstieg ist https://realpython.com/python-sockets/
Was möchtest Du denn durch die Analyse mit Wireshark erreichen?
Ein einigermaßen guter Einstieg ist https://realpython.com/python-sockets/
Was möchtest Du denn durch die Analyse mit Wireshark erreichen?
Da du sowohl die Kommunikation als auch das Protokoll entwickeln müstest, empfehle ich dir aus eigener Erfahrung, lieber ein bestehendes Protokoll zu verwenden. Zum Beispiel HTTP. Dafür gibt es etablierte Frameworks.
[/quote]
Stimmt, davon habe ich auch viel gelesen und wahrscheinlich werde ich auch das HTTP-Protokoll verwenden.
[/quote]
Stimmt, davon habe ich auch viel gelesen und wahrscheinlich werde ich auch das HTTP-Protokoll verwenden.
Wenn du keinen Weg hast, Probleme zu provozieren, woher sollten die kommen? Zumindest über Ethernet wirst du keine sehen, und auch bei WIFI kommt es massive auf die Umstände an. Ich habe stundenlang ein proprietären Protokoll zwischen meinem Notebook und einem Laser-Projektor mit wireshark analysiert. Da kamen nie Fehler.
Ist das eine Hausaufgabe?
Ist das eine Hausaufgabe?
Starte einen Webserver (Apache, NGINX) auf einem Pi, und benutze WGET oder CURL und hol eine Webseite mit “Hello World” darin ab. Dann siehst du das in den Paketen.
Aber es klingt nach einer ziemlich sinnfreien Übung. Die Fehler, die ihr erwarten könnt, weil ihr unerfahren seid, haben nichts mit wireshark und den unteren Ebenen des TCP stacks zu tun.
Aber es klingt nach einer ziemlich sinnfreien Übung. Die Fehler, die ihr erwarten könnt, weil ihr unerfahren seid, haben nichts mit wireshark und den unteren Ebenen des TCP stacks zu tun.
Hallo UweKI,
Ich will die Kommentar der anderen nicht in Frage stellen, aber ich denke du suchst ein einfache Lösung auf TCP-Ebene.
Um ein einfache TCP Communication zwischen zwei Raspberry Pis aufzubauen hast du mindestens zwei Möglichkeiten in Python:
Einmal über das socket interface oder asyncio streams.
Zu den Sockets gibt es hier ein kleines client-server Beispiel:
https://docs.python.org/3/library/socket.html#example
Du kannst dir daraus zwei Python Scripte erstellen: server.py und client.py
Beachte, dass ich hier im client.py die IP-Addresse auf 127.0.0.1 gesetzt habe, da ich das auf meinem Rechner ausprobiert habe.
Du kannst auch server.py und client.py jeweils auf die Raspberry Pis kopieren. Dann must du natürlich die IP-Addresse entsprechend ändern.
Code: Alles auswählen
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
Code: Alles auswählen
# Echo client program
import socket
HOST = '127.0.0.1' # The remote host
PORT = 50007 # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Aus Wireshark exportiert erhält man z.B. folgende Ausgabe:
Man sieht sehr schon wie der TCP-connection handshake [SYN] [SYN,ACK][ACK] durchgeführt wird.
In Wireshark würdest du natürlich auch das "Hello World" in den Datenbytes wiederfinden.
Code: Alles auswählen
"No.","Time","Source","Destination","Protocol","Length","Info"
"1","0.000000","127.0.0.1","127.0.0.1","TCP","56","64439 > 50007 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1"
"2","0.000044","127.0.0.1","127.0.0.1","TCP","56","50007 > 64439 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1"
"3","0.000063","127.0.0.1","127.0.0.1","TCP","44","64439 > 50007 [ACK] Seq=1 Ack=1 Win=2619648 Len=0"
"4","0.000121","127.0.0.1","127.0.0.1","TCP","56","64439 > 50007 [PSH, ACK] Seq=1 Ack=1 Win=2619648 Len=12"
"5","0.000131","127.0.0.1","127.0.0.1","TCP","44","50007 > 64439 [ACK] Seq=1 Ack=13 Win=2619648 Len=0"
"6","0.000560","127.0.0.1","127.0.0.1","TCP","56","50007 > 64439 [PSH, ACK] Seq=1 Ack=13 Win=2619648 Len=12"
"7","0.000595","127.0.0.1","127.0.0.1","TCP","44","64439 > 50007 [ACK] Seq=13 Ack=13 Win=2619648 Len=0"
"8","0.000624","127.0.0.1","127.0.0.1","TCP","44","64439 > 50007 [FIN, ACK] Seq=13 Ack=13 Win=2619648 Len=0"
"9","0.000659","127.0.0.1","127.0.0.1","TCP","44","50007 > 64439 [ACK] Seq=13 Ack=14 Win=2619648 Len=0"
"10","0.000681","127.0.0.1","127.0.0.1","TCP","44","50007 > 64439 [FIN, ACK] Seq=13 Ack=14 Win=2619648 Len=0"
"11","0.000695","127.0.0.1","127.0.0.1","TCP","44","64439 > 50007 [ACK] Seq=14 Ack=14 Win=2619648 Len=0"
Code: Alles auswählen
"No.","Time","Source","Destination","Protocol","Length","Info"
"1","0.000000","127.0.0.1","127.0.0.1","TCP","56","56037 > 50007 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1"
"2","0.000021","127.0.0.1","127.0.0.1","TCP","44","50007 > 56037 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0"
"3","0.511519","127.0.0.1","127.0.0.1","TCP","56","[TCP Retransmission] 56037 > 50007 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1"
"4","0.511543","127.0.0.1","127.0.0.1","TCP","44","50007 > 56037 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0"
"5","1.024936","127.0.0.1","127.0.0.1","TCP","56","[TCP Retransmission] 56037 > 50007 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1"
"6","1.024955","127.0.0.1","127.0.0.1","TCP","44","50007 > 56037 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0"
"7","1.537955","127.0.0.1","127.0.0.1","TCP","56","[TCP Retransmission] 56037 > 50007 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1"
"8","1.537975","127.0.0.1","127.0.0.1","TCP","44","50007 > 56037 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0"
"9","2.041275","127.0.0.1","127.0.0.1","TCP","56","[TCP Retransmission] 56037 > 50007 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM=1"
"10","2.041294","127.0.0.1","127.0.0.1","TCP","44","50007 > 56037 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0"
Für asyncio streams findest du hier ein analoges client server Beispiel:
https://docs.python.org/3/library/async ... l#examples
Hier im Forum gibt es eine starke Tendenz Antworten und Empfehlungen zu geben die man im professionellen Umfeld umsetzen könnte. Das ist bei Hausaufgaben immer etwas schwierig, den da soll man ja auch mal ganz bewusst Dinge tun die man so in der Praxis nie tun würde um Grundlagen zu lernen. Es macht einen riesigen Unterschied ob du ein eigenes einfaches Protokoll auf Basis von TCP erfindest oder HTTP nimmst und dafür dann noch irgendwelche Frameworks, so dass du mit sockets nie in Kontakt kommst.
Von daher würde ich dir dringend empfehlen nochmal abzuklären was genau die Erwartungen sind und ob du auf dem richtigen Weg bist, bevor du allzu viel Zeit investierst. Es fällt mir nämlich sehr schwer vorzustellen dass man eine Hausaufgabe bewusst so stellen würde dass alle Ansätze die hier im Thread diskutiert werden angemessene Lösungen wären.
Von daher würde ich dir dringend empfehlen nochmal abzuklären was genau die Erwartungen sind und ob du auf dem richtigen Weg bist, bevor du allzu viel Zeit investierst. Es fällt mir nämlich sehr schwer vorzustellen dass man eine Hausaufgabe bewusst so stellen würde dass alle Ansätze die hier im Thread diskutiert werden angemessene Lösungen wären.
@UweKI, noch ein Nachtrag:
Mit python sockets ist der TCP-handshake schon implementiert. Falls du zum Beispiel auch Protokollverletzungen hervorrufen und untersuchen willst, würde ich dir empfehlen mal einen Blick auf scapy zu werfen.
https://scapy.readthedocs.io/en/latest/ ... ction.html
Das ist ein sehr mächtiges Tool, mit dem du auch einzelne Pakete senden kannst... und noch viel viel mehr.
Auf Dauer wirst du damit wahrscheinlich am weitesten kommen.
[edit]
Mit python sockets ist der TCP-handshake schon implementiert. Falls du zum Beispiel auch Protokollverletzungen hervorrufen und untersuchen willst, würde ich dir empfehlen mal einen Blick auf scapy zu werfen.
https://scapy.readthedocs.io/en/latest/ ... ction.html
Das ist ein sehr mächtiges Tool, mit dem du auch einzelne Pakete senden kannst... und noch viel viel mehr.
Auf Dauer wirst du damit wahrscheinlich am weitesten kommen.
[edit]
Nur um Missverständnisse zu vermeiden: Ja, auf dem Raspberry Pi ist das vielleicht eine Nische, aber ich würde dir empfehlen, dich nicht auf Bücher, Tutorials, usw. die speziell auf den Raspberry Pi zielen, zu beschränken. Netzwerkkommunikation ist standardisiert und ist vom Prinzip das gleiche, ob du nun einen Raspberry Pi oder einen professionellen Server auf AWS verwendest. (Mal abgesehen von der Leistung und der Sicherheit)Trotzdem glaube ich, dass mein Projekt so speziell ist und ich der einzige bin der das macht.
Es sollten doch bestimmt viele Beispiele für die Kommunikation von 2 Raspberry Pi's mittels TCP-Socket in Python geben.