WLAN, Micropython und M5Stack – wie geht das zusammen?

Die Geschichte von einem der auszog ein Abenteuer zu erleben.

Elementare Grundkenntnisse vom Netzwerk sind mir ja bekannt. Meine LAN-Verkabelung habe ich alleine hinbekommen. Das beschränkte sich aber überwiegend darauf Stecker in Buchsen zu stecken, Kabel zu verlegen und die Kabelenden in die richtigen Kontakte zu pressen.

Mit der Softwareseite, geschweige denn WLAN habe ich mich bisher nicht auseinander gesetzt. Nun möchte ich aber, dass die M5Stack Geräte über WLAN kommunizieren. Dafür sind sie schließlich gemacht.

Die UIFlow-IDE bietet dazu unter Blockly nur sehr begrenzte Möglichkeiten. Also wenn es über HTTP gehen soll. MQTT z.B. funktioniert gut. Die HTTP-Blöcke habe ich aber noch nicht verstanden. Micropython hingegen bietet da eine ganze Menge.

Es sind offenbar mehre Schritte erforderlich:

  • Mit dem Netzwerk verbinden
  • Ein Socket installieren
  • Ein Übertragungsprotokoll installieren

Mit einem Netzwerk verbinden.

Meistens verbindet sich ein M5Stack Gerät gleich nach dem Einschalten mit dem Netzwerk, da diese Verbindung für die Programmierung benötigt wird.

<< Ausprobieren, ob auch bei USB-Betrieb, bzw. wenn eine App läuft eine WLAN-Verbindung hergestellt wird. >>

Damit ein eine WLAN-Verbindung eingerichtet oder eine vorhandene erkannt wird ist diese der Software bekannt zu machen. Dazu dient die Library network.

# network Library importieren
>>> import network

# WLAN Interface erzeugen und aktivieren
>>> wlan = network.WLAN(network.STA_IF)
>>> wlan.active(True)

# Mit Wlan verbinden
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
wlan.connect(ssid, password)

# auf bestehende Verbindung prüfen
>>> wlan.isconnected()
True
# Oder auf Verbindung warten und ausgeben
>>> while wlan.isconnected() == False:
>>>   pass
>>> print('Connection successful')
>>> print(station.ifconfig())

# WLAN Daten abfragen (Geräte-IP, Netzwerkmaske, Gateway, DNS-Server)
>>> wlan.ifconfig()
('192.168.5.89', '255.255.255.0', '192.168.5.1', '192.168.5.1')

# Eigene IP-Adresse ermitteln
>>> netzwerk = wlan.ifconfig()
>>> netzwerk
('192.168.5.89', '255.255.255.0', '192.168.5.1', '192.168.5.1')
>>> netzwerk[0]
'192.168.5.89'
# So gehts am Kürzesten
>>> wlan.ifconfig()[0]
'192.168.5.89'

# Die vorhandenen Accesspoint suchen
>>> wlan.scan()
[(b'ESP_9235A1', b'P\x02\x91\x925\xa1', 1, -50, 0, False), (b'Kapest-Fritz', b'\x94\xb9~\x8d<e', 1, -55, 3, False), (b'Kapest-Fritz', b'\x9c\xc7\xa6\x16\xe51', 1, -77, 4, False)]

# WLAN Interface beenden
>>> wlan.active(False)

# MAC Adresse ermitteln
>>> wlan.config('mac')
b'\x94\xb9~\x8b\xb9X'

Nun kennt das Netzwerk meinen M5Stack und dieser das Netzwerk zu dem er jetzt gehört.

In mehrere bekannte Netzwerke automatisch einloggen.

Die Überschrift ist etwas irreführend. Natürlich kann sich der M5Stack immer nur in ein Netzwerk zur Zeit einloggen, aber es gibt vielleicht mehrere räumlich getrennte Netzwerke in die es sich automatisch einloggen soll, so wie wir das vom Handy kennen. Z.B. ins WLAN bei mir zu Hause oder in das des Attraktor, je nachdem, wo ich mich gerade befinde.

# zuerst immer ein WLAN erzeugen sonst geht nichts.
>>> import network
>>> wlan = network.WLAN(network.STA_IF)

# nun kann ich nach WLAN-AP's suchen
>>> wlan.scan()
[(b'ESP_9235A1', b'P\x02\x91\x925\xa1', 1, -50, 0, False), (b'Kapest-Fritz', b'\x94\xb9~\x8d<e', 1, -55, 3, False), (b'Kapest-Fritz', b'\x9c\xc7\xa6\x16\xe51', 1, -77, 4, False)]

# Das sieht nicht sehr übersichtlich aus. Mal sehen ob Micropython das auch so sieht:
>>> wlans = wlan.scan()
>>> wlans
[(b'ESP_9235A1', b'P\x02\x91\x925\xa1', 1, -45, 0, False), (b'Kapest-Fritz', b'\x9c\xc7\xa6\x16\xe51', 1, -77, 4, False)]
>>> type(wlans)
<class 'list'>

# Es wird also eine Liste mit den Daten der AP's in Tupels zurückgegeben.
# Ich benötige nur den String der SSID.

# Der versuch die AP-Tupel in einer Schleife auszulesen scheitert.
>>> wlans
[(b'ESP_9235A1', b'P\x02\x91\x925\xa1', 1, -45, 0, False), (b'Kapest-Fritz', b'\x9c\xc7\xa6\x16\xe51', 1, -77, 4, False)]

# So lassen sich alle erreichbaren AP's auflisten:
>>> for i in wlan.scan():
    print(i[0].decode("utf-8"))
    
ESP_9235A1
Kapest-Fritz
WILLY.TEL-71IU1DHQNW
FRITZ!Box 7560 LY
Brian
WLAN-807195
WLAN-372270
Telekom_FON
o2-WLAN79

# Eine einfache Version für Home und Attraktor sähe dann so aus:
>>> for i in wlan.scan():
    if (i[0].decode("utf-8")) == "Kapest-Fritz":
        print("Zu Hause")
    elif (i[0].decode("utf-8")) == "attraktor":
        print("Attraktor")
WARNING:root:Unexpected echo. Expected b'\r\n', got b''
# Es wird \r\n also eine neue Zeile Schaltung vermisst. Funktioniert ansonsten aber:
Zu Hause

''' Nachdem ich mit .decode("utf-8", errors='ignore') herumgespielt habe aber weiterhin diese Warnung erhalten habe. Habe ich aufgegeben und beschlossen die Warnung zu ignorieren. Seitdem ist sie weg.
'''
# Stefan May gab den Tip es mit "ascii" anstatt "utf-8" zu versuchen. Das klappt auch:
>>> for i in wlan.scan():
    if (i[0].decode("ascii")) == "Kapest-Fritz":
        print("Zu Hause")
    elif (i[0].decode("ascii")) == "attraktor":
        print("Attraktor")
        
Zu Hause

Einen Socket einrichten.

Ein Übertragungsprotokoll installieren

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.