network --- 网络配置¶
本模块提供网络驱动和路由配置。要使用本模块,必须安装具备网络功能的 MicroPython 变体 / 构建版本。本模块内提供了针对特定硬件的网络驱动,用于配置硬件网络接口。配置好的接口所提供的网络服务,随后即可通过 socket 模块使用。
例如:
import network
import socket
import time
nic = network.WLAN(network.WLAN.IF_STA)
nic.active(True)
nic.connect("your-ssid", "your-key")
print("Waiting for connection...")
while not nic.isconnected():
time.sleep(1)
print(nic.ipconfig("addr4"))
# Open a TCP socket as usual.
addr = socket.getaddrinfo("micropython.org", 80)[0][-1]
s = socket.socket()
s.connect(addr)
s.send(b"GET / HTTP/1.1\r\nHost: micropython.org\r\n\r\n")
data = s.recv(1000)
s.close()
请根据摄像头情况,将 WLAN 替换为 WINC(旧式 WiFi 扩展板)或 LAN(内置以太网)。构造 -> 激活 -> 连接 -> 使用 socket 这一高层模式在这三种情况下都是相同的。
通用网络适配器接口¶
本节描述一个(隐含的)抽象基类,它适用于由 MicroPython ports 为不同硬件实现的所有网络接口类。这意味着 MicroPython 实际上并不提供 AbstractNIC 类,但后续各节所述的任何实际 NIC 类都会实现此处描述的方法。
- class network.AbstractNIC(id: int | None = None, *args: Any, **kwargs: Any) None¶
实例化一个网络接口对象。参数取决于具体的网络接口。如果存在多个同类型接口,第一个参数应为
id。- active(is_active: bool | None = None, /) bool¶
启动或关闭网络接口。
不带参数调用时,返回当前状态 —— 接口处于激活状态时为
True,否则为False。传入
True以激活接口:为底层网络控制器上电 / 复位,在适用情况下加载固件,并在该接口上启动 IP 协议栈。随后与网络通信的调用(connect()、scan()、ipconfig()、……)都要求接口处于激活状态。传入
False以停用接口:拆除 IP 协议栈并释放驱动资源。在无线接口上,这还会与任何当前已加入的网络解除关联。在未激活的接口上调用其他方法的行为是未定义的。
- connect(service_id: str | None = None, key: str | None = None, *, bssid: bytes | None = None, **kwargs: Any) None¶
将接口连接到某个网络。此方法是可选的,仅对那些并非“始终保持连接”的接口可用。如果不提供任何参数,则连接到默认(或唯一)服务。如果提供单个参数,则它是要连接的服务的主标识符。它可能还需要一个用于访问该服务的密钥(密码)。此外还可以有任意的、仅限关键字的参数,具体取决于网络介质类型和 / 或特定设备。这些参数可用于:a) 指定备用的服务标识符类型;b) 提供额外的连接参数。对于不同的介质类型,存在不同的预定义 / 推荐参数集,其中包括:
WiFi:使用 bssid 关键字连接到特定的 BSSID(MAC 地址)
- scan(**kwargs: Any) List[Tuple]¶
扫描可用的网络服务 / 连接。返回一个元组列表,包含已发现服务的参数。对于不同的网络介质,存在不同的预定义 / 推荐元组格式变体,其中包括:
WiFi:(ssid, bssid, channel, RSSI, security, hidden)。可能还有特定于具体设备的更多字段。
该函数可以接受额外的关键字参数,用于过滤扫描结果(例如扫描特定服务、在特定信道上扫描、扫描特定集合内的服务等),以及影响扫描时长和其他参数。在可能的情况下,参数名应与 connect() 中的参数名保持一致。
- status(param: str | None = None) Any¶
查询接口的动态状态信息。不带参数调用时,返回值描述网络链路状态。否则 param 应为一个命名要获取的特定状态参数的字符串。
返回类型和值取决于网络介质 / 技术。可能支持的部分参数包括:
WiFi STA:使用
'rssi'获取 AP 信号的 RSSIWiFi AP:使用
'stations'获取已连接到该 AP 的所有 STA 的列表。列表中包含形如 (MAC, RSSI) 的元组。
- ipconfig(param: str) Any¶
- ipconfig(**kwargs: Any) None
获取或设置接口专有的 IP 配置接口参数。支持的参数如下(某个参数是否可用取决于 port 和具体的网络接口):
dhcp4(True/False)通过 DHCP 获取 IPv4 地址、网关和 dns 服务器。此方法不会阻塞等待地址获取完成。要检查是否已获取到地址,请使用只读属性has_dhcp4。gw4获取 / 设置 IPv4 默认网关。dhcp6(True/False)通过无状态 DHCPv6 获取 DNS 服务器。目前尚未实现通过 DHCPv6 获取 IP 地址。autoconf6(True/False)通过路由器通告中共享的网络前缀获取无状态 IPv6 地址。要检查是否已获取到无状态地址,请使用只读属性has_autoconf6。addr4(例如192.168.0.4/24)以(ip, subnet)元组形式获取当前 IPv4 地址和网络掩码,无论该地址是如何获取的。此方法可用于设置静态 IPv4 地址,既可以是(ip, subnet)元组形式,也可以是 CIDR 表示法。addr6(例如fe80::1234:5678)以(ip, state, preferred_lifetime, valid_lifetime)元组形式获取当前 IPv6 地址列表。这包括链路本地地址、slaac 地址和静态地址。preferred_lifetime和valid_lifetime表示每个 IPv6 地址剩余的有效生存期和首选生存期,单位为秒。state表示地址的当前状态:0x08-0x0f表示地址处于暂定状态,数值为已发送的探测次数。0x10地址已弃用(但仍然有效)0x30地址为首选(且有效)0x40地址重复,无法使用。
此方法可用于设置静态 IPv6 地址,将此参数设为该地址即可,如
fe80::1234:5678。
- ifconfig(config: Tuple[str, str, str, str] | None = None) Tuple[str, str, str, str] | None¶
备注
此函数已弃用,请改用
ipconfig()。获取 / 设置 IP 层网络接口参数:IP 地址、子网掩码、网关和 DNS 服务器。不带参数调用时,此方法返回一个包含上述信息的 4 元组。要设置上述值,请传入一个包含所需信息的 4 元组。例如:
nic.ifconfig(('192.168.0.4', '255.255.255.0', '192.168.0.1', '8.8.8.8'))
- config(param: str) Any¶
- config(**kwargs: Any) None
获取或设置通用网络接口参数。这些方法允许处理标准 IP 配置(由
ipconfig()负责)之外的额外参数,其中包括网络专有和硬件专有的参数。设置参数时应使用关键字参数语法,并且可以一次设置多个参数。查询时,参数名应以字符串形式引用,且一次只能查询一个参数:# Set WiFi access point name (formally known as SSID) and WiFi channel ap.config(ssid='My AP', channel=11) # Query params one by one print(ap.config('ssid')) print(ap.config('channel'))
具体的网络类实现¶
以下具体类实现了 AbstractNIC 接口,并提供了一种控制各类网络接口的方式。
网络函数¶
以下是 network 模块中可用的函数。
- network.country(code: str | None = None) str | None¶
获取或设置用于射频合规的两字母 ISO 3166-1 Alpha-2 国家代码。
如果提供了 code 参数,则将国家设为该值。如果不带参数调用此函数,则返回当前国家。
默认代码
"XX"表示“全球”区域。
- network.hostname(name: str | None = None) str | None¶
获取或设置用于在网络上标识本设备的主机名。它将被所有接口使用。
- 此主机名用于:
在客户端请求中发送给 DHCP 服务器。(如果使用 DHCP)
通过 mDNS 广播。(如果已启用)
如果提供了 name 参数,则将主机名设为该值。如果不带参数调用此函数,则返回当前主机名。
主机名的更改通常只在连接期间应用。对于 DHCP,这是因为主机名是 DHCP 客户端请求的一部分;而大多数 port 中的 mDNS 实现只在连接期间初始化主机名一次。因此,你必须在激活 / 连接网络接口之前设置主机名。
主机名长度限制为 32 个字符。MicroPython ports 可能出于内存原因选择设置更低的限制。如果给定的名称不符合要求,则抛出
ValueError。默认主机名通常是开发板的名称。