-
- 官方文檔
-
- 創建一個 STA 的基本流程
-
- 測試 udp 通信
使用 esp32 開發程序,非常重要的功能就是使用 wifi,下面我們就講一下 esp32 連接 wifi 的方法。
在我們能接觸的 WiFi 網絡中,Wi-Fi
設備通常處于以下兩種角色中的一種:
- 提供無線接入的設備,稱之為 Access Point(
AP
) 無線接入點,家里常見的路由器就是結合 WiFi 和網絡路由功能的 AP,AP 和 AP 可以相互連接。 - 連接到 AP 的設備,稱之為 Station(
STA
) 無線終端,像手機、電腦等需要聯網的設備都處于 STA 模式,這個模式不允許其他設備接入。
說明:
一個設備可能既支持 AP 又支持 STA,但是一般設備同一時間,WiF 模塊只能啟用其中的一種模式,像手機既能連接外面的 WiFi,又能自己開熱點讓別的設備連接,但是每當開啟熱點,WiFi 就會自動關閉,這是因為手機在同一時間只能支持 AP 和 STA 一種。
1. 官方文檔
官方文檔對 esp32 實現wifi 功能的文檔鏈接 ^[1]^ ,如下:
實現 WiFi 連接功能,需要使用到network
模塊:
不管是 STA 還是 AP 都是基于 network 的 WLAN,針對 LAN 我們以后再講。
STA 的實現方法 :
import network
wlan = network.WLAN(network.STA_IF) # create station interface
wlan.active(True) # activate the interface
wlan.scan() # scan for access points
wlan.isconnected() # check if the station is connected to an AP
wlan.connect('ssid', 'key') # connect to an AP
wlan.config('mac') # get the interface's MAC address
wlan.ifconfig() # get the interface's IP/netmask/gw/DNS addresses
ssid:就是需要鏈接的 WiFi 的名稱。
key:就是需要鏈接的 WiFi 的密碼。
說明:
官網提供了一個創建 STA 的 demo:
def do_connect():
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('ssid', 'key')
while not wlan.isconnected():
pass
print('network config:', wlan.ifconfig())
AP 的實現方法 :
import network
ap = network.WLAN(network.AP_IF) # create access-point interface
ap.config(ssid='ESP-AP') # set the SSID of the access point
ap.config(max_clients=10) # set how many clients can connect to the network
ap.active(True) # activate the interface
AP 功能用于讓其他設備連接 esp32,這個功能不常用,我們以后會在補充里面介紹。
2. 創建一個 STA 的基本流程
esp32 不管是 UDP 還是 TCP 通信,都需要兩個模塊的支持。
network:用于連接 WiFi,獲取 wifi 分配的 ip 等。
socket:用于設備之間的通信,當連接網絡后,下一步就是建立和其他設備的通信。
下面我們創建一個 WiFi 類,實現 STA 連接:
import network
import time
class Wifi():
"""
只實現了STA模式的WiFi鏈接封裝
"""
def __init__(self):
self.wlan = network.WLAN(network.STA_IF)
"""
復位WiFi模塊
"""
def Init_wifi(self):
if self.wlan.isconnected():
self.wlan.active(False)
print("wifi disconnect,please Reset Configuration ")
"""
獲取WiFi狀態
"""
def status(self):
return self.wlan.status()
"""
獲取WiFi配置
"""
def get_wifi_config(self):
if self.wlan.isconnected():
return self.wlan.ifconfig()
"""
掃描WiFi列表
"""
def wifi_scan(self):
if wifi.status() != network.STAT_CONNECTING:
self.wlan.active(True) # 開啟WiFi
return self.wlan.scan()
"""
連接WiFi
"""
def connet_wifi(self, ssid, password):
count = 10 # 10秒內未連接到網絡,則連接超時
self.wlan.active(True) # 開啟WiFi
if not self.wlan.isconnected():
self.wlan.connect(ssid,password)
while not self.wlan.isconnected():
print('connecting to network...')
time.sleep(1)
count -= 1
if count == 0: # 連接超時
self.wlan.active(False) # 關閉WiFi
print("Connecting Timeout,Please check the account password!")
break
if self.wlan.isconnected():
# 連接成功,則打印被分配的ip等信息
print("ip:" ,self.wlan.ifconfig()[0])
print("subnet:" ,self.wlan.ifconfig()[1])
print("gateway:" ,self.wlan.ifconfig()[2])
print("dns:" ,self.wlan.ifconfig()[3])
return True
else:
# 未成功連接,則返回False
return False
if __name__ == "__main__":
wifi = Wifi() # 創建WiFi對象
wifi_list = wifi.wifi_scan() # 掃描WiFi列表
print(wifi_list)
link_wifi = wifi.connet_wifi('K3', 'zhao0312') # 連接WiFi
if(link_wifi == True):
print("connet wifi is ok")