класс WLAN – управление встроенными интерфейсами WiFi

Класс WLAN управляет встроенными радиомодулями WiFi на современных камерах OpenMV Cam. Один и тот же класс является обёрткой над двумя разными низкоуровневыми драйверами в зависимости от WiFi-микроконтроллера платы:

  • CYW43 (модуль WiFi Infineon CYW43xxx производства Murata). Используется в OpenMV Cam N6, OpenMV Cam RT1062, Arduino Portenta H7, Arduino Nicla Vision и Arduino Giga R1 WiFi.

  • NINA W10 (u-blox NINA-W10 / ESP32-WROOM). Используется в Arduino Nano RP2040 Connect.

Оба драйвера предоставляют одинаковые имена методов, но различаются несколькими аргументами и набором допустимых ключей config(). Различия отмечены ниже.

Камеры OpenMV со старым WiFi-шилдом WINC1500 (M4 / M7 / H7 / H7 Plus / Pure Thermal) используют вместо этого класс WINC.

Пример использования:

import network

# Enable the station interface and connect to a WiFi AP.
nic = network.WLAN(network.WLAN.IF_STA)
nic.active(True)
nic.connect("your-ssid", "your-key")
while not nic.isconnected():
    pass

print(nic.ipconfig("addr4"))

Конструкторы

class network.WLAN(interface_id: int = WLAN.IF_STA) None

Создаёт объект интерфейса WLAN.

interface_id выбирает, с каким интерфейсом работать:

  • WLAN.IF_STA – режим станции / клиента. Подключение к вышестоящей точке доступа с помощью connect(). Это значение по умолчанию.

  • WLAN.IF_AP – режим точки доступа. Настройте точку доступа с помощью config() и принимайте подключения клиентов.

Один и тот же физический радиомодуль обслуживает оба интерфейса; создание одного не исключает использования другого.

Методы

active(is_active: bool | None = None) bool

Включает или выключает радиомодуль WiFi.

Без аргументов возвращает текущее состояние – True, пока радиомодуль включён, иначе False.

active(True) включает питание WiFi-микроконтроллера, загружает его прошивку (CYW43 извлекает блоб прошивки из флеш-памяти; NINA проверяет версию уже прошитой прошивки) и поднимает netif lwIP для этого интерфейса. Все остальные методы – connect(), scan(), ipconfig() и им подобные – требуют, чтобы интерфейс был активен.

active(False) снова выключает питание радиомодуля. На интерфейсе STA это также отсоединяет от текущей точки доступа и освобождает netif.

connect(ssid: str, key: str | None = None, *, security: int = -1, bssid: bytes | None = None, channel: int = -1) None

Ассоциирует интерфейс STA с заданной точкой доступа.

ssid – SSID сети (строка или bytes).

key – пароль / предварительно разделяемый ключ. Передайте None для открытой сети.

security (только по ключевому слову) – одна из констант SEC_*. -1 (значение по умолчанию) выбирает автоматически: SEC_OPEN, когда key пуст, и SEC_WPA_WPA2 в противном случае.

bssid (только по ключевому слову, только CYW43) – ограничивает ассоциацию точкой доступа с этим 6-байтовым MAC-адресом. Игнорируется драйвером NINA.

channel (только по ключевому слову) – предпочтительный радиоканал. По умолчанию «пусть драйвер выбирает сам».

disconnect() None

В режиме STA отсоединяет от точки доступа, с которой в данный момент установлена ассоциация. Интерфейс остаётся активным; вызовите connect() снова для повторной ассоциации или active() (False), чтобы полностью выключить радиомодуль. Не выполняет никаких действий, если ассоциация в данный момент отсутствует.

isconnected() bool

В режиме STA возвращает True, когда установлена ассоциация с точкой доступа и получен IPv4-адрес от DHCP (или назначен статически через ipconfig()). Возвращает False, пока соединение всё ещё находится в фазе аутентификации/ассоциации/DHCP.

В режиме AP возвращает True, когда подключилась хотя бы одна станция.

scan(*, passive: bool = False, ssid: bytes | None = None, bssid: bytes | None = None) List[Tuple[bytes, bytes, int, int, int, int]]

Сканирует ближайшие точки доступа и возвращает список из кортежей по 6 элементов:

  • [0] SSID (bytes; пустой для скрытых сетей).

  • [1] BSSID (6-байтовый MAC, bytes). Преобразуйте с помощью binascii.hexlify().

  • [2] Номер канала.

  • [3] RSSI в дБм.

  • [4] Режим безопасности (одна из констант SEC_*).

  • [5] Зарезервировано (всегда 1).

Все именованные аргументы доступны только для CYW43:

  • passive – если True, использовать пассивное сканирование вместо активного сканирования с probe-request, применяемого по умолчанию.

  • ssid – ограничить сканирование одним SSID.

  • bssid – ограничить сканирование одним BSSID.

Сканирование имеет смысл только на интерфейсе STA.

status() int
status(param: str) Any

Запрашивает состояние соединения.

Без аргументов возвращает статус соединения в виде небольшого целого числа (кодировка зависит от драйвера – истинное значение означает «ассоциация установлена»).

Со строковым аргументом:

  • "rssi" – в режиме STA возвращает текущий RSSI в дБм.

  • "stations" – в режиме AP возвращает список подключённых станций. CYW43 возвращает [(mac_bytes,), ...]; NINA возвращает [ip_string, ...].

ifconfig(config: Tuple[str, str, str, str] | None = None) Tuple[str, str, str, str] | None

Получает или задаёт параметры IPv4-интерфейса в виде кортежа из 4 элементов (ip, subnet, gateway, dns) со строками в точечно-десятичной нотации.

Примечание

Для нового кода предпочтительно использовать ipconfig():

nic.ipconfig(addr4="192.168.0.4/24", gw4="192.168.0.1")
network.ipconfig(dns="8.8.8.8")
ipconfig(param: str) Any
ipconfig(**kwargs: Any) None

Получает или задаёт параметры интерфейса IPv4 / IPv6. Драйвер CYW43 делегирует работу стандартной реализации lwIP и поддерживает полный набор ключей, описанный в AbstractNIC.ipconfig(). Драйвер NINA реализует меньшее подмножество, специфичное для интерфейса – dhcp4 и has_dhcp4 (только для чтения), плюс addr4 и gw4 для получения / установки.

config(param: str) Any
config(**kwargs: Any) None

Получает или задаёт параметры интерфейса, специфичные для WiFi.

С одним позиционным строковым аргументом возвращает значение этого параметра. С именованными аргументами задаёт один или несколько параметров за раз – изменения, затрагивающие работающую точку доступа, приводят к её автоматической перезагрузке (выключению и повторному включению).

Пример:

# Set up the access-point name and channel.
ap.config(ssid="My AP", channel=11)
# Query params one at a time.
print(ap.config("ssid"))
print(ap.config("mac"))

Драйвер CYW43 – получаемые параметры:

  • "antenna" – селектор антенны (int).

  • "channel" – текущий канал.

  • "ssid" / "essid" – текущий SSID (строка).

  • "security" – режим аутентификации точки доступа (одна из SEC_*).

  • "mac" – MAC-адрес интерфейса (6 bytes).

  • "pm" – значение управления питанием.

  • "txpower" – мощность передачи в дБм.

  • "hostname" – имя хоста DHCP/mDNS. Устарело; используйте вместо него network.hostname().

Драйвер CYW43 – задаваемые параметры:

  • antenna=<int> – селектор антенны.

  • channel=<int> – канал точки доступа.

  • ssid=<str> / essid=<str> – SSID точки доступа.

  • key=<str> / password=<str> – предварительно разделяемый ключ точки доступа.

  • security=<int> – режим аутентификации точки доступа (одна из SEC_*).

  • pm=<int> – режим управления питанием (один из PM_NONE, PM_PERFORMANCE, PM_POWERSAVE).

  • monitor=<int> – включить режим мониторинга / приёма всего multicast-трафика.

  • txpower=<int> – мощность передачи в дБм.

  • trace=<int> – внутренняя битовая маска трассировки драйвера.

  • hostname=<str> – имя хоста DHCP/mDNS. Устарело; используйте вместо него network.hostname().

Драйвер NINA – получаемые параметры:

  • "ssid" – текущий SSID (строка).

  • "security" – режим аутентификации точки доступа.

  • "mac" / "bssid" – MAC-адрес интерфейса (6 bytes).

  • "fw_version" – кортеж из 3 элементов (major, minor, patch).

Драйвер NINA – задаваемые параметры: вызов перенаправляется в connect() и принимает те же именованные аргументы (ssid, key, security, channel). Допустимо только на интерфейсе AP.

deinit() None

Перезапускает по питанию WiFi-микроконтроллер и освобождает все ресурсы, удерживаемые драйвером (буферы прошивки, netif lwIP, шину SPI/SDIO). После этого вызова объект WLAN необходимо создать заново перед использованием. Используйте этот метод, а не active() (False), когда нужен полный сброс (например, перед повторной прошивкой прошивки радиомодуля или для восстановления из зависшего состояния драйвера). Только CYW43.

send_ethernet(buf: bytes) None

Внедряет необработанный Ethernet-кадр buf напрямую в путь передачи драйвера, минуя IP-стек. Предназначено для потребителей уровня L2 – мостов, пользовательских протоколов EtherType и тому подобного. Кадр должен включать MAC-адреса получателя/отправителя и EtherType (без FCS – его добавляет аппаратура). Только CYW43.

ioctl(cmd: int, buf: bytearray) None

Выдаёт управляющую команду, специфичную для драйвера. cmd – это числовой код ioctl, определённый прошивкой используемого радиомодуля, а buf – изменяемый буфер, используемый как для полезной нагрузки команды, так и для ответа. Набор допустимых значений cmd зависит от драйвера и не переносим между CYW43 и NINA. Используется в основном низкоуровневыми тестовыми скриптами и кодом начальной инициализации чипа.

Константы

IF_STA: int

Идентификатор интерфейса станции / клиента. Передайте в конструктор для выбора режима STA.

IF_AP: int

Идентификатор интерфейса точки доступа. Передайте в конструктор для выбора режима AP.

SEC_OPEN: int

Значение безопасности для незашифрованной сети. Доступно в обоих драйверах.

SEC_WPA_WPA2: int

Значение безопасности для WPA / WPA2 с предварительно разделяемым ключом. Значение по умолчанию, когда в connect() передаётся ключ. Доступно в обоих драйверах.

SEC_WPA3: int

Значение безопасности для WPA3 (SAE) с предварительно разделяемым ключом. Только CYW43.

SEC_WPA2_WPA3: int

Значение безопасности для переходного режима WPA2 / WPA3. Только CYW43.

SEC_WEP: int

Значение безопасности для WEP (Wired Equivalent Privacy). Предоставлено для совместимости со старыми точками доступа – WEP криптографически взломан и не должен использоваться в новых развёртываниях. Только NINA.

OPEN: int

Псевдоним для обратной совместимости с SEC_OPEN. В новом коде следует использовать SEC_OPEN. Только NINA.

WEP: int

Псевдоним для обратной совместимости с SEC_WEP. В новом коде следует использовать SEC_WEP. Только NINA.

WPA_PSK: int

Псевдоним для обратной совместимости с SEC_WPA_WPA2. В новом коде следует использовать SEC_WPA_WPA2. Только NINA.

PM_NONE: int

Передайте в config(pm=...), чтобы отключить управление питанием WiFi. Только CYW43.

PM_PERFORMANCE: int

Передайте в config(pm=...), чтобы включить управление питанием WiFi, настроенное на производительность. Только CYW43.

PM_POWERSAVE: int

Передайте в config(pm=...), чтобы включить управление питанием WiFi, настроенное на максимальное время работы от батареи. Только CYW43.