W5500以太网控制器芯片(三):实现DHCP服务
#W5500以太网控制芯片相关文章链接#
上一篇文章:
W5500以太网控制器芯片(二):ioLibrary库实现TCP客户端
如果要W5500的IP动态分配,则要实现DHCP功能,实现流程如下:
准备工具(和上篇一致):
a、电脑上装一个网络调试工具,做TCP服务器用
b、一个路由器,后面电脑和W5500都要接到路由器上
c、W5500+支持SPI接口的MCU或者SOC
d、官方的ioLibrary库文件
1、移植驱动
除了之前引入的文件,还要将固件库里Internet文件夹下的DHCP文件夹的文件引入你的项目工程中,分别是dhcp.c和dhcp.h
2、初始化DHCP
(1)此处从NETINFO_STATIC改为NETINFO_DHCP
//Default Network Configuration
wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc,0x00, 0xab, 0xcd},.ip = {192, 168, 1, 123},.sn = {255,255,255,0},.gw = {192, 168, 1, 1},.dns = {114,114,114,114},.dhcp = NETINFO_DHCP,
};
(2)新增、更改几个函数
/******************************************************** @ brief Call back for ip assing & ip update from DHCP*******************************************************/
void my_ip_assign(void)
{getIPfromDHCP(gWIZNETINFO.ip);getGWfromDHCP(gWIZNETINFO.gw);getSNfromDHCP(gWIZNETINFO.sn);getDNSfromDHCP(gWIZNETINFO.dns);gWIZNETINFO.dhcp = NETINFO_DHCP;/* Network initialization */network_init(); // apply from dhcpprintf("DHCP LEASED TIME : %ld Sec.\r\n", getDHCPLeasetime());
}/************************************* @ brief Call back for ip Conflict************************************/
void my_ip_conflict(void)
{printf("CONFLICT IP from DHCP\r\n");//halt or reset or any...while(1); // this example is halt.
}//网络初始化(DHCP)
void network_init(void)
{uint8_t tmpstr[6] = {0,};wiz_NetInfo netinfo;// Set Network information from netinfo structurectlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);// Get Network informationctlnetwork(CN_GET_NETINFO, (void*)&netinfo);// Display Network Informationctlwizchip(CW_GET_ID,(void*)tmpstr);if(netinfo.dhcp == NETINFO_DHCP) 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("SIP: %d.%d.%d.%d\r\n", netinfo.ip[0],netinfo.ip[1],netinfo.ip[2],netinfo.ip[3]);printf("GAR: %d.%d.%d.%d\r\n", netinfo.gw[0],netinfo.gw[1],netinfo.gw[2],netinfo.gw[3]);printf("SUB: %d.%d.%d.%d\r\n", netinfo.sn[0],netinfo.sn[1],netinfo.sn[2],netinfo.sn[3]);printf("DNS: %d.%d.%d.%d\r\n", netinfo.dns[0],netinfo.dns[1],netinfo.dns[2],netinfo.dns[3]);printf("===========================\r\n");
}
(3)主函数更改:初始化DHCP服务,分配IP,随后连接远程的TCP服务器
#include "socket.h" // Just include one header for WIZCHIP
#include "dhcp.h"#define SOCK_TCPC 0
#define SOCK_TCPS 1
#define SOCK_DHCP 2#define MY_MAX_DHCP_RETRY 3
#define DATA_BUF_SIZE 2048int main(void)
{delay_init(); //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2uart_init(115200); //串口初始化LED_Init();SPI2_Init();/* Critical section callback *///reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注册临界区函数reg_wizchip_cris_cbfunc(NULL, NULL); // 注册临界区函数reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);// 注册片选函数/* SPI Read & Write callback function */reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注册读写函数/* WIZCHIP SOCKET Buffer initialize */if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){printf("WIZCHIP Initialized fail.\r\n");while(1);}/* PHY link status check */do{if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){printf("Unknown PHY Link stauts.\r\n");}}while(tmp == PHY_LINK_OFF);/* Network initialization */
// network_init(); //使用DHCP屏蔽此处// must be set the default mac before DHCP started.setSHAR(gWIZNETINFO.mac);DHCP_init(SOCK_DHCP, gDATABUF);// if you want defiffent action instead defalut ip assign,update, conflict,// if cbfunc == 0, act as default.reg_dhcp_cbfunc(my_ip_assign, my_ip_assign, my_ip_conflict);/* Main loop */while(1){dhcp_test();delay_ms(100);LED1 = 0;delay_ms(100);LED1 = 1;} // end of Main loop
}uint8_t my_dhcp_retry = 0;//dhcp测试
void dhcp_test(void)
{uint8_t res= 0;switch(DHCP_run()){case DHCP_IP_ASSIGN:case DHCP_IP_CHANGED:/* If this block empty, act with default_ip_assign & default_ip_update *///// This example calls my_ip_assign in the two case.//// Add to ...//break;case DHCP_IP_LEASED://// TO DO YOUR NETWORK APPs.loopback_tcpc(SOCK_TCPS, gDATABUF, dest_ip, dest_port);break;case DHCP_FAILED:/* ===== Example pseudo code ===== */// The below code can be replaced your code or omitted.// if omitted, retry to process DHCPmy_dhcp_retry++;if(my_dhcp_retry > MY_MAX_DHCP_RETRY){printf(">> DHCP %d Failed\r\n", my_dhcp_retry);my_dhcp_retry = 0;DHCP_stop(); // if restart, recall DHCP_init()network_init(); // apply the default static network and print out netinfo to serial}break;default:break;}
}
4、更改完成,上电验证结果
我们原先程序里的 ip是这样的:
//Default Network Configuration
wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc,0x00, 0xab, 0xcd},.ip = {192, 168, 1, 123},.sn = {255,255,255,0},.gw = {192, 168, 1, 1},.dns = {114,114,114,114},.dhcp = NETINFO_DHCP,
};
使用DHCP服务后,发生了变更:
可以看到,网关10.1.1.1给W5500分配了10.1.1.237作为IP,DHCP服务生效,随后连接上了远程服务器。
现在只要将设备连接到提供DHCP服务的网口上,无论区域网实际的网段是什么,W5500都会分配到一个在该网段下的IP,连接上远程服务器。程序里的IP、网关随便填一个即可,DHCP服务会将其分配好。
需要注意的是:分配IP是根据设备MAC地址的,所以MAC在同一个网段里应是唯一的,否则分配IP可能会出现问题。
下一篇:
W5500以太网控制器芯片(四):实现DNS功能
W5500以太网控制器芯片(三):实现DHCP服务相关推荐
- W5500以太网控制器芯片(四):实现DNS功能
#W5500以太网控制芯片相关文章链接# 上一篇: W5500以太网控制器芯片(三):实现DHCP服务 使用W5500时,如果要连接的是域名,则连接TCP服务器前将要域名转成IP再进行连接,这时候就要 ...
- Wiznet W5500以太网控制器应用笔记
引用数据手册的芯片介绍:"W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案.W5500 集成了TCP/IP 协议栈,10/100M 以太 ...
- Linux DHCP 服务
一.概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局 域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网 ...
- RT-Thread 之 WIZnet 软件包(全硬件TCP/IP协议栈W5500以太网芯片) 以太网 Socket 通信
目录 1.介绍 1.1 WIZnet 1.2 W5500 2.RT-Thread Studio 配置及相关代码 2.1 添加WIZnet软件包 2.2 配置 WIZnet 软件包 2.3 配置 spi ...
- W5500全硬件 TCP/IP 嵌入式以太网控制器WIZNET
概述 W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案. W5500 集成了 TCP/IP 协议栈,10/100M 以太网数据链路层(MAC)及物 ...
- 【硬件】以太网PHY芯片有三个时钟说明
硬件以太网PHY芯片有三个时钟,对此进行了梳理: PHY芯片时钟的选择: PHY芯片中有3个时钟, Gtx_clk,Rx_clk ,Tx_clk. 1) GTX_CLK仅使用在GMII模式下,时钟频率 ...
- 从零开始 verilog 以太网交换机(三)MAC发送控制器的设计与实现
从零开始 verilog 以太网交换机(三)MAC发送控制器的设计与实现
- DHCP服务和NIS服务
<本章目标> ■ 掌握Linux系统网络配置 ■ 掌握DHCP和NIS的服务器配置和客户端使用 ■ 使用DHCP中继代理实现跨网段的网络地址自动分配 ■ 使用NIS服务实现主机和用户帐户的 ...
- 基于stm32之w5500以太网应用
基于stm32之w5500以太网应用 强调一下前半段为基础知识普及(这段还是很重要的.不管用什么工具开发精通协议才是王道),后半段为实战代码干货. 如上图所示,最底下的一层叫做"物理层&qu ...
最新文章
- 解题报告:luoguP2868 Sightseeing Cows G(最优比率环,负环判定,二分答案)
- 7-28 猴子选大王 (C语言)
- java - 第一阶段总结
- golang语言学习第三课 条件语句
- poj3784 Running Median查找中位数
- Linq怎么支持Monad
- 超图桌面版新建一个简单三维数据集并发布
- 数据库的硬迁移和mysql 5.5.38源码安装
- immutable.js笔记
- 中国科学院大学计算机金智,金智-中国科学院大学-UCAS
- Register DLL and OCX
- day25-静态、组合、继承
- 免费下载百度文库的几款在线工具推荐
- 8086CPU 的寻址方式(重点)
- Linux服务端rpm包安装Jenkins
- java中后台的跳转_java后台跳转
- 使用node加密excel文件
- android app防止锁屏_设置Android系统永不锁屏永不休眠的方法
- 三星a5100多少钱_请问三星A5100现在啥价格?
- real time robust malicious traffic detection via frequency domain analysis记录一下