in einer Anwendung auf einem ESP32 D1 Mini NodeMCU Board stelle ich im Heimnetz eine kleine Web-Page zur Verfügung die regelmäßig automatisch aktualisiert wird, und gleichzeitig benötigt die Anwendung Informationen aus dem Internet. Da die Internetseite sehr klein und übersichtlich ist, kann ich den Response-Text direkt mit einfachen Python-Befehlen auslesen und benötige kein BeautifulSoup etc.
Da die Applikation inzwischen recht umfangreich ist, habe ich die für die Frage relevanten Techniken in ein kleines Test-Programm übertragen (das Test-Programm selbst ist zugegebenermaßen unsinnig und hat auch keine Auswertung durch den Crawler).
Beide Funktionen funktionieren, bis bei der Abfrage der Internet-Seite einmalig eine Exception -202 erfolgt. Davon "erholt" sich das Programm nicht mehr. Die bereitgestellte Web-Page im Heimnetz funzt aber noch, und auch die damit verbundene Funktion (LED ein/aus).
Ich konnte leider keinen Hinweis auf die Bedeutung des Exception-Codes "-202" bekommen.
Er tritt immer dann auf, wenn auf der Web-Page im Heimnetz eine Aktion erfolgt (Tasten-Druck oder automatischer Refresh) und gleichzeitig der request.get von meinem Web-Crawler durchgeführt wird. In meiner eigentlichen Applikation habe ich noch einen Mechanismus ergänzt, der die Refreshzeit erhöht, wenn der Fehler einmalig aufgetreten ist. Das hat die Laufzeit erheblich verlängert, aber nach einem halben Tag funktioniert auch dann keine einzige Crawer-Abfrage mehr (der Rest läuft fehlerfrei weiter). Da ich mir diesen Mechanismus in diesem Test-Programm erspart habe ist hier die Refresh-Zeit von eigentlich 2 auf 3 Sekunden erhöht.
Nun die 3 Fragen:
- Was kann ich generell tun, um die beiden Funktionen sicherer laufen zu lassen?
- Was bedeutet die Exception -202?
- Wie kann ich detailliertere Fehlerinformationen in dem Programm abrufbar machen?
Und hier das Test-Programm:
Code: Alles auswählen
try:
import urequests as requests
except:
import requests
# Complete project details at https://RandomNerdTutorials.com !BUT MODIFIED!
from time import sleep
try:
import usocket as socket
except:
import socket
from machine import Pin
import network
import esp
esp.osdebug(None)
import gc
gc.collect()
ssid = 'XXXXXX' ####
password = 'YYYYYYY' ####
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
for retry in range(100):
connected = station.isconnected()
if connected:
print('Connection successful')
print(station.ifconfig())
break
sleep(0.1)
print('.', end='')
led = Pin(2, Pin.OUT)
def web_page():
if led.value() == 1:
gpio_state="ON"
else:
gpio_state="OFF"
html = """<html><head> <title>ESP Web Server</title> <meta name="viewport" http-equiv="refresh" content="3" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}
h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none;
border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
.button2{background-color: #4286f4;}</style></head><body> <h1>ESP Web Server</h1>
<p>GPIO state: <strong>""" + gpio_state + """</strong></p><p><a href="/?led=on"><button class="button">ON</button></a></p>
<p><a href="/?led=off"><button class="button button2">OFF</button></a></p></body></html>"""
return html
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)
try:
while True:
print('https://www.crawler-test.com/description_tags/description_with_whitespace')
try:
response = requests.get('https://www.crawler-test.com/description_tags/description_with_whitespace')
responseTxt = response.text
response.close()
print('Answer from Crawler-Test received ')
#print(responseTxt)
except Exception as e:
if hasattr(e, 'message'):
print('\033[31mNo answer from Crawler-Test (exception %s)\033[0m' % e.message)
else:
print('\033[31mNo answer from Crawler-Test (exception No %s)\033[0m' % e)
responseTxt = ''
except OSError as e:
if hasattr(e, 'message'):
print('\033[31mNo answer from Crawler-Test (OSError %s)\033[0m' % e.message)
else:
print('\033[31mNo answer from Crawler-Test (OSError No %s)\033[0m' % e)
responseTxt = ''
s.settimeout(0.10)
try:
conn, addr = s.accept()
conn.settimeout(0.50)
print('Got a connection from %s' % str(addr))
request = conn.recv(1024)
request = str(request)
#print('Content = %s' % request)
led_on = request.find('/?led=on')
led_off = request.find('/?led=off')
if led_on == 6:
print('LED ON')
led.value(1)
if led_off == 6:
print('LED OFF')
led.value(0)
response = web_page()
conn.send('HTTP/1.1 200 OK\n')
conn.send('Content-Type: text/html\n')
conn.send('Connection: close\n\n')
conn.sendall(response)
conn.close()
except OSError as e:
pass
except KeyboardInterrupt:
print('Ende')
pass
Lieben Gruß
Äd