MicroPython OSError: -202

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Abend,

ich habe mit MicroPython einen Code auf einem ESP32 geschrieben. Damit soll die API die das RKI bereitstellt ausgelesen werden.
Leider bekomme ich die Fehlermeldung: OSError:-202. Im Internet bin ich darauf gestoßen, dass die Internetverbindung das Problem sein könnte.

Also habe ich mit diesem Tutorial:
https://randomnerdtutorials.com/esp32-e ... eb-server/
Einen Web-Server auf dem ESP32 gebaut und der funktioniert problemlos. Die Netzwerkverbindung wird in dem Tutorial in der 'boot.py' hergestellt. Da das funktioniert hat, habe ich die 'boot.py' nicht mehr verändert. In die 'main.py' habe ich wieder meinen ursprünglichen Code eingesetzt. Jetzt kann es ja an der Netzwerkverbindung nicht mehr scheitern. Jedoch bekomme ich die gleiche Fehlermeldung.
Ich kann mir auch mit 'print(is_connected()' den Status der Verbindung ausgeben lassen. Ich erhalte dabei immer 'True'
Ist euch dieser Fehler bekannt?
boot.py:

Code: Alles auswählen

import network
import esp
import gc

esp.osdebug(None)

gc.collect()

ssid = 'zensiert'
password = 'zensiert'

station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
  pass
main.py:

Code: Alles auswählen

import urequests, json
from uprase import urlencode


URL = "https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/rki_key_data_v/FeatureServer/0/query?"

PARAMETER = {
    'referer':'https://www.mywebapp.com',
    'user-agent':'python-requests/2.9.1',
    'where': 'AdmUnitId = 8417', 
    'outFields': '*', 
    'returnGeometry': False,
    'f':'json', 
    'cacheHint': True 
    }

    
def get(url, params=None, **kw):
    if params:
        url = '{}?{}'.format(url.rstrip('?'), urlencode(params, doseq=True))
    return urequests.get(url, **kw)

def main():
    result = get(URL, PARAMETER)
    resultjson = json.loads(result.text)
    print(resultjson['features'][0]['attributes'])
    
if __name__ == '__main__':
    main()
Die Datei 'uprase.py' habe ich so genannt und dabei handelt es sich um diese Datei:
https://github.com/micropython/micropyt ... b/parse.py

Danke für eure Hilfe!

Grüße
Dennis

Edit: Ich habe die Fehlermeldung vergessen:

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 29, in <module>
  File "<stdin>", line 24, in main
  File "<stdin>", line 21, in get
  File "urequests.py", line 108, in get
  File "urequests.py", line 53, in request
OSError: -202
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das du einen Webserver gebaut hast sagt ja erstmal nichts über die Internet Verbindung. Sondern nur über das lokale Netzwerk.

Laut https://forum-staging.pycom.io/topic/42 ... r-code-202 ist das ein DNS Problem. Kannst du die Adresse von Hand auflösen & direkt nutzen?
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen und Danke für deine Antwort.

Ich habe mir die Adresse, also ‚url‘ in der Funktion ‚get‘ vor dem ‚return‘ ausgeben lassen. Wenn ich die kopiere und im Webbrowser öffne, dann funktioniert das. Hattest du das so gemeint?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Ich meinte, das dein uPy Code nicht einen Namen wie geile-Webseite.de benutzen soll. Sondern die IP 1.2.3.4 dahinter. Denn dann kommt es eben nicht zu einer address-Auflösung, die fehlschlägt.

Das haben wir die Tage hier übrigens schon mal diskutiert, hatte ich vergessen. Muss mal ein bisschen suchen, das hat für den User das Problem gelöst.

Nachtrag: der User hat ein neues Problem, und dadurch habe ich das alte gefunden: viewtopic.php?t=51867
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für die Antwort.
Ich habe versucht so wie in dem anderen Thema beschrieben vorzugehen.
Auflösen muss ich diese Adresse: services7.arcgis.com
Das habe ich auf dieser Internetseite gemacht: http://www.ping.comlex.de/
und erhalte diese IP: 13.249.9.66
Wenn ich im Terminal 'ping services7.arcgis.com' eingebe, dann erhalte ich eine andere IP und diese Ausgabe:

Code: Alles auswählen

[dennis@dell ~]$ ping services7.arcgis.com
PING d18qkb6lvu5nfj.cloudfront.net (143.204.98.52) 56(84) bytes of data.
64 Bytes von server-143-204-98-52.fra50.r.cloudfront.net (143.204.98.52): icmp_seq=1 ttl=244 Zeit=21.0 ms
64 Bytes von server-143-204-98-52.fra50.r.cloudfront.net (143.204.98.52): icmp_seq=2 ttl=244 Zeit=20.7 ms
Wenn ich dann mit beiden IP-Adressen einen lookup mache, auf dieser Webseite: https://whatismyipaddress.com/ip-lookup
Bekomme ich einmal den Hostname: server-13-249-9-66.cdg53.r.cloudfront.net
und einmal: server-143-204-98-52.fra50.r.cloudfront.net

Mal die erste IP-Adresse in den Code eingetragen:

Code: Alles auswählen

import urequests, json
from uprase import urlencode


URL = "https://13.249.9.66/mOBPykOjAyBO2ZKk/arcgis/rest/services/rki_key_data_v/FeatureServer/0/query?"

PARAMETER = {
    'referer':'https://www.mywebapp.com',
    'user-agent':'python-requests/2.9.1',
    'where': 'AdmUnitId = 8417', 
    'outFields': '*', 
    'returnGeometry': False,
    'f':'json', 
    'cacheHint': True 
    }

    
def get(url, params=None, **kw):
    if params:
        url = '{}?{}'.format(url.rstrip('?'), urlencode(params, doseq=True))    
    return urequests.get(url, **kw)

def main():
    result = get(URL, PARAMETER)
    resultjson = json.loads(result.text)
    print(resultjson['features'][0]['attributes'])
    
if __name__ == '__main__':
    main()
Bringt diese Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 30, in <module>
  File "<stdin>", line 25, in main
  File "<stdin>", line 22, in get
  File "urequests.py", line 108, in get
  File "urequests.py", line 60, in request
MemoryError: memory allocation failed, allocating 1736 bytes
Habe noch versucht den Header mit anzugeben:

Code: Alles auswählen

return urequests.get(url, headers={'Host': 'services7.arcgis.com'})
Das ändert an der Fehlermeldung nichts.

MicroPython bekommt wohl nur eine bestimmte Arbeitsspeichergröße zugewiesen, laut: https://forum.micropython.org/viewtopic.php?t=3912
Der Herr, mit dem lustigen Profilbild, am Ende des Threads meinte, dass man das mit 'micropython -X heapsize=2000M' ändern könnte. Ist das so? Wo soll/muss ich das eingeben?
Wenn ich wieder die ursprüngliche Adresse an 'url' binde, dann ist der Fehler weg., mit der zweiten IP ist der Fehler weider da.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dieses Argument ist nur für die Konsolen-Variante von uPy verfügbar. Also für den Pi oder PC. Ich habe jetzt nicht die Motivation, in den Code von uPy zu schauen, aber ich bezweifle, dass du da eine Option hast. Der wird auf dem ESP an Speicher bekommen, was verfügbar ist. Das ist eben nicht so viel.

Zeile 60 müsste https://github.com/micropython/micropyt ... sts.py#L60 sein.

Und wenn man dem mal nachgeht, dann findet man zb https://forum.micropython.org/viewtopic.php?t=10249 - da hat einer leider keine Antwort bekommen. Andere https://stackoverflow.com/questions/511 ... -websocket suggerieren, das Problem ist verschwunden, nachdem sie eine neue uPy Version benutzt haben. Welche Version benutzt du?
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Okay ich verstehe, Danke.

Ich benutze diese Version: esp32spiram-idf3-20210202-v1.14
Ich habe mit den Versionen etwas rumprobiert, da ich 'urllib.parse' nicht importieren konnte und dachte das liegt an der Version. Bin dann bei der Version hängen geblieben und habe die Datei eben separat auf dem ESP32 abgespeichert um sie nutzen zu können.

Es ist dieser ESP: https://www.az-delivery.de/en/products/ ... 2606&_ss=r

Was mir die Zeile 60 sagen soll, verstehe ich so nicht ganz.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Zeile 60 sagt, das es beim SSL wrapping passiert. Das ist aber erstmal nichts, was Unmengen Speicher kosten sollte. Was die anderen Posts ja auch suggerieren. Und damit klingt es mehr nach einem bug.

Es gibt eine neue Version, ich benutze 1.15. Ich weiß nicht, ob das wirklich einen Unterschied macht, aber es kann nicht schaden.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Achs okay, danke.

Habe jetzt die Version 1.15 installiert allerdings bekomme ich die gleiche Fehlermeldung. Nur das es in der Fehlermeldung jetzt 1744bytes sind.
Ab und zu kann er auch 'urlencode' nicht importieren, nach ein paar mal ein und ausstecken geht es dann wieder. 'urequest' konnte er mit dieser Version gar nicht importieren. Die Datei musste ich wieder extra auf dem ESP32 speichern um darauf zuzugreifen. Das verstehe ich nicht wirklich.

Ist in diesem Fall mein Projekt gestorben? Das ist zwar nur zufällig entstanden, aber vielleicht brauche ich so etwas ja mal.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe das mit dem urequest und dem extra speichern nicht. urequest ist doch kein Bestandteil von micropython. Also musst du das irgendwie installieren. So wie viele andere Dinge unter "normalem" Python auch. Was also ist daran jetzt so ungewoehnlich? Und nachdem man ein neues uPy geflasht hat, muss man (denke ich) alles neu installieren, ja. Das kommt theoretisch ein bisschen drauf an, der unterstuetzt auch nur die firmware (also uPy) zu updaten, und laesst Nutzdaten (die dann Python sind) unangetastet, aber je nachdem, wie du das gemacht hast, wird das auch geloescht.

Und ich habe erstmal keine weiteren Hinweise. Ich wuerde mich an die Autoren von urequest wenden, die oder an die micropython-community. Denn ich habe im Moment nicht die Kapazitaet, da tiefer einzusteigen, und die Firmware selbst zu bauen & zu debuggen. Dazu muesste ich das selbst benoetigen. Das kann irgendwann mal sein, weil ich den ja fuer das Projekt Beehive benutze, aber akut ist da noch kein Bedarf.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Ich musste das 'urequests' nicht extra auf dem ESP32 abspeichern, mit der anderen Firmeware. Es hatte gereicht das ich 'import urequests' geschrieben hatte. Das ging mit der jetzigen Firmeware nicht mehr. Darüber habe ich mich gewundert.

Ich beschreibe kurz wie ich die Firmeware geflasht habe und die Module "installiert" nur um sicher zu gehen, dass ich das richtig gemacht habe.
Firmeware geflasht mit:

Code: Alles auswählen

esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-20210418-v1.15.bin
Die 'urequests.py' habe ich dann ganz "normal" wie die 'main.py' erstellt und auf dem ESP gespeichert. Also im gleichen Verzeichnis wie 'main.py' und 'boot.py'.
Der Inhalt der 'urequests.py' ist dieser:
https://github.com/micropython/micropyt ... equests.py

Vielen Dank dass du dir Zeit für mich genommen hast, war wieder sehr lehrreich.

Grüße und schönen Sonntag noch
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann muss das aber eine andere Firmware gewesen sein, denn offiziell ist urequests kein Bestandteil von uPy. Und das steht ja auch in deinem Link:
micropython-lib is a project to develop a non-monolothic standard library for "advanced" MicroPython fork
Der verweist dann auf https://github.com/pfalcon/pycopy

Ich habe gerade wegen dem beehive-Projekt mit der micropython-lib zu tun. Ohne gross drueber nachzudenken habe ich gerade das parse.py dessen urrlib benutzen wollen. Das ist *35KB* gross. Das ist absurd. So viel Code/Daten fuer so wenig Funktion - wenn das der Standard ist, mit dem die arbeiten, dann ist es auch kein Wunder, das urquests irgendwie nicht funktioniert. Denn dann wird da vieeeeel zu viel Speicher einfach verschwendet.

Und das sagen die ja auch:
Note that the main target of micropython-lib is a "Unix" port of the aforementioned fork of MicroPython
Ich weiss nicht, wozu das dann genau gut sein soll. Aber mE ist das untauglich fuer den ESP32, und ich werde mir jetzt was anderes ueberlegen.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Oh okay, vielen Dank für den Hinweis.

Dann widme ich mich jetzt wieder meinen anderen angefangenen Projekten. Hierfür eine Lösung zu finden und umzusetzen ist zu groß und damit auch zu zeitaufwändig für mich.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten