MicroPython W5500 以太网实验|ping 测试:原理 + 实操全解析

ping 测试实验

这里,我们首先进行 ping 测试实验,通过树莓派 Pico 控制 w5500 芯片使用用户设置的静态 IP 地址进行网络连接,然后我们在电脑上通过 ping 命令测试连接速度和延迟。

ping 测试是一种常用的网络诊断工具,用于检查网络连通性和延迟。Ping 测试的基本原理如下:

  • 发送 ​ICMP ​ 回显请求ping 工具发送一个 ICMP(Internet Control Message Protocol)回显请求数据包到目标设备
  • 等待响应:目标设备收到请求后,返回一个 ICMP 回显应答数据包
  • 计算时间ping 工具记录从发送请求到收到响应的时间,通常以毫秒(ms)为单位

我们可以直接打开终端,在终端中使用 ping 命令完成 Ping 测试:

首先,我们使用 ipconfig 命令查看网络适配器的详细信息,包括 IP 地址、子网掩码、默认网关以及其他网络配置参数:

在**以太网适配器 以太网部分详细描述了计算机的以太网(有线网络)连接的网络配置,可以看到,我们电脑主机地址为 192.168.1.6,如果你是通过 ETH直连网线W5500 以太网模块和电脑连接的话,那么该地址为主机地址;但如果你的电脑通过 WiFi 连接到与 W5500 以太网模块相同连接的路由器下,那么对应 无线局域网适配器 WLAN**部分的 IPv4 地址即为主机地址:

我们接下来对 W5500 模块配置的子网掩码和默认网关与主机地址相同。

我们尝试 ping 一下电脑主机,在 ping 命令后添加电脑主机的 IP 地址 ping 192.168.1.6

可以看到,返回了几种类型的数据:

  • 数据包大小:发送的数据包的大小,通常为 32 字节;
  • **时间(time​​)**:往返时间,即从发送请求到收到应答的时间;
  • **生存时间(TTL​​,Time to Live)**:数据包在网络中传输的最大跳数,反映了数据包经过的路由器数量。

我们可以通过添加 -l data_size 来指定数据包大小为 data_size

ping -l 64 192.168.1.6

也可以通过添加 -t 参数指定一直去 ping:

ping -t 192.168.1.6

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

接下来我们初始化 W5500 网络芯片,并配置静态 IP 地址等网络参数,在终端通过 ping 命令不断测试网络连通:

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

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

# 导入套接字模块
from usocket import socket
# 导入硬件相关模块
from machine import Pin,SPI
# 导入网络相关模块
import network
# 导入时间相关模块
import time

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

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

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

​    Args:
​        None

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

​    Raises:
​        None
​    """
​    ​# 初始化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)
    # 设置静态IP地址:主机地址、子网掩码、网关地址和DNS服务器地址
    nic.ifconfig(('192.168.1.20', '255.255.255.0', '192.168.1.1', '8.8.8.8'))

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

    # 打印设置的IP地址
    print("IP Address:", nic.ifconfig()[0])
    print("Subnet Mask:", nic.ifconfig()[1])
    print("Gateway:", nic.ifconfig()[2])
    print("DNS:", nic.ifconfig()[3])

    # 返回network.WIZNET5K实例
    return nic

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

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

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

# 创建LED对象
led = Pin(25, Pin.OUT)
# 初始化网络接口
nic = w5x00_init()

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

while True:
    # 闪烁LED灯,表示代码还在运行
    led.value(1)
    time.sleep(1)
    led.value(0)
    time.sleep(1)
    # 在终端使用Ping命令,测试连接
    print("try ping", nic.ifconfig()[0])

在设置静态 IP 地址中主机地址时,我们可以使用 Advanced IP Scanner 软件扫描,看看当前网络上连接设备的主机地址,然后挑选没有被占用的主机地址来设置 w5500 芯片的主机地址:

这里,我们使用 192.168.1.20 作为 w5500 芯片的主机地址。烧录代码,打开远程终端:

可以看到首先输出 w5500 芯片寄存器的相关数据,可以用于调试,其中:

  • ​Wiz CREG:​ 这是 W5x00 芯片的通用寄存器,包含了芯片的基本配置信息,如硬件版本、MAC 地址等,这些信息通常在初始化时被读取并保存
  • ​Wiz SREG0-3:​ 这些是 W5x00Socket 寄存器,每个 Socket 都有一组相关的寄存器,这里展示了 4 个 Socket 的寄存器内容

然后输出了设置的静态 IP 地址,与电脑连接成功后,输出 try ping 192.168.1.20 调试信息:

我们打开另一个终端,输入 ping 192.168.1.20,可以看到 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
与你4033 天前
CLion 中为什么要重写 _write,而不是 fputc?
嵌入式
Freak嵌入式3 天前
MicroPython 开发避坑:用 Signal 类解决不同电路的电平兼容问题
嵌入式
智码看视界4 天前
Edge AI 全栈1:ESP32 传感器采集到云端大模型推理的完整链路
人工智能·物联网·嵌入式·esp32·aiot·全栈开发·edgeai
Freak嵌入式4 天前
告别硬件差异!MicroPython Signal 类:让你的 GPIO 代码跨板运行无压力
嵌入式