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解析域名这一知识点进行讲解。