MicroPythonで複数の候補の中から最もRSSIの大きいネットワークに接続する


MicroPythonで開発する場合にちょっと便利なコード。いつも同じ場所で開発するならいいが、よそに持っていく機会があったり、複数の場所で開発を進めたりするとき複数の候補の中から最もRSSIの大きいネットワークに接続できるようにしておくと捗る。

まずこんな感じでSSIDをパスワードのペアのリストを定義する。

preferred_networks = [
    ('ap0_ssid', 'ap0_password'),
    ('ap1_ssid', 'ap1_password'),
    ('ap2_ssid', 'ap2_password')
]

その中から最もRSSIの大きいものに接続する。

import time
import network

wlan = network.WLAN(network.STA_IF)
wlan.active(True)

connection_interval = 0.5
connection_timeout = 5.0

def try_to_connect (target, config):
    delay = 0
    print("Trying to connect...")
    print(target)
    wlan.connect(config[0], config[1]) # SSID, password
    while not wlan.isconnected() :
        time.sleep(connection_interval)
        delay += connection_interval
        if delay > connection_timeout:
            print("Timeout.")
            wlan.disconnect()
            return None # Failed
    # Return wlan config
    return wlan.ifconfig()

def connect ():
    # Scan
    print("Scanning...")
    networks = wlan.scan()
    # (ssid, bssid, channel, RSSI, security, hidden)
    sorted_network = sorted(networks, key=lambda x: x[3], reverse=True)
    for found in sorted_network:
        for preferred in preferred_networks:
            # Compare
            if preferred[0] == found[0].decode("utf-8"):
                result = try_to_connect(found, preferred)
                if result is not None:
                    print("Connected.")
                    print(result)
                    return

wlan.disconnect()
connect()

起動時にこれが実行されるようにしておけば、スキャンして見つけたネットワークの中で preferred_networks に含まれるもののうち、最もRSSIが大きいものから順に接続を試行するようになる。