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

前言

       在上一章节中我们讲了网络信息配置,那些网络信息的配置都是用户手动的去配置的,为了能跟电脑处于同一网段,且电脑能成功ping通板子,我们不仅要注意子网掩码,对于IP地址主机位和网络位的划分,而且还要注意不能跟同一网段已有IP地址的重复,对于新手和不了解网络的人来说,如何配置是件很麻烦的事,那么本章将通过DHCP协议,从dhcp服务器获取网络信息来进行配置(IPv4),直接省去了用户手动配置不知道如何配置的烦恼。

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地址来配置了。

硬件准备

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

    注意:需将W6100-EVB-Pico通过RJ45网口接入到路由器(dhcp服务器)上,电脑也接入到同一路由器下(保证跟板子同一网段),路由器必须开启DHCP服务。

软件环境

  • Visual Studio Code

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

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

        我们先打开dhcpv4.h可以看到四个头函数声明,是我们要用到的:

1 号箭头所指是dhcpv4初始化,传入一个socket端口号s和协议解析数据包所用的缓存buf;

2 号箭头所指根据描述是让我们把它放到一个1s的定时器里,用与dhcp协议解析数据包时的计时;

3 号箭头所指是用户传入三个回调函数,用于不同状态下的回调处理,ip_assign是首次收到

4 号箭头所指是dhcpv4运行函数,根据函数上面的描述,得知该函数是直接放到主函数循环里运行的,

这几个函数的具体实现大家可以自行了解。

/** @brief DHCP client initialization (outside of the main loop)* @param s   - socket number* @param buf - buffer for processing DHCP message*/
void DHCPv4_init(uint8_t s, uint8_t * buf);/** @brief DHCP 1s Tick Timer handler* @note SHOULD BE register to your system 1s Tick timer handler*/
void DHCPv4_time_handler(void);/** @brief Register call back function* @param ip_assign   - callback func when IP is assigned from DHCP server first* @param ip_update   - callback func when IP is changed* @param ip_conflict - callback func when the assigned IP is conflict with others.*/
void reg_dhcpv4_cbfunc(void(*ip_assign)(void), void(*ip_update)(void), void(*ip_conflict)(void));/** @brief DHCP client in the main loop* @return    The value is as the follow \n*            @ref DHCPV4_FAILED     \n*            @ref DHCPv4_runNING    \n*            @ref DHCP_IPV4_ASSIGN  \n*            @ref DHCP_IPV4_CHANGED \n* 			  @ref DHCP_IPV4_LEASED  \n*            @ref DHCPV4_STOPPED    \n** @note This function is always called by you main task.*/
uint8_t DHCPv4_run(void);

        然后我们打开dhcp_client.c,可以看到主函数前声明的几个函数和初始化的网络配置信息,注意其中一个元素ipmode我们选择NETINFO_DHCP_V4,即从dhcp获取IPv4等网络信息;

void dhcp_test(void);
void my_ip_conflict(void);
void my_ip_assign(void);
void network_init(void);wiz_NetInfo net_info = {.mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},.ip = {192, 168, 1, 10},.sn = {255, 255, 255, 0},.gw = {192, 168, 1, 1},.dns = {8, 8, 8, 8},.ipmode = NETINFO_DHCP_V4};
uint8_t my_dhcp_retry = 0;
uint8_t g_msec_cnt = 0;

        然后我们先看dhcp_test()函数的实现,它把DHCPv4_run()函数用一个Switch状态机去获取其返回的值(dhcp状态)并做出相应的处理,前面提到DHCPv4_run()函数是直接放主函数循环里的,因而这里dhcp_test()对其封装后直接运行在主函数的while循环里。

void dhcp_test(void)
{switch (DHCPv4_run()){case DHCP_IPV4_ASSIGN:case DHCP_IPV4_CHANGED:break;case DHCP_IPV4_LEASED:break;case DHCPV4_FAILED:my_dhcp_retry++;if (my_dhcp_retry > 5){printf(">>DHCP %d Failed\r\n", my_dhcp_retry);my_dhcp_retry = 0;DHCPv4_stop();network_init();}default:break;}
}void my_ip_conflict(void)
{printf("CONFLICT IP from DHCP\r\n");while(1);
}void my_ip_assign(void)
{getIPfromDHCPv4(net_info.ip);getGWfromDHCPv4(net_info.gw);getSNfromDHCPv4(net_info.sn);getDNSfromDHCPv4(net_info.dns);net_info.ipmode = NETINFO_DHCP_V4;network_init();printf("DHCP LEASED TIME:%ld Sec.\r\n",getDHCPv4Leasetime());
}void network_init(void)
{uint8_t tmpstr[6] = {0,};wiz_NetInfo netinfo;ctlnetwork(CN_SET_NETINFO,(void*)&net_info);ctlnetwork(CN_GET_NETINFO,(void*)&netinfo);ctlwizchip(CW_GET_ID,(void*)tmpstr);if(netinfo.ipmode == NETINFO_DHCP_V4) printf("\r\n=== %s NET CONF:DHCP ===\r\n",(char*)tmpstr);else printf("\r\n===%s NET CONF : Static === \r\n",(char*)tmpstr);printf("mac: %02X-%02X-%02X-%02X-%02X-%02X\r\n", netinfo.mac[0], netinfo.mac[1], netinfo.mac[2], netinfo.mac[3], netinfo.mac[4], netinfo.mac[5]);printf("ip: %d.%d.%d.%d\r\n", netinfo.ip[0], netinfo.ip[1], netinfo.ip[2], netinfo.ip[3]);printf("mask: %d.%d.%d.%d\r\n", netinfo.sn[0], netinfo.sn[1], netinfo.sn[2], netinfo.sn[3]);printf("gw: %d.%d.%d.%d\r\n", netinfo.gw[0], netinfo.gw[1], netinfo.gw[2], netinfo.gw[3]);printf("dns: %d.%d.%d.%d\r\n", netinfo.dns[0], netinfo.dns[1], netinfo.dns[2], netinfo.dns[3]);
}

        然后是写一个定时器调用DHCPv4_time_handler用于dhcp协议的计时;

/* Timer */
static void repeating_timer_callback(void)
{g_msec_cnt++;if (g_msec_cnt >= 1000 - 1){g_msec_cnt = 0;DHCPv4_time_handler();}
}

最后看主函数,因为dhcp协议需要我们首先需要为它配置一个MAC地址,注意配置网络信息需要对网络锁寄存器进行解锁后才能配置。

int main()
{uint8_t temp;uint8_t databuf[2048];stdio_init_all();sleep_ms(2000);printf("W6100 network install example.\r\n");wizchip_initialize();/* Chip software reset. All registers are initialized. */wizchip_sw_reset();/* Determine the network lock register status. */if(!ctlwizchip(SYS_NET_LOCK, &temp)){   printf("unlock.\n");NETUNLOCK();}setSHAR(net_info.mac);DHCPv4_init(0,databuf);reg_dhcpv4_cbfunc(my_ip_assign,my_ip_assign,my_ip_conflict);while (true){   dhcp_test();sleep_ms(100);}
}

步骤2:编译烧录

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

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

步骤3:验证测试

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

示例下载链接

链接:W6100-EVB-Pico示例

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

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

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

相关文章

【unity】Pico VR 开发笔记(基础篇)

Pico VR 开发笔记(基础篇) XR Interaction Tooikit 版本 2.3.2 一、环境搭建 其实官方文档已经写的很详细了,这里只是不废话快速搭建,另外有一项官方说明有误的,补充说明一下,在开发工具部分说明 插件安装——安装pico的sdk和XR…

编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二)

系列文章目录 编程小白的自学笔记十一(python爬虫入门三Selenium的使用实例详解) 编程小白的自学笔记十(python爬虫入门二实例代码详解) 编程小白的自学笔记九(python爬虫入门代码详解) 目录 系列文章…

指针应用基础练习

(1)一级指针,二级指针 void getString(char **p) {*p "hello world"; }int main(void) {char *str NULL;getString(&str);printf("%s\n", str); } 代码分析: 定义了一个char型指针str,…

uni-app踩坑记

打包h5如何配置域名: 在manifest.json中配置域名 配置完成后无论是测试环境还是正式环境都带上/mobile/,否则会报错404 如何引入调试工具erada: 在默认的index.html中直接引入erada,页面样式会整个错乱,解决方案就是引入官方…

信号槽中的函数重载

信号槽中的函数重载 QT4的方式QT5的方式函数指针重载函数QT5信号函数重载解决方案 总结 QT4的方式 Qt4中声明槽函数必须要使用 slots 关键字, 不能省略。 信号函数: 槽函数: mainwondow: cpp文件: #include "mainwindow.h"…

WebSocket协议解析

文章目录 概要一、WS原理1.1、帧格式 二、WS实战2.1、客户端发起协议升级请求2.2、服务端响应协议升级2.3、核心事件2.4、心跳保活 三、总结 概要 项目中的IM系统是基于WebSocket做的,所以这里聊一下。 说到WS,不得不提HTTP,HTTP是基于TCP,面…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十二天 42/50【unordered_set】【双指针处理连续】【翻转字符串】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

AD21原理图的高级应用(五)自定义原理图模板及调用

(五)自定义原理图模板及调用 1.创建原理图模板2.调用原理图模板 1.创建原理图模板 利用 Altium Designer 软件在原理图中创建自己的模板,可以在图纸的右下角绘制一个表格用于显示图纸的一些参数,例如文件名、作者、修改时间、审核者、公司信息、图纸总数…

shopee,lazada,etsy店群如何高效安全的管理

对于电商卖家来说,要经营多个店铺,管理多个账号是非常常见的操作。为了避免账号关联被平台识别出来,需要使用防关联的浏览器来进行操作 ​1、支持多平台 支持同时管理多个电商平台店铺,Shopee、Lazada、etsy、poshmark、vinted等&…

Vue.js 生命周期函数

系列文章目录 Vue.js基础简答题 文章目录 系列文章目录前言一、创建阶段1.beforeCreate2.created3.beforeMount4.mounted 二、运行阶段1.beforeUpdate2.updated 三、销毁阶段1.beforeDestroy2.destroyed 总结 前言 Vue.js 生命周期指的是Vue实例的生命周期; Vue实…

【RabbitMQ】Linux系统服务器安装RabbitMQ

一、下载 首先应该下载erlang,rabbitmq运行需要有erland环境。 官网地址:https://www.erlang.org/downloads 下载rabbitmq 官网环境:https://www.rabbitmq.com/download.html 注意:el7对应centos7,el8对应centos8…

在Word中快速输入方框对号

在Word中输入方框对号播报文章 先输入“2611”,然后同时按ALTX, 插入 符号 其他符号

主流开源监控系统一览

减少故障有两个层面的意思,一个是做好常态预防,不让故障发生;另一个是如果故障发生,要能尽快止损,减少故障时长。而监控的典型作用,就是帮助我们发现及定位故障,这两个环节对于减少故障时长至关…

STM32 串口学习(二)

要用跳线帽将PA9与RXD相连,PA10与TXD相连。 软件设计 void uart_init(u32 baud) {//UART 初始化设置UART1_Handler.InstanceUSART1; //USART1UART1_Handler.Init.BaudRatebound; //波特率UART1_Handler.Init.WordLengthUART_WORDLENGTH_8B; //字长为 8 位数据格式U…

CAN通信的位定时与同步

位定时与同步 1.位时间 1.1相关基本概念 1)系统时钟:记为 t c l k t_{clk} tclk​; 2)CAN时钟周期:CAN时钟是由系统时钟分频而来的一个时间长度值,表示CAN控制器的工作时钟,实际上就是一个时…

网络编程套接字

网络编程套接字 预备知识理解源IP地址和目的IP地址认识端口号理解 "端口号" 和 "进程ID"理解源端口号和目的端口号认识TCP协议认识UDP协议网络字节序 socket编程接口socket 常见APIsockaddr结构 简单的UDP网络程序UDP通用服务端udp服务端初始化udp服务端启…

自动化运维工具——Ansible

自动化运维工具——Ansible 一、Ansible概述二、ansible 环境安装部署1.管理端安装 ansible2.ansible 目录结构3.配置主机清单4.配置密钥对验证 三、ansible 命令行模块1.command 模块2.shell 模块3.cron 模块4.user 模块5.group 模块6.copy 模块7.file 模块8.hostname 模块9&a…

自定义一个仿拼多多地址选择器

前言 做了一个仿拼多多的地址选择器,但是与拼多多实现方法有些出入,大体效果是差不多的。废话不多说,先上一张效果动图: 开始 先说说本文的一些概念。地区级别:就是比如省级,市级,县级&#x…

map,set的封装(基于改造红黑树)

目录 引言 1.迭代器 2.map的[]重载 3.KeyOfValue模板参数 4.整体代码展示 //改造后的红黑树代码 #include <iostream> using namespace std;enum Colour {RED 0,BLACK, };//为了实现map与set封装使用同一个模板红黑树&#xff0c;前者的value是pair&#xff0c;后者…

WebAgent-基于大型语言模型的代理程序

大型语言模型&#xff08;LLM&#xff09;可以解决多种自然语言任务&#xff0c;例如算术、常识、逻辑推理、问答、文本生成、交互式决策任务。最近&#xff0c;LLM在自主网络导航方面也取得了巨大成功&#xff0c;代理程序助HTML理解和多步推理的能力&#xff0c;通过控制计算…