在王铭东老师讲解的视频学习中,第四小节关于WIFI连接遇到一些问题
视频观看连接:https://www.bilibili.com/video/BV1G34y1E7tE/?p=4&vd_source=7eb12985b115d7cf100573bba9a4649f
问题1:按照老师讲解的敲代码之后没有反应
仔细检查了一下,是电脑和ESP32必须连接同一个WIFI,才能成功进行网络串口通信
问题2:连接同一WIFI之后,Thonny软件发送数据,串口调试助手接收不到
原因是本地主机地址和端口号必须一致
ESP32连接WIFI代码:
# 导入网络模块
import network
import time
# 创建 WLAN 对象,用于网络连接
wlan = network.WLAN(network.STA_IF)
# 激活 WLAN 的 STA 模式,STA 模式允许设备作为客户端连接到 Wi-Fi 网络
wlan.active(True)
# 扫描可用的 Wi-Fi 网络,并将结果存储在 networks 变量中
networks = wlan.scan()
# 打印可用的 Wi-Fi 网络列表
print("Available networks:", networks)
# 检查设备是否已经连接到 Wi-Fi 网络
if not wlan.isconnected():
print("Connecting to network...")
# 尝试连接到指定的 Wi-Fi 网络(替换为实际的 Wi-Fi 名称和密码)
wlan.connect("2.5G频段WIFI名称", "WIFI密码")
# 等待连接成功,设置超时时间为 10 秒
timeout = 10 # 设置超时时间(秒)
while not wlan.isconnected() and timeout > 0:
print("Waiting for connection...") # 打印等待连接的消息
time.sleep(1) # 每隔 1 秒检查一次连接状态
timeout -= 1 # 减少超时计时
# 检查连接状态,若成功则打印网络配置信息
if wlan.isconnected():
print("Connected to network") # 打印连接成功的消息
print("Network config:", wlan.ifconfig()) # 打印网络配置,包括 IP 地址等信息
else:
print("Failed to connect to network") # 如果连接失败,打印错误信息
代码的主要部分说明:
- 导入模块:
- 导入 network 模块以管理网络连接。
- 导入 time 模块以便在连接过程中使用延时。
- WLAN 对象创建:
- 创建一个 WLAN 对象并设置为 STA 模式,这是设备作为客户端连接 Wi-Fi 网络的模式。
- 激活 WLAN:
- 激活 WLAN STA 模式,使设备能够进行网络连接。
- 扫描可用网络:
- 使用 wlan.scan() 扫描附近的 Wi-Fi 网络,并将结果打印出来,以便用户查看可用的网络。
- 连接到 Wi-Fi:
- 检查设备是否已连接到网络。如果未连接,调用 wlan.connect() 尝试连接到指定的 Wi-Fi 网络,并使用超时机制确保连接过程不会无限期等待。
- 检查连接状态:
- 连接成功后,打印网络配置(如 IP 地址等信息),否则打印连接失败的消息。
效果图如下:
确保电脑和ESP32连接同一WIFI之后,即可用命令行窗口查看IP地址,然后进行网络通信
cmd窗口查看IP地址的命令是
ipconfig
代码如下:
# 导入 usocket 模块用于网络通信
import usocket
# 导入网络模块用于Wi-Fi连接
import network
import time
# 定义一个连接函数,用于连接到Wi-Fi网络
def do_connect():
# 创建 STA 模式的 WLAN 对象
sta_if = network.WLAN(network.STA_IF)
# 激活 Station 模式,以便设备能够作为客户端连接到网络
sta_if.active(True)
# 打印网络状态以检查当前状态
print('Network status before connection:', sta_if.status())
# 检查是否已连接到网络
if not sta_if.isconnected():
print('Connecting to network...')
# 尝试连接到指定的 WiFi 网络
sta_if.connect('Black-403', 'gongcheng403')
# 等待连接建立,设置超时时间为10秒
timeout = 10 # 设置超时时间(秒)
while not sta_if.isconnected() and timeout > 0:
print('Waiting for connection...')
time.sleep(1) # 每隔1秒检查一次连接状态
timeout -= 1 # 减少超时计时
# 如果连接仍未建立,则输出错误信息
if not sta_if.isconnected():
print('Failed to connect to the network.')
return False # 返回 False 表示连接失败
# 打印连接成功后的网络配置,包括 IP 地址等信息
print('Connected to network:', sta_if.ifconfig())
return True # 返回 True 表示连接成功
# 开机自动连接 Wi-Fi 网络
if do_connect():
# 创建 UDP socket,用于发送和接收数据
s = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
# 构建服务器的 IP 和端口,确保替换为你的实际服务器 IP 和端口
addr = usocket.getaddrinfo('192.168.1.104', 32666)[0][-1]
print('Server address:', addr) # 打印服务器地址
# 发起请求,发送消息
print("Sending message: 'esp32 micropython udp'")
s.sendto(b"esp32 micropython udp", addr) # 确保发送的数据为字节类型
# 等待响应
print("Waiting for response...")
while True:
try:
# 接收数据,最多接收100字节
data = s.recv(100)
if data:
# 如果收到数据,打印接收到的内容
print('Received data:', str(data, 'utf8'), end='')
else:
break # 如果没有数据,跳出循环
except OSError as e:
# 捕获接收数据时的错误
print("Error receiving data:", e)
break # 发生错误时跳出循环
# 关闭 socket,释放资源
s.close()
else:
# 如果无法建立 Wi-Fi 连接,输出提示信息
print("Could not establish Wi-Fi connection.")
代码的主要部分:
- 连接函数 do_connect():
- 创建 WLAN 对象并激活其 STA 模式。
- 检查网络状态,若未连接则尝试连接到指定的 Wi-Fi 网络。
- 通过超时机制确保连接过程不会无限期等待。
- UDP Socket 创建与使用:
- 成功连接后,创建一个 UDP socket,构建服务器的 IP 地址和端口。
- 发送一条消息并等待响应,直到接收到数据或发生错误。
- 异常处理:
- 在数据接收过程中增加了异常处理,确保程序的健壮性。
现象如下: