Wi-Fi 连接

罗大富 BigRich大约 4 分钟ESP32Python

连接路由器上网是我们每天都做的事情,日常生活中我们只需要知道路由器的账号和密码,就能使用电脑或者手机连接到无线路由器,然后上网冲浪。

如今物联网市场异常火爆,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 文件前的程序),但是官方建议该文件里面的程序越小越好。

上次编辑于:
贡献者: Luo