TCP Server mit Python script

Lateralus

Benutzer
Mitglied seit
06. Apr 2024
Beiträge
7
Punkte für Reaktionen
0
Punkte
1
Hallo,

ich möchte Telemetriedaten (ca 10 MB/Tag) von einem Arduino im Minutentakt zu meiner DS216+II schicken und sie dort als 1 File / Tag speichern.
Meine Idee war ein python script als TCP Server zu verwenden und den Arduino als TCP Client Daten hinschicken zu lassen. Das script kann sich dann ums Filehandling kümmern.
Das funktioniert auch testweise (einfach nur einen Counterwert zum Script schicken um zu sehen ob alles ankommt) prächtig, wenn ich das Script auf meinem PC laufen lasse.
Allerdings bin ich zu dumm es auf dem NAS laufen zu lassen.
Python habe ich lt. dieser Anleitung installiert: https://synoguide.com/2023/01/21/install-and-use-python-3-9-in-your-synology/

  • Ich kann vom Arduino aus den TCP Server (Port 5555) nicht erreichen.
  • Ich kann von einem anderen PC aus den Port am NAS nicht anpingen (powershell: Test-NetConnection <address> -p <port_number>)
  • Ändere ich im TCP Client (Arduino) den Port zu dem ich schicke of einen Port der im NAS definitiv verfügbar ist zB 5000 dann kann der TCP client eine Verbindung aufbauen
  • Ich kann natürlich den Port nicht auf 5000 im receiving script am NAS ändern, denn dieser Port wird ja schon verwendet. Probiere ich es doch erhalte ich folgende Fehlermeldung:
    OSError: [Errno 98] Address already in use
Scheint also so zu sein, dass ich den Port im NAS irgendwie zulassen muss. Nur verstehe ich nicht wie ich das mache.
Kann mir da bitte Jemand unter die Arme greifen?

Vielleicht noch ein kleiner Nachtrag: Arduino und NAS befinden sich im selben Netzwerk bei mir zu Hause.


Das Script:

import socketserver import socket import sys #import winsound global old_number old_number = 0 global first_time first_time = True class MyTCPHandler(socketserver.StreamRequestHandler): def handle(self): global old_number global first_time # 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() #print("{} wrote:".format(self.client_address[0])) print(self.data) decoded_string = self.data.decode("utf-8") split_string = decoded_string.split("=") int_number = int(split_string[1]) print(int_number) if (old_number+1 != int_number) and not(first_time): print("error") #duration = 1000 # milliseconds #freq = 1000 # Hz #winsound.Beep(freq, duration) sys.exit() old_number = int_number first_time = False if __name__ == "__main__": #HOST, PORT = "localhost", 9999 host = socket.gethostname() port = 5555 host="localhost" print(host) # Create the server, binding to localhost on port 5555 with socketserver.TCPServer((host, port), MyTCPHandler) as server: # Activate the server; this will keep running until you # interrupt the program with Ctrl-C server.serve_forever()
 
Zuletzt bearbeitet:

Hagen2000

Benutzer
Mitglied seit
25. Mai 2016
Beiträge
107
Punkte für Reaktionen
25
Punkte
28
Warum überschreibst Du host mit „localhost“? Dann kannst du dich nur lokal verbinden, die Zeile muss raus.
Außerdem musst Du ggf. die Firewall vom NAS anpassen.
 

Lateralus

Benutzer
Mitglied seit
06. Apr 2024
Beiträge
7
Punkte für Reaktionen
0
Punkte
1
Das war nur ein Versuch aus Verzweiflung, tatsächlich ist es egal ob ich host über gethostname() erhalte oder "loclahost" verwende, es funktioniert in beiden Fällen auf allen anderen Systemen. Nur am NAS funktionieren beide Varianten nicht, daher denke ich nicht, dass das das Problem ist.
Es muss etwas mit dem geblockten Port 5555 zu tun haben. Nur wie lasse ich Port 5555 zu?
Die Firewall ist gar nicht aktiv bei mir.
1712475563481.png
 

Lateralus

Benutzer
Mitglied seit
06. Apr 2024
Beiträge
7
Punkte für Reaktionen
0
Punkte
1
Vielleicht ist es auch totaler Schwachsinn, meine Daten an einen TCP-server (mit einem speziellen Port) zu schicken.
Gibt es vielleicht bessere Methoden?
 

Hagen2000

Benutzer
Mitglied seit
25. Mai 2016
Beiträge
107
Punkte für Reaktionen
25
Punkte
28
Mach doch mal ein zweites Terminal auf, während dein Script läuft und führe dort folgenden Befehl aus:
Bash:
netstat -tulpen
Dann solltest Du einen LISTENer auf Port 5555 sehen. Wenn er auf alle Adressen hört, dann steht da als Adresse 0.0.0.0. Ansonsten eben die Adresse, unter der dein Script ansprechbar ist.
 

Lateralus

Benutzer
Mitglied seit
06. Apr 2024
Beiträge
7
Punkte für Reaktionen
0
Punkte
1
Danke für deine Hilfe!

wenn ich das Script laufen lasse dann sehe ich dass der Port offen ist:
1712487873076.png

wenn ich jetzt aber probiere von einem Windows Rechner aus diesen Port zu pingen, dann ist er nicht erreichbar:
Mein Synlogy NAS hat die ip 192.168.1.37 bzw. wird HomeNAS im python script für host=socket.gethostname() zurück gegeben.
1712487930883.png
 

Hagen2000

Benutzer
Mitglied seit
25. Mai 2016
Beiträge
107
Punkte für Reaktionen
25
Punkte
28
Nimm mal
Bash:
host = '0.0.0.0'
 

Lateralus

Benutzer
Mitglied seit
06. Apr 2024
Beiträge
7
Punkte für Reaktionen
0
Punkte
1
ok jetzt bin ich einen Schritt weiter, wenn ich die ip direkt im Script angebe funktionirt es:
1712488616737.png

das kann doch aber nicht im Sinne des Erfinders sein?
 

Hagen2000

Benutzer
Mitglied seit
25. Mai 2016
Beiträge
107
Punkte für Reaktionen
25
Punkte
28
Der Port ist bei Dir zwar offen, aber nur für lokalen Zugriff (127.0.0.1). Deswegen kannst Du den nicht von außen erreichen.
Um die Angabe der eigenen IP-Adresse zu vermeiden nimmt man 0.0.0.0.
 

Lateralus

Benutzer
Mitglied seit
06. Apr 2024
Beiträge
7
Punkte für Reaktionen
0
Punkte
1
ja das habe ich mir gedacht, denn der Port 5000 ist für 0.0.0.0 offen:
1712488740168.png

wie kann ich den Port 5555 nun auch für außerhalb öffnen?
 

Hagen2000

Benutzer
Mitglied seit
25. Mai 2016
Beiträge
107
Punkte für Reaktionen
25
Punkte
28
Bitte lies nochmal ab #7, hier gingen unsere Antworten etwas durcheinander.
 

Lateralus

Benutzer
Mitglied seit
06. Apr 2024
Beiträge
7
Punkte für Reaktionen
0
Punkte
1
Der Port ist bei Dir zwar offen, aber nur für lokalen Zugriff (127.0.0.1). Deswegen kannst Du den nicht von außen erreichen.
Um die Angabe der eigenen IP-Adresse zu vermeiden nimmt man 0.0.0.0.

ah einfach lesen :)
mit 0.0.0.0 als Host Adresse im Script funktioniert es, DANKE!!!!
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat