-
- 官方文檔
-
- 創(chuàng)建一個(gè) STA 的基本流程
-
- 測(cè)試 udp 通信
使用 esp32 開(kāi)發(fā)程序,非常重要的功能就是使用 wifi,下面我們就講一下 esp32 連接 wifi 的方法。
在我們能接觸的 WiFi 網(wǎng)絡(luò)中,Wi-Fi
設(shè)備通常處于以下兩種角色中的一種:
- 提供無(wú)線接入的設(shè)備,稱之為 Access Point(
AP
) 無(wú)線接入點(diǎn),家里常見(jiàn)的路由器就是結(jié)合 WiFi 和網(wǎng)絡(luò)路由功能的 AP,AP 和 AP 可以相互連接。 - 連接到 AP 的設(shè)備,稱之為 Station(
STA
) 無(wú)線終端,像手機(jī)、電腦等需要聯(lián)網(wǎng)的設(shè)備都處于 STA 模式,這個(gè)模式不允許其他設(shè)備接入。
說(shuō)明:
一個(gè)設(shè)備可能既支持 AP 又支持 STA,但是一般設(shè)備同一時(shí)間,WiF 模塊只能啟用其中的一種模式,像手機(jī)既能連接外面的 WiFi,又能自己開(kāi)熱點(diǎn)讓別的設(shè)備連接,但是每當(dāng)開(kāi)啟熱點(diǎn),WiFi 就會(huì)自動(dòng)關(guān)閉,這是因?yàn)槭謾C(jī)在同一時(shí)間只能支持 AP 和 STA 一種。
1. 官方文檔
官方文檔對(duì) esp32 實(shí)現(xiàn)wifi 功能的文檔鏈接 ^[1]^ ,如下:
實(shí)現(xiàn) WiFi 連接功能,需要使用到network
模塊:
不管是 STA 還是 AP 都是基于 network 的 WLAN,針對(duì) LAN 我們以后再講。
STA 的實(shí)現(xiàn)方法 :
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 的密碼。
說(shuō)明:
現(xiàn)在的路由器都有 2.4g 和 5G 兩個(gè)頻段的信號(hào),但是 esp32 只支持 2.4G 的信號(hào)。
官網(wǎng)提供了一個(gè)創(chuàng)建 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 的實(shí)現(xiàn)方法 :
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 功能用于讓其他設(shè)備連接 esp32,這個(gè)功能不常用,我們以后會(huì)在補(bǔ)充里面介紹。
2. 創(chuàng)建一個(gè) STA 的基本流程
esp32 不管是 UDP 還是 TCP 通信,都需要兩個(gè)模塊的支持。
network:用于連接 WiFi,獲取 wifi 分配的 ip 等。
socket:用于設(shè)備之間的通信,當(dāng)連接網(wǎng)絡(luò)后,下一步就是建立和其他設(shè)備的通信。
下面我們創(chuàng)建一個(gè) WiFi 類,實(shí)現(xiàn) STA 連接:
import network
import time
class Wifi():
"""
只實(shí)現(xiàn)了STA模式的WiFi鏈接封裝
"""
def __init__(self):
self.wlan = network.WLAN(network.STA_IF)
"""
復(fù)位WiFi模塊
"""
def Init_wifi(self):
if self.wlan.isconnected():
self.wlan.active(False)
print("wifi disconnect,please Reset Configuration ")
"""
獲取WiFi狀態(tài)
"""
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) # 開(kāi)啟WiFi
return self.wlan.scan()
"""
連接WiFi
"""
def connet_wifi(self, ssid, password):
count = 10 # 10秒內(nèi)未連接到網(wǎng)絡(luò),則連接超時(shí)
self.wlan.active(True) # 開(kāi)啟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: # 連接超時(shí)
self.wlan.active(False) # 關(guān)閉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() # 創(chuàng)建WiFi對(duì)象
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")