使用 esp32 开发程序,非常重要的功能就是使用 wifi,下面我们就讲一下 esp32 连接 wifi 的方法。
在我们能接触的 WiFi 网络中,Wi-Fi
设备通常处于以下两种角色中的一种:
AP
) 无线接入点,家里常见的路由器就是结合 WiFi 和网络路由功能的 AP,AP 和 AP 可以相互连接。STA
) 无线终端,像手机、电脑等需要联网的设备都处于 STA 模式,这个模式不允许其他设备接入。说明:
一个设备可能既支持 AP 又支持 STA,但是一般设备同一时间,WiF 模块只能启用其中的一种模式,像手机既能连接外面的 WiFi,又能自己开热点让别的设备连接,但是每当开启热点,WiFi 就会自动关闭,这是因为手机在同一时间只能支持 AP 和 STA 一种。
官方文档对 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 的密码。
说明:
现在的路由器都有 2.4g 和 5G 两个频段的信号,但是 esp32 只支持 2.4G 的信号。
官网提供了一个创建 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,这个功能不常用,我们以后会在补充里面介绍。
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")