一篇搞懂:MicroPython 与 Pico DHCP 动态 IP 的实现与调试

DHCP 协议实验

DHCP 能够自动为设备分配新的 IP 地址,使用户无需手动更改配置。在以下代码中,我们尝试使用 DHCP 动态获取 IP 地址:

  • 如果 DHCP 获取成功,使用动态分配的网络配置
  • 如果 DHCP 获取失败,使用静态配置的网络参数

等待网络连接成功,输出获取的网络配置信息。

以下代码可以在我们提供的资料包中 elegance-devkit v1\Demo\44 ETH_DHCP 文件夹找到。

注意,进行DHCP协议实验时,需要将 ​**W5500 模块的 网口连接到路由器上才可以正常运行。**

示例代码如下:

Python 复制代码
# Python env   : MicroPython v1.23.0 on Wiznet W5500
# -*- coding: utf-8 -*-        
# @Time    : 2024/8/8 下午3:23   
# @Author  : 李清水            
# @File    : main.py       
# @Description : 以太网类实验,进行DHCP协议测试

# ======================================== 导入相关模块 ========================================

# 导入用于创建和管理网络连接的套接字模块
from usocket import socket
# 导入硬件相关模块
from machine import Pin,SPI
# 导入时间相关模块
import time
# 导入网络相关模块
import network

# ======================================== 全局变量 ============================================

# 设备IP地址
ip = '192.168.1.20'
sn = '255.255.255.0'
gw = '192.168.1.1'
dns= '8.8.8.8'
# 用于网络连接的元组对象
netinfo=(ip, sn, gw, dns)

# ======================================== 功能函数 ============================================

# 初始化网络接口
def w5x00_init() -> 'network.WIZNET5K':
    """
​    初始化 network.WIZNET5K 实例,设置静态 IP 地址并进行连接。

​    Returns:
​        network.WIZNET5K: 初始化并连接成功的 network.WIZNET5K 实例。

​    Raises:
​        None: 该函数不抛出异常,但会在 DHCP 失败时回退到静态配置。
​    """

​    ​# 声明全局变量
    global netinfo

    # 初始化SPI对象
    spi = SPI(0, 2_000_000, mosi=Pin(19), miso=Pin(16), sck=Pin(18))
    # 实例化network.WIZNET5K类,传入使用的片选引脚CS和复位引脚RST
    nic = network.WIZNET5K(spi, Pin(17), Pin(20))
    # 激活网络接口
    nic.active(True)

    try:
        print("\r\nConfiguring DHCP")
        # 尝试使用DHCP动态获取IP地址、子网掩码、网关和DNS服务器等网络配置
        nic.ifconfig('dhcp')
    except:
        print("\r\nDHCP fails, use static configuration")
        # 如果DHCP获取失败,使用静态IP地址配置
        nic.ifconfig(netinfo)

    # 若是没有连接网络,则循环执行
    while not nic.isconnected():
        time.sleep(1)
        # 输出寄存器信息
        print(nic.regs())

    # 打印设置的IP地址
    print('ip :', nic.ifconfig()[0])
    print('sn :', nic.ifconfig()[1])
    print('gw :', nic.ifconfig()[2])
    print('dns:', nic.ifconfig()[3])

    # 返回network.WIZNET5K实例
    return nic

# ======================================== 自定义类 ============================================

# ======================================== 初始化配置 ==========================================

# 延时3s,等待器件上电
time.sleep(3)
# 打印调试信息
print("FreakStudio : Using W5x00 Ethernet to do DHCP test")

# 初始化w5500模块
nic = w5x00_init()

# ========================================  主程序  ===========================================

# 主循环空转等待
while True:
    time.sleep(1)

烧录代码,打开终端,我们可以看到输入如下:

可以看到,给我们分配的主机 IP 地址为 192.168.1.11,我们尝试对该地址进行 ping 测试:

ping 测试成功,给我们动态分配的 IP 地址可用。

相关推荐
Freak嵌入式1 小时前
保姆级教程:MicroPython+W5500 实现 HTTP 服务器,网页一键控灯
嵌入式
Freak嵌入式1 小时前
【Pico 以太网实战系列 4/6】UDP 协议实操:MicroPython 实现回显服务器
嵌入式
Freak嵌入式1 小时前
MicroPython 以太网实战:Pico+W5500 TCP 客户端详解
嵌入式
Freak嵌入式1 小时前
MicroPython W5500 以太网实验|ping 测试:原理 + 实操全解析
嵌入式
Freak嵌入式5 小时前
USB-CDC 通信实战应用:树莓派 Pico 虚拟串口 + select+MicroPython 全拆解
嵌入式
Freak嵌入式1 天前
PIO 入门:手把手实现板载 LED 闪烁,原理与代码全解析
嵌入式
Freak嵌入式1 天前
一文搞懂树莓派 Pico 任务调度器:基于定时器的 MicroPython 多任务实现
嵌入式
花 满 楼2 天前
国芯科技CCFC3008PCS BIST (内建自测试) 分析总结
mcu·嵌入式·bist
虎王物联2 天前
ESP32 FreeRTOS多任务优先级翻转与互斥量保护实战
物联网·嵌入式·esp32·freertos