WIZnet W5100S-EVB-Pico DHCP 配置教程(三)

news2024/9/28 7:25:44

DHCP协议介绍

什么是DHCP?

        动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用户IP地址进行动态管理和配置。

        DHCP于1993年10月成为标准协议,其前身是BOOTP协议。DHCP协议由RFC 2131定义,采用客户端/服务器通信模式,由客户端(DHCP Client)向服务器(DHCP Server)提出配置申请,DHCP Server基于请求的客户端(DHCP Client)的mac地址为它动态分配IP地址、子网掩码、默认网关地址,域名服务器(DNS)地址和其他相关配置参数,以便可以与其他IP网络通信。

        与静态IP地址相反的,而关于静态IP和动态IP地址一直以来都是网络技术人员们热议的话题,动态IP地址是一个不断变化的地址,若是要创建动态IP地址,网络必须配置并运行DHCP服务器。DHCP服务器为连接到网络的所有设备分配了一个空闲的IP地址。DHCP是一种向物理网络上的网络设备自动分配动态IP地址的方法,它能自动为网络设备分配或更新IP地址,以及其他配置信息。

        静态IP地址允许网络设备始终保持相同的IP地址,网络管理员必须跟踪每个静态分配的设备,从而避免再次使用该IP地址。由于静态IP地址需要手动配置,因此若是对TCP/IP协议不太了解,则可能会出现网络问题。

        DHCP是用于自动分配IP地址的协议,对网络管理员来说是非常有利的,因为它能避免网络上的每台设备分配多个IP地址(也就是重复分配IP地址)。通常配置可能只需要一分钟,但是当您配置数百个网络设备时,确实比较麻烦。当网络中接入无线接入点时可利用DHCP自动获取动态IP地址,无需再做配置。对于无线接入点,PoE交换机通常可支持用户定义进行动态绑定,为连接在一起的各个设备分配IP地址。此外,相对于静态IP地址而言,DHCP维护较少且便宜,对于用户而言具备吸引力

动态ip优点

1、成本低。由于静态IP数量有限,所以价格相对而言高一些。由于动态ip可以循环使用,所以使用动态IP更加经济。

2、自动配置。使用动态IP地址,服务器会自动为设备分配可用的IP地址,非常适合家庭使用。

3、更安全。每一次用户登录都会为设备分配一个新的IP地址,相对而言比较安全。

动态ip缺点

1、不太准确的地理定位。很难找到设备的准确位置,因为动态ip地址会变化。

2、限制远程访问。如果您使用动态IP地址,您的程序可能无法连接。

硬件准备

  • W5500-EVB-Pico开发板
  • 网线
  • Micro USB数据线

    注意:需将W5500-EVB-Pico通过RJ45网口接入到路由器上,电脑也接入到同一路由器下。路由器必须开启DHCP服务

软件环境

  • Visual Studio Code

W5100S-EVB-Pico使用DHCP协议获取IP地址

步骤1:找到dhcp_client示例程序并打开

主要引用到dhcp.h中的几个函数

void DHCP_init(uint8_t s, uint8_t * buf);
void DHCP_time_handler(void);
uint8_t DHCP_run(void);
void reg_dhcp_cbfunc(void(*ip_assign)(void), void(*ip_update)(void), void(*ip_conflict)(void));

修改网络信息结构体内容,将.dhcp的内容改为NETINFO_DHCP

uint8_t wizchip_version = 0x00;
    wiz_NetInfo net_info = {
        .mac = {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e},
        .ip = {192, 168, 1, 235},
        .sn = {255, 255, 255, 0},
        .gw = {192, 168, 1, 1},
        .dhcp = NETINFO_DHCP                      // DHCP enable/disable
    };

定时器函数

bool repeating_timer_callback(struct repeating_timer *t) {
    DHCP_time_handler();
    return true;
}

DHCP运行函数

int main()
{
    /* Initialize */
    uint8_t retval = 0;
    uint8_t dhcp_retry = 0;
    stdio_init_all();
    gpio_config();
    // Enable SPI 0 at 8 MHz and co,nnect to GPIOs
    spi_init(SIP_ID, 8 * 1000 * 1000);
     struct repeating_timer timer;
    add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer);
   wizchip_version = getVER();
        printf("wizchip_version = %02X\r\n", wizchip_version);
        sleep_ms(1000);
       if (net_info.dhcp == NETINFO_DHCP) // DHCP
    {
        wizchip_dhcp_init();
    }
   else // static
    {
        wizchip_setnetinfo(&net_info); // apply from DHCP
        printf("mac: %02X%02X%02X%02X%02X%02X\r\n", net_info.mac[0], net_info.mac[1], net_info.mac[2], net_info.mac[3], net_info.mac[4], net_info.mac[5]);
        printf("ip: %d.%d.%d.%d\r\n", net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3]);
        printf("mask: %d.%d.%d.%d\r\n", net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3]);
        printf("gw: %d.%d.%d.%d\r\n", net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3]);
    }

    while (1)
    {
       
          if (net_info.dhcp == NETINFO_DHCP)
        {
            retval = DHCP_run();

            if (retval == DHCP_IP_LEASED)
            {
                if (g_dhcp_get_ip_flag == 0)
                {
                    printf(" DHCP success\n");

                    g_dhcp_get_ip_flag = 1;
                }
            }
            else if (retval == DHCP_FAILED)
            {
                g_dhcp_get_ip_flag = 0;
                dhcp_retry++;

                if (dhcp_retry <= DHCP_RETRY_COUNT)
                {
                    printf(" DHCP timeout occurred and retry %d\n", dhcp_retry);
                }
            }
            if (dhcp_retry > DHCP_RETRY_COUNT)
            {
                printf(" DHCP failed\n");
                DHCP_stop();
                while (1)                   ;
            }

             wiz_delay_ms(1000); // wait for 1 second
        }
    }
}

IP地址请求和更新回调函数

static void wizchip_dhcp_assign(void)
{
    getIPfromDHCP(net_info.ip);
    getGWfromDHCP(net_info.gw);
    getSNfromDHCP(net_info.sn);
    getDNSfromDHCP(net_info.dns);

    net_info.dhcp = NETINFO_DHCP;

    /* Network initialize */
    wizchip_setnetinfo(&net_info); // apply from DHCP
    printf("mac: %02X%02X%02X%02X%02X%02X\r\n", net_info.mac[0], net_info.mac[1], net_info.mac[2], net_info.mac[3], net_info.mac[4], net_info.mac[5]);
    printf("ip: %d.%d.%d.%d\r\n", net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3]);
    printf("mask: %d.%d.%d.%d\r\n", net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3]);
    printf("gw: %d.%d.%d.%d\r\n", net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3]);
    printf(" DHCP leased time : %ld seconds\n", getDHCPLeasetime());
}

步骤2:编译烧录

        选择编译器,选择编译项目为dhcp_client,点击Build进行编译

        编译之后,按住boot按钮把开发板连接到电脑上,此时电脑将开发板识别为大容量存储器,我们将build/examples/dhcp_client文件夹下面的uf2文件拖入开发板的大容量存储器中,就烧录好了。

步骤3:验证测试

        此时串口会打印获取到的IP地址信息,我们也能直接ping通获取到的IP地址

 

示例下载链接 

例程下载WIZnet-EVB-PICO资源

本期内容到此结束,谢谢大家的观看,下期我们将对W5100S-EVB-PICO解析域名这一知识点进行讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/808877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】第 4 课 - 物理层

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、物理层的基本概念 2、物理层协议的主要任务 3、物理层任务 4、总结 1、物理层的基本概念 在计算机网络中&#xff0c;用来…

❤️创意网页:创意动态画布~缤纷移动涂鸦~图片彩色打码

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

【C/C++】#include<xxx.h>和#include“xxx.h“

2023年7月29日&#xff0c;周六晚上 今天下午和晚上花了不少时间去研究这个C/C的头文件以及#include<xxx.h>和#include"xxx.h"之间的区别&#xff0c;收获到了很多的很有用的知识。非常值得花时间来以博客的形式总结这些学习成果。 说实话&#xff0c;我挺想…

使用WGCLOUD监测安卓(Android)设备的运行状态

WGCLOUD是一款开源运维监控软件&#xff0c;除了能监控各种服务器、主机、进程应用、端口、接口、docker容器、日志、数据等资源 WGCLOUD还可以监测安卓设备&#xff0c;比如安卓手机、安卓设备等 我们只要下载对应的安卓客户端&#xff0c;部署运行即可&#xff0c;如下是下…

【Python】数据分析+数据挖掘——探索Pandas中的数据筛选

1. 前言 当涉及数据处理和分析时&#xff0c;Pandas是Python编程语言中最强大、灵活且广泛使用的工具之一。Pandas提供了丰富的功能和方法&#xff0c;使得数据的选择、筛选和处理变得简单而高效。在本博客中&#xff0c;我们将重点介绍Pandas中数据筛选的关键知识点&#xff…

x86架构ubuntu22用docker部署zsnes

0. 环境 x86 ubuntu22 1. 安装docker $ sudo apt remove docker docker-engine docker $ sudo apt update $ sudo apt install -y apt-transport-https ca-certificates curl software-properties-common$ curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg …

HiveSQL SparkSQL中常用知识点记录

目录 0. 相关文章链接 1. hive中多表full join主键重复问题 2. Hive中选出最新一个分区中新增和变化的数据 3. Hive中使用sort_array函数解决collet_list列表排序混乱问题 4. SQL中对小数位数很多的数值转换成文本的时候不使用科学计数法 5. HiveSQL & SparkSQL中炸裂…

leetcode 面试题 01.03. URL化

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;面试题 01.03. URL化 思路&#xff1a; 计算出空格的个数&#xff0c;我们可以知道最后一个字符的位置 endPos&#xff0c;再从后 end 向前遍历若不是空格正常拷贝&#xff0c;是空格则替换成 %20&#xff0c;最终当空格…

Linux系统编程之进程控制(上)

一、进程标识 1.pid 每个进程都有非负整数表示的唯一进程ID&#xff0c;即pid&#xff0c;其类型为pid_t类型。可用ps命令查看当前所有进程的信息&#xff0c;该命令可以加选项&#xff0c;一般使用ps -ef或ps axf(打印进程树)&#xff0c;查看当前系统所有进程的信息。需要注…

【Rust教程 | 基础系列 | Rust初相识】Rust简介与环境配置

教程目录 前言一&#xff0c;Rust简介1&#xff0c;Rust的历史2&#xff0c;Rust的特性3&#xff0c;为什么选择Rust 二&#xff0c; Rust环境配置1&#xff0c;windows11安装2&#xff0c;Linux安装 三&#xff0c;安装IDE 前言 Rust是一种系统编程语言&#xff0c;专注于速度…

【深度学习】以图搜索- 2021sota repVgg来抽取向量 + facebook的faiss的做特征检索, 从环境搭建到运行案例从0到1

文章目录 前言安装小试牛刀用repVgg抽取向量构建Faiss索引进行相似性搜索项目延伸总结 前言 Faiss的全称是Facebook AI Similarity Search。 这是一个开源库&#xff0c;针对高维空间中的海量数据&#xff0c;提供了高效且可靠的检索方法。 暴力检索耗时巨大&#xff0c;对于…

Flowable-任务-用户任务

定义 顾名思义&#xff0c;用户任务是需要人工参与处理的。当流程执行到用户任务节点时&#xff0c;流程引擎会给指指定的用户&#xff08;办理人或候选人&#xff09;或一组用户&#xff08;候选组&#xff09;创建待处理的任务项&#xff0c;等待用户的处理。 用户任务的参与…

HTML一些基础知识

1、Web标准&#xff1a;主要包含结构、表现、行为。结构用于对网页元素进行整理和分类&#xff0c;主要指HTML。表现用于设置网页元素的板式、颜色、大小等外观样式&#xff0c;主要指的是CSS。行为主要指的是网页模型的定义以及交互的编写&#xff0c;主要是js文件。 Html相当…

AddForce

ForceMode&#xff1a; Force&#xff1a;关注的是力整体 Impulse&#xff1a;关注的是冲量&#xff0c;与质量相关 VelocityChange&#xff1a;关注的是速度&#xff0c;与质量无关 Acceleration&#xff1a;关注的是加速度&#xff0c;与质量无关 public void AddForce…

前后端分离实现博客系统

文章目录 博客系统前言1. 前端1.1 登陆页面1.2 博客列表页面1.3 博客详情页面1.4 博客编辑页面 2. 后端2.1 项目部署2.1.1 创建maven项目2.1.2 引入依赖2.1.3 创建目录结构2.1.4 部署程序 2.2 逻辑设计2.2.1 数据库设计2.2.2 实体类设计2.2.3 Dao层设计2.2.3.1 BlogDao 2.2.4 D…

Intel RealSense D455(D400系列) Linux-ROS 安装配置(亲测可用)

硬件&#xff1a;Intel RealSense D455 系统&#xff1a;Ubuntu 18.04 Part_1: 安装librealsense SDK2.0 1.1 注册密钥 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE或者 sudo apt-key adv --keyserver hkp:/…

Mysql定时删除表数据

由于用户环境有张日志表每天程序都在狂插数据&#xff0c;导致不到一个月时间&#xff0c;这张日志表就高达200多万条记录&#xff0c;但是日志刷新较快&#xff0c;里面很多日志没什么作用&#xff0c;就写了个定时器&#xff0c;定期删除这张表的数据。 首先查看mysql是否开启…

【Linux】进程间通信——system V共享内存 | 消息队列 | 信号量

文章目录 一、system V共享内存1. 共享内存的原理2. 共享内存相关函数3. 共享内存实现通信4. 共享内存的特点 二、system V消息队列&#xff08;了解&#xff09;三、system V信号量&#xff08;信号量&#xff09; 一、system V共享内存 1. 共享内存的原理 共享内存是一种在…

自动化测试Junit(测试系列8)

目录 前言&#xff1a; 1.什么是Junit 2.Junit相关的技术 2.1注解 2.1.1Test 2.1.2Disable 2.1.3BeforeAll和AfterAll 2.1.4BeforeEach和AfterEach 2.2参数化 2.2.1单参数 2.2.2多参数 2.2.2.1CSV获取参数 2.2.2.2方法获取参数 2.3测试套件 2.3.1通过class运行测…

Java工程师研学之路【002Java基础语法上】

知识体系&#xff08;Knowledge system&#xff09; 练习&#xff08;practice&#xff09; 要求&#xff1a;从控制台输入两个数字&#xff0c;然后输出两个数字的求和结果。 import java.util.Scanner; public class HelloJava {public static void sum(){System.out.print…