Raspberry Pi / TCP Socket

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
UweKI
User
Beiträge: 5
Registriert: Dienstag 10. September 2019, 15:44

Montag 14. Juni 2021, 08:49

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
Benutzeravatar
sparrow
User
Beiträge: 2801
Registriert: Freitag 17. April 2009, 10:28

Montag 14. Juni 2021, 09:26

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.
Sirius3
User
Beiträge: 14998
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 14. Juni 2021, 09:28

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?
UweKI
User
Beiträge: 5
Registriert: Dienstag 10. September 2019, 15:44

Montag 14. Juni 2021, 09:48

Mit der Wireshark, will ich z.B. die Information erhalten, wann welche Pakete gesendet wurden und falls Probleme auftauchen, wo und wann sie entstanden sind.
UweKI
User
Beiträge: 5
Registriert: Dienstag 10. September 2019, 15:44

Montag 14. Juni 2021, 09:51

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.
__deets__
User
Beiträge: 10294
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 14. Juni 2021, 09:54

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?
UweKI
User
Beiträge: 5
Registriert: Dienstag 10. September 2019, 15:44

Montag 14. Juni 2021, 10:05

Ja, das Projekt soll so ausgeführt werden, weil im laufe des Projektes das gebraucht wird.

Mir geht es wirklich um die Anfangsschritte, weil ich kaum Erfahrung in dem Bereich habe.
Sirius3
User
Beiträge: 14998
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 14. Juni 2021, 10:11

Was ist denn das Projekt und was soll per TCP übertragen werden?
UweKI
User
Beiträge: 5
Registriert: Dienstag 10. September 2019, 15:44

Montag 14. Juni 2021, 10:20

Es soll einfache nur eine Kommunikation zwischen zwei Raspberry Pi's gestellt werden und das mittels TCP-Socket und mittels Wireshark später analysiert.
Z.B. wäre es gut, wenn ich ein Text ausgeben kann "Hello World".
Sirius3
User
Beiträge: 14998
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 14. Juni 2021, 10:53

Aber was hat das mit großen Projekt zu tun? Gibt es irgendwelche Annahmen, dass Fehler besonders häufig auftreten?
__deets__
User
Beiträge: 10294
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 14. Juni 2021, 11:37

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.
rogerb
User
Beiträge: 528
Registriert: Dienstag 26. November 2019, 23:24

Montag 14. Juni 2021, 21:10

UweKI hat geschrieben:
Montag 14. Juni 2021, 10:20
Es soll einfache nur eine Kommunikation zwischen zwei Raspberry Pi's gestellt werden und das mittels TCP-Socket und mittels Wireshark später analysiert.
Z.B. wäre es gut, wenn ich ein Text ausgeben kann "Hello World".
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"
Hier währe eine fehlerhafte Verbindung, bei der der Server nicht antwortet und der client letztendlich die Verbindung abbricht:

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
DasIch
User
Beiträge: 2666
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Montag 14. Juni 2021, 22:00

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.
rogerb
User
Beiträge: 528
Registriert: Dienstag 26. November 2019, 23:24

Dienstag 15. Juni 2021, 07:32

@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]
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.
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)
Antworten