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

news2024/9/27 23:24:50

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网络通信。

为什么要使用DHCP?

        在IP网络中,每个连接Internet的设备都需要分配唯一的IP地址。DHCP使网络管理员能从中心结点监控和分配IP地址。当某台计算机移到网络中的其它位置时,能自动收到新的IP地址。DHCP实现的自动化分配IP地址不仅降低了配置和部署设备的时间,同时也降低了发生配置错误的可能性。另外DHCP服务器可以管理多个网段的配置信息,当某个网段的配置发生变化时,管理员只需要更新DHCP服务器上的相关配置即可,实现了集中化管理。

        总体来看,DHCP相比设置静态IP地址带来了如下优势:

  • 准确的IP配置:IP地址配置参数必须准确,并且在处理“ 192.168.XXX.XXX”之类的输入时,很容易出错。另外印刷错误通常很难解决,使用DHCP服务器可以最大程度地降低这种风险。
  • 减少IP地址冲突:每个连接的设备都必须有一个IP地址。但是,每个地址只能使用一次,重复的地址将导致无法连接一个或两个设备的冲突。当手动分配地址时,尤其是在存在大量仅定期连接的端点(例如移动设备)时,可能会发生这种情况。DHCP的使用可确保每个地址仅使用一次。
  • IP地址管理的自动化:如果没有DHCP,网络管理员将需要手动分配和撤消地址。跟踪哪个设备具有什么地址可能是徒劳的,因为几乎无法理解设备何时需要访问网络以及何时需要离开网络。DHCP允许将其自动化和集中化,因此网络专业人员可以从一个位置管理所有位置。
  • 高效的变更管理:DHCP的使用使更改地址,范围或端点变得非常简单。例如,组织可能希望将其IP寻址方案从一个范围更改为另一个范围。DHCP服务器配置有新信息,该信息将传播到新端点。同样,如果升级并更换了网络设备,则不需要网络配置。

        劣势:可能会导致同一设备的IP地址不固定,例如我们的服务器或者是一些设备想固定IP地址的话,这个时候就只能采取静态IP地址来配置了。

硬件准备

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

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

软件环境

  • Visual Studio Code

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

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

        添加“dhcp.h”头文件

#include "dhcp.h"

        配置网络信息结构体内容,将.dhcp的内容设置为NETINFO_DHCP

//配置网络配置信息结构体
wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},
    .ip = {192, 168, 1, 120},
    .sn = {255, 255, 255, 0},
    .gw = {192, 168, 1, 1},
    .dns = {8, 8, 8, 8},
    .dhcp = NETINFO_DHCP};
        编写四个DHCP功能函数
//DHCP初始化函数
static void dhcp_init(void)
{
    printf(" DHCP client running \r\n");
    DHCP_init(SOCKET_DHCP,ethernet_buf);
    reg_dhcp_cbfunc(dhcp_assign,dhcp_assign,dhcp_conflict);
}

//IP地址冲突函数
static void dhcp_conflict(void)
{
    printf("CONFLICT IP from DHCP\r\n");
    while(1);
}

//请求IP地址函数
static void 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(net_info);
    print_network_information(net_info);
    printf("DHCP LEASED TIME:%ld Sec.\r\n",getDHCPLeasetime());
}

//定时器回调函数,目的是调用DHCP定时中断函数
bool repeating_timer_callback(struct repeating_timer *t) {
    DHCP_time_handler();
    return true;
}

//DHCP获取IP地址
void do_dhcp(void)
{
    uint8_t retval = 0;
    uint8_t dhcp_retry = 0;
    if (net_info.dhcp == NETINFO_DHCP)
    {
        retval = DHCP_run();
        if (retval == DHCP_IP_LEASED)
        {
            if (dhcp_get_ip_flag == 0)
            {
                printf("DHCP success\r\n");
                dhcp_get_ip_flag = 1;
            }
        }
        else if (retval == DHCP_FAILED)
        {
            dhcp_get_ip_flag = 0;
            dhcp_retry++;
            if (dhcp_retry <= DHCP_RETRY_COUNT)
            {
                printf(" DHCP timeout occurred and retry %d \r\n", dhcp_retry);
            }
        }

        if (dhcp_retry > DHCP_RETRY_COUNT)
        {
            printf(" DHCP failed \r\n");
            DHCP_stop();
            while (true)
                ;
        }
    }
}
        在主函数中,我们只需要进行初始化之后,然后请求DHCP地址即可。因为DHCP是基于设备的MAC地址来分配IP地址的,所以必须设置W5500的mac地址
int main()
{
    
    struct repeating_timer timer;//定义定时器结构体
    stdio_init_all();//重定义串口到printf
    sleep_ms(5000);
    printf("W5500 network install example.\r\n");

    wizchip_initialize();//spi接口初始化,链路初始化检测
    
    add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer);//
    setSHAR(net_info.mac);
    if (net_info.dhcp == NETINFO_DHCP)
    {

        dhcp_init();
    }
    else
    {
        network_initialize(net_info);
        print_network_information(net_info);
    }
    while (true)
    {
        do_dhcp();
        sleep_ms(1000);
    }
}

步骤2:编译烧录

  1. 选择GCC arm-none-eabi编译链
  2. 选择编译项目为dhcp_client
  3. 点击Build进行编译

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

步骤3:验证测试

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

示例下载链接

链接:W5500-EVB-Pico示例

        本期内容就分享到这里啦!觉得写的还不错的话给个关注鼓励一下吧!下期我们来讲讲如何通过DNS解析百度的域名地址。

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

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

相关文章

Spring源码(五)— 解析XML配置文件(一) bean标签解析流程

前面几章的内容已经介绍了BeanFactory创建前的准备工作&#xff0c;以及加载XML配置文件前的准备的步骤。本章会着重介绍解析XML的步骤。 registerBeanDefinitions 前几个方法不做过多的赘述&#xff0c;着重看registerBeanDefinitions方法中解析XML的步骤。 public int regi…

C++ 多进程学习总结

C多进程 进程间通信 消息队列 消息队列&#xff1a;提供一个种进程间发送/接收数据块&#xff08;常为结构体数据&#xff09;的方法。 函数接口 ftok()&#xff1a;获取消息队列键值msgget()&#xff1a;创建和访问消息队列msgsnd()&#xff1a;向消息队列发送数据msgrcv…

罗布乐思Roblox学习笔记

罗布乐思 文章目录 罗布乐思基本操作CFrameGUIModule script呼吸灯商店imageChangetag标签知识答题showTips 基本操作 缩放按shift 等比例缩放 ctrl 双向缩放 复制对象 ctrlD &#xff08;如果选择多个对象&#xff0c;按住ctrl&#xff09; F 聚焦 Workspace ​ Terrain…

看完这篇文章,你还会用再用AUTOMATIC1111 WebUI吗?

​说起 AUTOMATIC1111 的 Stable diffusion-wbui 这个项目&#xff0c;使用过Stable diffusion的人应该无人不知吧&#xff0c;网络上基本一边倒的在使用他家的项目&#xff0c;而且fork量和star量还不小&#xff1a; 但是AUTOMATIC1111 这个名字总给我一些不靠谱的感觉&#x…

【C++】多态、黑马程序员案例— —电脑组装、Visual Studio开发人员工具查看内部结构,cl /d1 reportSingleClassLayout

author&#xff1a;&Carlton tag&#xff1a;C topic&#xff1a;【C】多态、黑马程序员案例— —电脑组装、Visual Studio开发人员工具查看内部结构,cl /d1 reportSingleClassLayout website&#xff1a;黑马程序员C date&#xff1a;2023年7月24日 目录 纯虚函数、抽…

map的初始化、erase()、写入与写出

运行代码&#xff1a; //map的初始化、erase()、写入与写出 #include"std_lib_facilities.h"istream& operator>>(istream& is, map<string, int>&mm) {string ss"";int ii0;is >> ss;if(is>>ii)mm[ss] ii;return i…

【数据集】3小时尺度降水数据集-MSWEPV2

1 MSWEP V2 precipitation product 官网-MSWEP V2降水产品 参考

《向量数据库指南》:向量数据库Pinecone如何集成LangChain (一)

目录 LangChain中的检索增强 建立知识库 欢迎使用Pinecone和LangChain的集成指南。本文档涵盖了将高性能向量数据库Pinecone与基于大型语言模型(LLMs)构建应用程序的框架LangChain集成的步骤。 Pinecone使开发人员能够基于向量相似性搜索构建可扩展的实时推荐和搜索系统…

redis之Bitmap

位图数据结构其实并不是一个全新的玩意&#xff0c;我们可以简单的认为就是个数组&#xff0c;只是里面的内容只能为0或1而已(二进制位数组)。 GETBIT用于返回位数组在偏移量上的二进制位的值。值得我们注意的是&#xff0c;GETBIT的时间复杂度是O(1)。 GETBIT命令的执行过程如…

LeetCode 75 第十三题(1679)K和数对的最大数目

题目: 示例: 分析: 给一个数组&#xff0c;两个和为K的数为一组&#xff0c;问能凑成几组。 既然一组是两个数&#xff0c;那么我们可以使用双指针分别指向数组首尾&#xff0c;然后再判断能否凑成和为K的组. 在使用双指针寻找之前,我们应当先将数组排序(升序降序都无所谓),…

[SSM]Spring面向切面编程AOP

目录 十五、面向切面编程AOP 15.1AOP介绍 15.2AOP的七大术语 15.3切点表达式 15.4使用Spring的AOP 15.4.1准备工作 15.4.2基于AspectJ的AOP注解式开发 15.4.3基于XML配置方式的AOP&#xff08;了解&#xff09; 15.5AOP的实际案例&#xff1a;事务处理 15.6AOP的实际…

flask用DBUtils实现数据库连接池

flask用DBUtils实现数据库连接池 在 Flask 中&#xff0c;DBUtils 是一种实现数据库连接池的方案。DBUtils 提供了持久性&#xff08;persistent&#xff09;和透明的&#xff08;transient&#xff09;两种连接池类型。 首先你需要安装 DBUtils 和你需要的数据库驱动。例如&…

关于c++中虚函数和虚函数表的创建时机问题

以这段代码为例。 #include <iostream>using namespace std;class Parent { public:Parent(){}virtual void func1() {};virtual void func2() {}; };class Child :public Parent { public:Child():n(0),Parent(){cout << "Child()" << endl;}vir…

【机器学习】西瓜书学习心得及课后习题参考答案—第4章决策树

这一章学起来较为简单&#xff0c;也比较好理解。 4.1基本流程——介绍了决策树的一个基本的流程。叶结点对应于决策结果&#xff0c;其他每个结点则对应于一个属性测试&#xff1b;每个结点包含的样本集合根据属性测试的结果被划分到子结点中&#xff1b;根结点包含样本全集&a…

js中的遍历方法比较:map、for...in、for...of、reduce和forEach的特点与适用场景

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;JavaScript中的遍历方法比较&#xff1a;map、for…in、for…of和forEach的特点与适用场景 文章目录 map 方法概述用法返回值特点 for...in 循环概述用法注意事项 for...of 循环概述用法可迭代对象…

苍穹外卖day09——历史订单模块(用户端)+订单管理模块(管理端)

查询历史订单——需求分析与设计 产品原型 业务规则 分页查询历史订单 可以根据订单状态查询 展示订单数据时&#xff0c;需要展示的数据包括&#xff1a;下单时间、订单状态、订单金额、订单明细&#xff08;商品名称、图片&#xff09; 接口设计 查询历史订单——代码开…

抖音seo短视频账号矩阵系统技术开发简述

说明&#xff1a;本开发文档适用于抖音seo源码开发&#xff0c;抖音矩阵系统开发&#xff0c;短视频seo源码开发&#xff0c;短视频矩阵系统源码开发 一、 抖音seo短视频矩阵系统开发包括 抖音seo短视频账号矩阵系统的技术开发主要包括以下几个方面&#xff1a; 1.前端界面设…

线程初见——对速度的追求

文章目录 线程进程线程区别线程之间资源线程库介绍 线程 同一个程序的所有线程共享一份全局内存区域 特例&#xff1a;只包含一个线程的进程 查看线程号&#xff1a;ps -Lf 号 和进程类似&#xff0c;完成并发任务的执行 进程线程区别 区别进程线程信息交换内存未共享&#xf…

cad丢失mfc140u.dll怎么办?找不到mfc140u.dll的解决方法

第一&#xff1a;mfc140u.dll有什么用途&#xff1f; mfc140u.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分。MFC是 C中的一个框架&#xff0c;用于构建Windows应用程序的用户界面和功能。mfc140u.dll包含了MFC库中…

CAN15765和1939协议

1. 15765协议介绍 简单的来说&#xff0c;15765协议指的是 基于CAN2.0A/B 协议 &#xff08;也可以叫做ISO11898协议 -链路层&#xff09; 硬件接口的 应用层 通讯协议&#xff0c; 它用于实现通用的车辆诊断服务。 ISO11898协议参考下图。 参考搜索到的“CAN总线协议讲解…