boot.py WiFi script
-
We want to share with you this
boot.py
script that we've been using internally in our development boards, in hope that you find it useful.A short list of what it does:
- Configures the serial port at 115200 bauds (needed for Pymakr to connect over serial).
- Tries to connect to a list of known access points.
- If it doesn't find a known network, it fallbacks to access point mode, so you can connect straight to your board as it comes from the factory.
Please modify the first line to match your known networks.
Here is the script:
known_nets = [('home_ssid', 'home_password'), ('office_ssid', 'office_password')] # change this line to match your WiFi settings import machine import os uart = machine.UART(0, 115200) # disable these two lines if you don't want serial access os.dupterm(uart) if machine.reset_cause() != machine.SOFT_RESET: # needed to avoid losing connection after a soft reboot from network import WLAN wl = WLAN() # save the default ssid and auth original_ssid = wl.ssid() original_auth = wl.auth() wl.mode(WLAN.STA) available_nets = wl.scan() nets = frozenset([e.ssid for e in available_nets]) known_nets_names = frozenset([e[0] for e in known_nets]) net_to_use = list(nets & known_nets_names) try: net_to_use = net_to_use[0] pwd = dict(known_nets)[net_to_use] sec = [e.sec for e in available_nets if e.ssid == net_to_use][0] wl.connect(net_to_use, (sec, pwd), timeout=10000) except: wl.init(mode=WLAN.AP, ssid=original_ssid, auth=original_auth, channel=6, antenna=WLAN.INT_ANT)
-
It doen't work when using a serial connection to the LoPy.
When I tried a wifi connection it's able to run and seems to work fine.
-
I try to run this script from Pymakr first but nothing happens and REPL window of LoPy becomes dead.
So I thought it has something to do with the script and removed the dupterm part (because it's already in my boot.py and not needed from Pymakr). Still the same result.
What could be the problem?
-
I think it's a little easier to use the dict directly:
known_nets = { # SSID : PSK (passphrase) 'home_ssid': 'home_password', 'office_ssid': 'office_password', } # change this dict to match your WiFi settings import machine import os # disable these two lines if you don't want serial access uart = machine.UART(0, 115200) os.dupterm(uart) # test needed to avoid losing connection after a soft reboot if machine.reset_cause() != machine.SOFT_RESET: from network import WLAN wl = WLAN() # save the default ssid and auth original_ssid = wl.ssid() original_auth = wl.auth() wl.mode(WLAN.STA) for ssid, bssid, sec, channel, rssi in wl.scan(): # Note: could choose priority by rssi if desired try: wl.connect(ssid, (sec, known_nets[ssid]), timeout=10000) break except KeyError: pass # unknown SSID else: wl.init(mode=WLAN.AP, ssid=original_ssid, auth=original_auth, channel=6, antenna=WLAN.INT_ANT)
Exercise left to do: try other recognized nets if association fails with one. Another possible feature is picking a less contended channel.