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

25 阅读5分钟

ping 测试实验

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

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

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

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

cf335d5e-d469-44b3-97c8-0a12be7b49f6.png 首先,我们使用 ipconfig 命令查看网络适配器的详细信息,包括 IP 地址、子网掩码、默认网关以及其他网络配置参数:

57726158-daeb-47cc-a57c-4a196837eacd.png

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

a383417b-3452-4a3b-94ba-a22300cde0a4.png 我们接下来对 W5500 模块配置的子网掩码和默认网关与主机地址相同。

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

6be4441b-f3dc-4f89-9042-28dccfaf1ba8.png 可以看到,返回了几种类型的数据:

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

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

ping -l 64 192.168.1.6

72719812-a4fd-4e46-ac39-9395b8927d0d.png 也可以通过添加 -t 参数指定一直去 ping:

ping -t 192.168.1.6

48cc012b-d0a1-412e-a24f-a37ef3645daf.png 以下代码可以在我们提供的资料包中 elegance-devkit v1\Demo\40 ETH_TCP_Ping 文件夹找到。

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

# 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 芯片的主机地址:

118cd7a8-c455-4baf-9b86-c13832a0c601.png

9bcea5da-84bd-4d38-8b15-8005408cc507.gif 这里,我们使用 192.168.1.20 作为 w5500 芯片的主机地址。烧录代码,打开远程终端:

f3c664b5-5a95-42ee-8135-9f53ec1442c3.png

82b1577c-8296-4f6a-9ccc-523b904ee9d5.gif 可以看到首先输出 w5500 芯片寄存器的相关数据,可以用于调试,其中:

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

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

46b90b7b-5186-4d6b-a95b-d63e5984c2fa.png

我们打开另一个终端,输入 ping 192.168.1.20,可以看到 ping 测试验证成功通过。

a22ec154-3788-4d25-9c0c-bd40e5940041.png