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 移植版 為不同硬體所實作的所有網路介面類別共用。這表示 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 位址)

disconnect() None

與網路中斷連線。

isconnected() bool

若已連線至網路則回傳 True,否則回傳 False

scan(**kwargs: Any) List[Tuple]

掃描可用的網路服務/連線。回傳一個包含所探索服務參數的元組清單。對於各種網路媒介,有不同變體的預先定義/建議元組格式,其中包括:

  • WiFi:(ssid, bssid, channel, RSSI, security, hidden)。可能還有特定裝置專屬的其他欄位。

此函式可接受額外的關鍵字引數,以篩選掃描結果(例如掃描特定服務、特定頻道、特定集合的服務等),並影響掃描持續時間與其他參數。在可能的情況下,參數名稱應與 connect() 中的名稱相符。

status(param: str | None = None) Any

查詢介面的動態狀態資訊。當不帶引數呼叫時,回傳值描述網路連結狀態。否則 param 應為一個字串,用於指定要擷取的特定狀態參數。

回傳的類型與值視網路媒介/技術而定。可能支援的部分參數包括:

  • WiFi STA:使用 'rssi' 來擷取 AP 訊號的 RSSI

  • WiFi AP:使用 'stations' 來擷取所有已連線至 AP 的 STA 清單。該清單包含 (MAC, RSSI) 形式的元組。

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

取得或設定介面特定的 IP 設定介面參數。支援的參數如下(特定參數的可用性視移植版與特定網路介面而定):

  • dhcp4True/False)透過 DHCP 取得 IPv4 位址、閘道與 dns 伺服器。此方法不會封鎖並等待取得位址。要檢查是否已取得位址,請使用唯讀屬性 has_dhcp4

  • gw4 取得/設定 IPv4 預設閘道。

  • dhcp6True/False)透過無狀態 DHCPv6 取得 DNS 伺服器。目前尚未實作透過 DHCPv6 取得 IP 位址。

  • autoconf6True/False)透過路由器通告中所共用的網路前綴取得無狀態 IPv6 位址。要檢查是否已取得無狀態位址,請使用唯讀屬性 has_autoconf6

  • addr4(例如 192.168.0.4/24)取得目前的 IPv4 位址與網路遮罩,格式為 (ip, subnet) 元組,不論此位址是如何取得的。此方法可用於設定靜態 IPv4 位址,可採 (ip, subnet) 元組或 CIDR 表示法。

  • addr6(例如 fe80::1234:5678)取得目前 IPv6 位址的清單,格式為 (ip, state, preferred_lifetime, valid_lifetime) 元組。這包括 link-local、slaac 與靜態位址。preferred_lifetimevalid_lifetime 代表每個 IPv6 位址剩餘的有效與偏好生命週期,以秒為單位。state 表示位址的目前狀態:

    • 0x08 - 0x0f 表示位址為暫定(tentative),計算已送出的探測次數。

    • 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 用戶端請求的一部分,而大多數移植版中的 mDNS 實作只在連線期間初始化主機名稱一次。基於此原因,您必須在啟用/連線網路介面之前設定主機名稱。

主機名稱的長度限制為 32 個字元。MicroPython 移植版 可能會基於記憶體因素設定較低的限制。若給定的名稱無法符合,則會引發 ValueError

預設主機名稱通常為板子的名稱。

network.ipconfig(param: str) Any
network.ipconfig(**kwargs: Any) None

取得或設定全域 IP 設定參數。支援的參數如下(特定參數的可用性視移植版與特定網路介面而定):

  • dns 取得/設定 DNS 伺服器。此方法可同時支援 IPv4 與 IPv6 位址。

  • prefer4/6)指定當網域名稱同時具有 A 與 AAAA 記錄時,要回傳哪一種位址類型。請注意,這並不會清除本機 DNS 快取,因此任何先前取得的位址可能不會改變。