Hallo,
ich stehe etwas auf dem Schlauch. Habe hier einen NodeMCU mit einem
ESP8266 und µPython 1.16, bei dem ich versuch eine Stabile
TCP-IP-Verbindung hinzubekommen.
Dabei habe ich aktuell 2 Probleme.
1.
In unregelmäßigen Abständen hängt sich der Stream auf / verliert die
Verbindung zum Server. OSError spuckt [Errno 113] EHOSTUNREACH
aus.
Bisher habe ich folgendes versucht:
--> Power Mode auf SLEEP_NONE gesetzt
--> Nach dem Verbindungsabbruch geprüft, ob der NodeMCU noch mit dem
WLAN verbunden ist. Ja ist er
--> Garbagecollector aktiviert
Wenn ich in der Schleife auf den readerstream warte um Daten zu lesen,
funktioniert das auch und wenn nichts kommt, wartet die coroutine auch
einfach.
Im Netz habe ich dazu ein paar threads gefunden, allerdings keine
brauchbare Lösung für mich.
Aktuell verbinde ich mich dann einfach neu mit dem Server, sobald die
Verbindung abbricht, ist aber keine schöne Lösung. Bei einem Test mit
Packet Sender und 4 gleichzeitig verbundenen Clients über einen tag gab
es keine Verbindungsabbrüche.
2.
Wenn ich versuche mich mit
1 | await uasyncio.open_connection(IP, Port)
|
mit dem Server zu verbinden, dann bekomme ich, auch wenn der Server gar
nicht läuft immer ein Stream-Paar zurück.
Laut der Doku zur Funktion
(https://docs.micropython.org/en/latest/library/uasyncio.html#uasyncio.open_connection)
sollte es einen OSerror geben, wenn die Verbindung nicht aufgebaut
werden kann. Wenn der Server nicht läuft, warum bekomme ich dann 2
Streamobjekte zurück und keinen Fehler? Hat jemand schonmal die selben
Erfahrungen gemacht?
Edit: Wenn ich eine falsche IP-Adresse angeben, die es im Netzwerk nicht
gibt, bekomme ich trotzdem keinen Fehler....
Meine coroutine zum Verbinden sieht wie folgt aus:
1 | async def connect(self):
|
2 | try:
|
3 | print("Connecting to server")
|
4 | self.bConnected = False
|
5 | self.stReader, self.stWriter = await uasyncio.open_connection(IP,Port)
|
6 | await uasyncio.sleep(1)
|
7 | if self.stReader and self.stWriter:
|
8 | print("reader: " + str(dir(self.stReader)))
|
9 | print("writer: " + str(dir(self.stWriter)))
|
10 | self.bConnected = True
|
11 | print("Connected: " + str(self.bConnected))
|
12 | except OSError as err:
|
13 | print('Could not connect to server')
|
14 | print(str(err))
|
Die prints sind nur zum debuggen. Vllt. kann mir ja einer weiter helfen.
LG Alex