Wi-Fi 连接
连接路由器上网是我们每天都做的事情,日常生活中我们只需要知道路由器的账号和密码,就能使用电脑或者手机连接到无线路由器,然后上网冲浪。
如今物联网市场异常火爆,WIFI 是物联网中非常重要的角色,现在基本上家家户户都有 WIFI 网络,通过 WIFI 接入到互联网,成了智能家居产品普遍的选择。ESP32 内部已集成 WIFI 功能,可以说它就是为 WIFI 无线连接而生的。本章来学习 ESP32 的 WIFI,使用 MicroPython 开发 WIFI 是非常简单而美妙的,让大家在学习物联网中变的简单有趣,WIFI 模块也是为什么 ESP32 可以迅速崛起的主要原因之一。
硬件电路设计
连接无线路由器,将 ESP32 的 IP 地址等信息通过 Shell 控制台输出显示。
由于 ESP32 内置 WIFI 功能,所以直接在开发板上使用即可,无需额外连接。
软件电路设计
MicroPython 已经集成了 network 模块,因此我们可以直接使用该模块。
模块包含热点 AP 模式和客户端 STA 模式,热点 AP 是指电脑或手机端直接连接 ESP32 发出的热点实现连接,如果电脑连接模块 AP 热点,这样电脑就不能上网,因此在使用电脑端和模块进行网络通信时,一般情况下都是使用 STA 模式。也就是电脑和设备同时连接到相同网段的路由器上。
构造函数 network.WLAN(interface_id)
: 创建 WIFI 连接对象,interface_id
分为热点 network.AP_IF 和 客户端 network.STA_IF 模式。
使用方法:
# 导入 network 模块
import network
# 创建 WIFI 连接对象
wlan = network.WLAN(network.STA_IF)
# 激活 wlan 接口。True 是激活,False 关闭
wlan.active(True)
# 扫描允许访问的 SSID
wlan.scan()
# 检查设备是否已经连接成功
wlan.isconnected()
# WIFI 连接,ssid 是账号,password 是密码
wlan.connect('ssid', 'key')
# 获取接口的 mac 地址,也就是物理地址
wlan.config('mac')
# 获取接口的 IP、子网掩码(netmask)、网关(gw)、DNS 地址
wlan.ifconfig()
提示
无线网络中 SSID,是路由器发送的无线信号的名字。如果你将你的无线路由器的SSID:命名为:123456,那么当你的无线路由器开启,并启用了无线功能,和允许了 SSID 广播,那么你就可以轻易的找到你自己的路由器的无线网络。
1. 热点模式
热点模式允许用户将自己的ESP32配置为热点,这让多个 ESP32 芯片之间的无线连接在不借助外部路由器网络的情况下成为可能。
import network
ap = network.WLAN(network.AP_IF) # 创建一个热点
ap.active(True) # 激活热点
ap.config(essid='ESP32') # 为热点配置essid(即热点名称)
运行之后,我们就可以使用电脑在 WiFi 列表中找到 ESP32
热点。
2. 连接 WiFi
更多的情况下,我们会想要将 ESP32 连接到 WiFi 网络。因此,我们的代码可以这么写:
import time
import network
# 设置路由器 WiFi 账号与密码
ssid = '要连接的 Wifi 名'
password = 'Wifi 密码'
# 创建 WIFI 连接对象
wlan = network.WLAN(network.STA_IF)
# 激活 wlan 接口
wlan.active(True)
# 扫描允许访问的 WiFi
print('扫描周围信号源:', wlan.scan())
print("正在连接 WiFi 中", end="")
#
wlan.connect(ssid, password)
# 如果一直没有连接成功,则每隔 0.1s 在命令号中打印一个 .
while not wlan.isconnected():
print(".", end="")
time.sleep(0.1)
# 连接成功之后,打印出 IP、子网掩码(netmask)、网关(gw)、DNS 地址
print(f"\n{wlan.ifconfig()}")
现在,我们的开发板就已经成功连接 WiFi 了,接下来几节课,我们就可以让我们的开发板进行网络通讯了。
3. 实现单片机上电自动连接 WiFi
我们对以上代码稍作改动,将其封装为一个函数,并把 WIFI 名字和密码改为 wifi_connect
的参数,并把代码放置在 MicroPython 设备中的 common
目录下的 wifi.py
中,代码如下:
# common/wifi.py
import time
import network
def wifi_connect(ssid, password):
# 创建 WIFI 连接对象
wlan = network.WLAN(network.STA_IF)
# 激活 wlan 接口
wlan.active(True)
# 断开之前的链接
wlan.disconnect()
# 扫描允许访问的 WiFi
print('扫描周围信号源:', wlan.scan())
print("正在连接 WiFi 中", end="")
# 连接 wifi
wlan.connect(ssid, password)
# 如果一直没有连接成功,则每隔 0.1s 在命令号中打印一个 .
while not wlan.isconnected():
print(".", end="")
time.sleep(0.1)
# 连接成功之后,打印出 IP、子网掩码(netmask)、网关(gw)、DNS 地址
print(f"\n{wlan.ifconfig()}")
如果我们想要实现他的开机自启动,你需要在 MicroPython 设备的根目录下,创建一个 main.py
文件,并写入以下代码:
# main.py
from common.wifi import wifi_connect
# 连接 wifi
wifi_connect('ssid', 'password')
注意
如果上述代码放到 boot.py
中也是可以执行的。boot.py
是开机最先执行的文件,最后会由它加载 main.py
。
main.py
文件开机会被 boot.py
文件引导,可以将自己的代码放在里面。
boot.py
文件里面可以声明包含自己要用到的模块,里面可以定制自己开机程序(也就是在运行 main.py
文件前的程序),但是官方建议该文件里面的程序越小越好。