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可以看到四个头函数声明,是我们要用到的:
第一个是dhcpv4初始化,传入一个socket端口号s和协议解析数据包所用的缓存buf;
第二个根据描述是让我们把它放到一个1s的定时器里,用与dhcp协议解析数据包时的计时;
第三个需要用户传入三个回调函数,用于不同状态下的回调处理;
第四个是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:编译烧录
- 选择GCC arm-none-eabi编译链
- 选择编译项目为dhcp_client
- 点击Build进行编译
编译之后,按住boot按钮把开发板连接到电脑上,也可以连接后按住boot键再按下run复位上电,此时电脑将开发板识别为大容量存储器,我们将build/examples/dhcp_client文件夹下面的uf2文件拖入开发板的大容量存储器中,就烧录好了。
步骤3:验证测试
此时串口会打印获取到的IP地址信息,我们也能直接ping通获取到的IP地址
示例下载链接
链接:W6100-EVB-Pico示例
本期内容就分享到这里啦!觉得写的还不错的话给个关注鼓励一下吧!下期我们来讲讲如何通过DNS解析百度的域名地址。
相关文章:

WIZnet W6100-EVB-Pico DHCP 配置教程(三)
前言 在上一章节中我们讲了网络信息配置,那些网络信息的配置都是用户手动的去配置的,为了能跟电脑处于同一网段,且电脑能成功ping通板子,我们不仅要注意子网掩码,对于IP地址主机位和网络位的划分,而且还要注…...
【Linux】Ansible 脚本 playbook 剧本
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Ansible 脚本 playbook 剧本 playbook 剧本Templates 模块tags 模块Roles 模块在一个 playbook 中使用 roles 的步骤 playbook 剧本 playbooks 本身由以下各部分组成 &#…...

解决 tensorflow 出现的 ImportError: Could not find the DLL(s) ‘msvcp140_1.dll‘. 问题
在安装完tensorflow库后出现 问题详述: ImportError: Could not find the DLL(s) msvcp140_1.dll. TensorFlow requires that these DLLs be installed in a directory that is named in your %PATH% environment variable. You may install these DLLs by downlo…...

百度与AI:历史、投资和监管
来源:猛兽财经 作者:猛兽财经 百度的人工智能在中国具有先发优势 随着ChatGPT的爆火,人工智能重新引起了投资者的注意,然而人工智能并不是突然爆火的,而是全球众多公司在人工智能技术上进行数十年如一日的研发和积累&a…...

Kafka3.0.0版本——Broker(Zookeeper服务端存储的Kafka相关信息)
目录 一、启动zookeeper集群及kafka集群服务启动1.1、先启动三台zookeeper集群服务,再启动三台kafka集群服务1.2、使用PrettyZoo连接zookeeper客户端工具 二、在zookeeper服务端存储的Kafka相关信息 一、启动zookeeper集群及kafka集群服务启动 1.1、先启动三台zook…...

【图论】无向图连通性(tarjan算法)
割边:dfn[u]<low[v] 割点:dfn[u]<low[v] (若为根节点,要有两个v这样的点) 一.知识点: 1.连通: 在图论中,连通性是指一个无向图中的任意两个顶点之间存在路径。如果对于图中的任意两个顶点 u 和 v&…...

Docker安装
Docker实践 yum安装 YUM源可以使用官方YUM源、清华大学开源镜像站配置YUM源,也可以使用阿里云开源镜像站提供的YUM源,建议选择使用阿里云开源镜像站提供的YUM源,原因速度快。 地址: https://developer.aliyun.com/mirror/ 我们安装ce版 …...
06. 计数原理
6. 计数原理 6.1 分类加法计数原理与分步乘法计数原理 分类加法计数原理定义 完成一件事,有 n n n 类办法,在第1类办法中有 m 1 m_1 m1 种不同的方法,在第2类办法中有 m 2 m_2 m2 种不同的方法,…,在第 n n…...

计算机网络基础(静态路由,动态路由,公网IP,私网IP,NAT技术)
文章目录 一:静态路由和动态路由二:静态路由的配置路由信息的方式演示三:默认路由四:公网IP和私网IP和NAT技术的基本理解 一:静态路由和动态路由 在说静态路由和动态路由前,我们需要来了解一下࿰…...
CGAL 点云Alpha-Shape曲面重建算法
文章目录 一、简介二、相关参数三、实现代码四、实现效果参考资料一、简介 在数学上, a l p h a − s h a p e alpha-shape a...
Java 文件过滤器FileFilter | 按条件筛选文件
文章目录 一、概述1.1 何时会用到文件过滤器1.2 工作流程1.3 常用的接口和类1.4 文件过滤器的作用 二、按文件属性过滤2.1 按前缀或后缀过滤文件名2.2 按文件大小过滤 三、按文件内容过滤3.1 文本文件过滤器3.1.1 根据关键字过滤文件内容3.1.2 使用正则表达式过滤文件内容 3.2 …...

python格式化地址信息
背景 最近在折腾一个好玩的库,capa 实现地址的格式化输出。我看的教程是这样的: location_str ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区"] import cpca df cpca.transform(location_str) df在正式的运行代码…...
k8s1.26.6 安装gitlab
Gitlab官方提供了 Helm 的方式在 Kubernetes 集群中来快速安装,但是在使用的过程中发现 Helm 提供的 Chart 包中有很多其他额外的配置,所以我们这里使用自定义的方式来安装,也就是自己来定义一些资源清单文件。 Gitlab主要涉及到3个应用&…...

C5.0决策树建立个人信用风险评估模型
通过构建自动化的信用评分模型,以在线方式进行即时的信贷审批能够为银行节约很多人工成本。本案例,我们将使用C5.0决策树算法建立一个简单的个人信用风险评估模型。 导入类库 读取数据 #创建编码所用的数据字典 col_dicts{} #要编码的属性集 cols [che…...
【k8s集群部署】使用containerd运行时部署kubernetes集群(V1.27版本)
【k8s集群部署】使用containerd运行时部署kubernetes集群(V1.27版本) 一、本次实践介绍1.1 环境规划介绍1.2 本次实践简介二、三台主机基础环境配置2.1 主机配置工作2.2 关闭防火墙和selinux2.3 关闭swap2.4 清空iptables2.5 配置时间同步2.6 修改内核参数2.7 配置hosts文件三…...

网络安全进阶学习第八课——信息收集
文章目录 一、什么是信息收集?二、信息收集的原则三、信息收集的分类1.主动信息收集2.被动信息收集 四、资产探测1、Whois查询#常用网站: 2、备案信息查询#常用网站: 3、DNS查询#常用网站: 4、子域名收集#常用网站:#常…...
Spring Data Elasticsearch - 在Spring应用中操作Elasticsearch数据库
Spring Data Elasticsearch 文章目录 Spring Data Elasticsearch1. 定义文档映射实体类2. Repository3. ElasticsearchRestTemplate3.1 查询相关特性3.1.1 过滤3.1.2 排序3.1.3 自定义分词器 3.2 高级查询 4. 索引管理4.1 创建索引4.2 检索索引4.3 修改映射4.4 删除索引 5. 异常…...

图论-简明导读
计算机图论是计算机科学中的一个重要分支,它主要研究图的性质和结构,以及如何在计算机上有效地存储、处理和操作这些图。本文将总结计算机图论的核心知识点。 一、基本概念 计算机图论中的基本概念包括图、节点、边等。图是由节点和边构成的数据结构&am…...

记一次 .NET 某物流API系统 CPU爆高分析
一:背景 1. 讲故事 前段时间有位朋友找到我,说他程序CPU直接被打满了,让我帮忙看下怎么回事,截图如下: 看了下是两个相同的程序,既然被打满了那就抓一个 dump 看看到底咋回事。 二:为什么会打…...

【Docker】Docker安装Kibana服务_Docker+Elasticsearch+Kibana
文章目录 1. 什么是Kibana2. Docker安装Kibana2.1. 前提2.2. 安装Kibana 点击跳转:Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套(质量有保证,内容详情) 1. 什么是Kibana Kibana 是一款适用于Elasticse…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...