第二章 W55MH32 DHCP示例

描述

单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机

W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm® Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。

在封装规格上,W55MH32 提供了两种选择:QFN100和QFN68。

W55MH32L采用QFN100封装版本,尺寸为12x12mm,其资源丰富,专为各种复杂工控场景设计。它拥有66个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、5个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN、1个USB2.0以及1个SDIO接口。如此丰富的外设资源,能够轻松应对工业控制中多样化的连接需求,无论是与各类传感器、执行器的通信,还是对复杂工业协议的支持,都能游刃有余,成为复杂工控领域的理想选择。同系列还有QFN68封装的W55MH32Q版本,该版本体积更小,仅为8x8mm,成本低,适合集成度高的网关模组等场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。

此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及 MQTT SSL等,为网络通信安全再添保障。

为助力开发者快速上手与深入开发,基于W55MH32L这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。

物联网

第二章 W55MH32 DHCP示例

本篇文章我们将详细讲解DHCP协议的基本信息、优势特点、工作原理、应用场景,并通过实战例程,为大家讲解如何使用W55MH32动态获取IP信息,帮助读者更好地了解并运用这一协议。

有关W55MH32的初始化过程,请参考相关章节,这里将不再详述。

1 DHCP协议简介

DHCP(Dynamic Host Configuration Protocol)即动态主机配置协议,是一个应用层协议。它主要用于在 IP 网络中为客户端自动分配 IP 地址及其他相关网络配置参数,如子网掩码、默认网关、DNS 服务器地址等。这种动态分配的方式大大简化了网络管理员的工作,并且能够更有效地利用有限的 IP 地址资源。

2 DHCP协议特点

便捷配置与管控:DHCP可自动分配IP地址、子网掩码、网关、DNS等网络参数,设备入网即自动获取,用户无需手动操作。管理员能通过服务器集中管理IP分配,网络架构调整时,修改服务器设置,客户端自动适配;静态IP则要逐台手动输入、调整,流程繁琐还易出错。

灵活资源利用:DHCP动态分配IP,设备离线后地址回池再利用,契合公共场所临时大量接入需求,提升地址利用率;还能按需灵活调配,为关键设备保留静态IP,其余动态分配。静态IP固定占用,闲置浪费资源,灵活性差。

高效维护与排障:DHCP自动分配,规避手动配置错误与IP地址冲突,服务器详细记录分配情况。网络故障时,管理员依服务器日志锁定故障设备排查;静态IP手动配置易冲突,故障排查缺少有效记录,难度大、耗时久。

适配移动与拓展:移动设备横跨网络时,DHCP让其自动获取IP配置,无需手动切换;网络规模扩大、新增设备时,DHCP自动分配地址,助力快速扩容。静态IP需提前规划,易现地址不足、分配不合理问题,还增加设备移动操作难度。

3 DHCP工作原理

DHCP工作原理如图所示:

物联网

从图示中我们可以直观明了地看出DHCP地工作原理,一般为四个阶段:

发现阶段:客户端接入网络时以广播形式发送DHCP Discover报文(目的IP是255.255.255.255,源IP是0.0.0.0)寻找DHCP服务器,报文中含客户端MAC地址。若服务器和客户端不在同一子网,会通过中继代理(如路由器)转发。

提供阶段:DHCP服务器收到Discover报文后,从IP地址池选一个未分配的IP地址,将其和子网掩码、默认网关、DNS服务器地址等信息封装进DHCP Offer报文,以广播或单播方式发给客户端,可能会有多个Offer报文。

请求阶段:客户端收到多个Offer后选择一个,以广播形式发送DHCP Request报文请求分配该IP地址等配置信息,且发送ARP请求检查IP地址唯一性。

确认阶段:服务器收到Request报文后,检查IP地址是否可用。若可用,将以广播或单播的形式发送DHCP Ack报文,客户端收到后完成网络配置正常上网。若不可用,发送DHCP Nak报文,客户端收到后重新发起Discover流程。

4 DHCP协议报文

DHCP的报文格式如下:

0~7 bit 8~15 bit 16~23 bit 24~31 bit
op(1) htype(1) hlen(1) hops(1)
Xid(4)
secs(2) flags(2)
ciaddr(4)
yiaddr(4)
siaddr(4)
giaddr(4)
chaddr(16)
sname(64)
file(128)
options(variable)

DHCP报文各字段的说明如下表所示:

字段 长度 含义
op(op code) 1字节 表示报文的类型,取值为1或2,含义如下:
1:客户端请求报文。
2:服务器响应报文。
htype(hardware type) 1字节 表示硬件类型。不同的硬件类型取值不同,常见值为1,表示以太网(10Mb)。
hlen(hardware length) 1字节 表示硬件地址长度,以太网的值为6。
hops 1字节 表示DHCP报文经过的DHCP中继数目。客户端或服务器初始设为0,每经过一个中继则加1,用于限制DHCP报文经过的中继数量,且服务器与客户端间中继数目不能超16个(Hops值不能大于16),否则报文将被丢弃。
xid 4字节 表示DHCP客户端选取的随机数,使DHCP服务器的回复与DHCP客户端的报文相关联。
secs(seconds) 2字节 表示客户端从开始获取地址或地址续租更新后所用的时间,单位是秒。
flags 2字节 表示标志字段。只有标志字段的最高位才有意义,其余的15位均被置为0。最高位被解释为单播或者广播响应标志位,内容如下所示:
0:客户端请求服务器以单播形式发送响应报文。
1:客户端请求服务器以广播形式发送响应报文。
ciaddr(client ip address) 4字节 表示客户端的IP地址。可以是服务器分配给客户端的IP地址或者客户端已有的IP地址。客户端在初始化状态时没有IP地址,此字段为0.0.0.0。
IP地址0.0.0.0仅在采用DHCP方式的系统启动时允许本主机利用它进行临时的通信,不是有效目的地址。
yiaddr(your client ip address) 4字节 表示服务器分配给客户端的IP地址。当服务器进行DHCP响应时,将分配给客户端的IP地址填入此字段。
siaddr(server ip address) 4字节 DHCP客户端获得启动配置信息的服务器的IP地址。
giaddr(gateway ip address) 4字节 表示首个DHCP中继的IP地址。客户端发DHCP请求,若服务器与客户端不在同一网段,首个中继转发请求报文给服务器时填入自身IP地址,服务器据此判断客户端网段地址,选地址池分配对应IP地址,再按此地址回发响应报文给该中继,由中继转发给客户端。若存在多个中继,此字段作为客户端网段标记,填好首个中继IP地址后不再变更,每经过一个中继,hops字段数值加1。
chaddr(client hardware address) 16字节 表示客户端的MAC地址,此字段与前面的“hardware type”和“hardware length”保持一致。当客户端发出DHCP请求时,将自己的硬件地址填入此字段。对于以太网,当“hardware type”和“hardware length”分别为“1”和“6”时,此字段必须填入6字节的以太网MAC地址。
sname(server host name) 64字节 表示客户端获取配置信息的服务器名字。此字段由DHCP服务器填写,是可选的。如果填写,必须是一个以0结尾的字符串。
file(file name) 128字节 表示客户端需获取的启动配置文件名。由DHCP服务器填写,随DHCP地址分配下发至客户端。该字段可选,若填写则须是以0结尾的字符串。
options 可变 表示DHCP的选项字段,最多1200字节,包含DHCP报文类型、服务器分配给终端的配置信息(如网关IP地址、DNS服务器IP地址、客户端IP地址有效租期等)。详情参见IETF官网“DHCP Options”部分的描述。

Discover报文实例:客户端通过UDP广播的方式发送DHCP发现报文,报文中包含了客户端MAC地址、主机名和请求的IP地址等信息

 

|报文解析|
Message type: Boot Request (1) (op code为1,客户端请求报文)
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0xbf600589
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0
Your (client) IP address: 0.0.0.0
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11)
Client hardware address padding: 00000000000000000000
Server host name not given
Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (Discover)
Option: (61) Client identifier
Option: (50) Requested IP Address (192.168.1.115)
Option: (12) Host Name
Option: (60) Vendor class identifier
Option: (55) Parameter Request List
Option: (255) End
Padding: 0000000000000000

|报文原文|
01 01 06 00 bf 60
05 89 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 3d 07 01 64 4e d7 b1 37 11 32 04 c0 a8 01 73 0c 05 46 41 45 5f 33 3c 08 4d 53 46 54 20 35 2e 30 37 0e 01 03 06 0f 1f 21 2b 2c 2e 2f 77 79 f9 fc ff 00 00 00 00 00 00 00 00

 

Offer报文实例:DHCP服务器收到Discover报文后,从IP地址池选一个未分配的IP地址,将其和子网掩码、默认网关等信息封装进Offer报文以广播或单播(这里为广播的方式)方式发给客户端

 

|报文解析|
Message type: Boot Reply (2) (op code为2,服务器响应报文)
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0xbf600589
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0
Your (client) IP address: 192.168.1.115
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11)
Client hardware address padding: 00000000000000000000
Server host name not given
 Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (Offer)
Option: (54) DHCP Server Identifier (192.168.1.1)
 Option: (51) IP Address Lease Time
 Option: (6) Domain Name Server
Option: (1) Subnet Mask (255.255.255.0)
Option: (3) Router
Option: (255) End
|报文原文|
02 01 06 00 bf 60
05 89 00 00 00 00 00 00 00 00 c0 a8 01 73 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 02 36 04 c0 a8 01 01 33 04 00 00 1c 20 06 08 ca 60 86 21 ca 60 80 56 01 04 ff ff ff 00 03 04 c0 a8 01 01 ff

 

其他报文信息这里就不一一展示了,感兴趣的朋友可以自行抓取查看。

5 DHCP应用场景

DHCP的应用场景通常集中在需要动态分配IP地址的局域网环境中。例如,在大型的办公环境或者学校中,由于有大量的网络设备需要连接到网络,手动为每个设备分配和管理IP地址会非常繁琐且容易出错。使用DHCP可以集中管理IP地址的分配,提高网络管理员的工作效率,减少错误的发生,且可以适应网络变化。

6 实现过程

接下来,我们一起来看看如何在W55MH32上实现DHCP动态获取网络地址信息。

注意:使用DHCP动态获取IP时,必需将网络结构体配置中dhcp的值改为NETINFO_DHCP,这样才能运行DHCP模式。

步骤一:注册DHCP定时器中断到1s定时器中:

 

/**
* @brief   1ms timer IRQ Handler
* @param   none
* @return  none
*/
void TIM3_IRQHandler(void)
{
   static uint32_t tim3_1ms_count = 0;
   if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
   {
       tim3_1ms_count++;
       if (tim3_1ms_count >= 1000)
       {
           DHCP_time_handler();
           tim3_1ms_count = 0;
       }
       TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
   }
}

 

注册DHCP定时器中断主要为了DHCP超时处理。

在dhcp.h文件中,定义了DHCP超时时间、重试次数、端口号和主机名等内容:

 

/* Retry to processing DHCP */
#define MAX_DHCP_RETRY          2        ///< Maximum retry count
#define DHCP_WAIT_TIME          10       ///< Wait Time 10s

/* UDP port numbers for DHCP */
#define DHCP_SERVER_PORT       67       ///< DHCP server port number
#define DHCP_CLIENT_PORT         68       ///< DHCP client port number

#define MAGIC_COOKIE             0x63825363  ///< You should not modify it number.
#define DCHP_HOST_NAME           "WIZnet"

 

步骤二:启用DHCP动态获取:

首先需要将默认网络地址信息结构体中的模式改为DHCP模式

 

/* network information */
wiz_NetInfo default_net_info = {
   .mac  = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12},
   .ip   = {192, 168, 1, 30},
   .gw   = {192, 168, 1, 1},
   .sn   = {255, 255, 255, 0},
   .dns  = {8, 8, 8, 8},
   .dhcp = NETINFO_DHCP
};

 

步骤三:DHCP获取网络地址信息

首先是在初始化完硬件和TOE之后调用network_init进行网络地址信息配置

 

network_init(ethernet_buf, &default_net_info);

 

这个函数需要将DHCP处理用到的缓存数组以及默认网络地址信息传入,函数具体内容如下:

 

/**
* @brief   set network information
*
* First determine whether to use DHCP. If DHCP is used, first obtain the Internet Protocol Address through DHCP.
* When DHCP fails, use static IP to configure network information. If static IP is used, configure network information directly
*
* @param   sn: socketid
* @param   ethernet_buff:
* @param   net_info: network information struct
* @return  none
*/
void network_init(uint8_t *ethernet_buff, wiz_NetInfo *conf_info)
{
   int ret;
   wizchip_setnetinfo(conf_info); // Configuring Network Information
   if (conf_info- >dhcp == NETINFO_DHCP)
   {
       ret = wiz_dhcp_process(0, ethernet_buff);
       if (ret == 0)
       {
           conf_info- >dhcp = NETINFO_STATIC;
           wizchip_setnetinfo(conf_info);
       }
   }
   print_network_information();
}

 

在这个函数中,会先设置一遍网络地址到W55MH32中,然后判断模式是否为DHCP模式,如果为DHCP模式,则使用wiz_dhcp_process函数来执行DHCP进程,在通过DHCP方式成功获取到网络地址后更新到W55MH32中,最后将网络地址信息打印出来。wiz_dhcp_process函数内容如下:

 

/**
* @brief DHCP process
* @param sn :socket number
* @param buffer :socket buffer
*/
static uint8_t wiz_dhcp_process(uint8_t sn, uint8_t *buffer)
{
   wiz_NetInfo conf_info;
   uint8_t     dhcp_run_flag = 1;
   uint8_t     dhcp_ok_flag  = 0;
   /* Registration DHCP_time_handler to 1 second timer */
   DHCP_init(sn, buffer);
   printf("DHCP runningrn");
   while (1)
   {
       switch (DHCP_run())  // Do the DHCP client
       {
       case DHCP_IP_LEASED: // DHCP Acquiring network information successfully
           if (dhcp_ok_flag == 0)
           {
               dhcp_ok_flag  = 1;
               dhcp_run_flag = 0;
           }
           break;
       case DHCP_FAILED:
           dhcp_run_flag = 0;
           break;
       }
       if (dhcp_run_flag == 0)
       {
           printf("DHCP %s!rn", dhcp_ok_flag ? "success" : "fail");
           DHCP_stop();
           if (dhcp_ok_flag)
           {
               getIPfromDHCP(conf_info.ip);
               getGWfromDHCP(conf_info.gw);
               getSNfromDHCP(conf_info.sn);
               getDNSfromDHCP(conf_info.dns);
               conf_info.dhcp = NETINFO_DHCP;
               getSHAR(conf_info.mac);
               wizchip_setnetinfo(&conf_info); // Update network information to network information obtained by DHCP
               return 1;
           }
           return 0;
       }
   }
}

 

在该函数体中,首先会调用DHCP_init 函数进行初始化DHCP配置:

 

void DHCP_init(uint8_t s, uint8_t * buf)
{
   uint8_t zeroip[4] = {0,0,0,0};
   getSHAR(DHCP_CHADDR);
   if((DHCP_CHADDR[0] | DHCP_CHADDR[1]  | DHCP_CHADDR[2] | DHCP_CHADDR[3] | DHCP_CHADDR[4] | DHCP_CHADDR[5]) == 0x00)
   {
     // assigning temporary mac address, you should be set SHAR before call this function. 
     DHCP_CHADDR[0] = 0x00;
     DHCP_CHADDR[1] = 0x08;
     DHCP_CHADDR[2] = 0xdc;      
     DHCP_CHADDR[3] = 0x00;
     DHCP_CHADDR[4] = 0x00;
     DHCP_CHADDR[5] = 0x00; 
     setSHAR(DHCP_CHADDR);     
   }
 DHCP_SOCKET = s; // SOCK_DHCP
 pDHCPMSG = (RIP_MSG*)buf;
 DHCP_XID = 0x12345678;
 {
   DHCP_XID += DHCP_CHADDR[3];
   DHCP_XID += DHCP_CHADDR[4];
   DHCP_XID += DHCP_CHADDR[5];
   DHCP_XID += (DHCP_CHADDR[3] ^ DHCP_CHADDR[4] ^ DHCP_CHADDR[5]);
 }
 // WIZchip Netinfo Clear
 setSIPR(zeroip);
 setGAR(zeroip);
 reset_DHCP_timeout();
 dhcp_state = STATE_DHCP_INIT;
}

 

然后是在DHCP主循环中运行DHCP_run函数,它的主要作用是进行DHCP组包,发送发现、请求等报文,对服务器的提供、响应等内容进行解析以及超时处理,这里只需要根据DHCP_run函数的返回值进行相应处理即可。DHCP_run函数内容如下:

 

uint8_t DHCP_run(void)
{
 uint8_t  type;
 uint8_t  ret;
 if(dhcp_state == STATE_DHCP_STOP) return DHCP_STOPPED;
 if(getSn_SR(DHCP_SOCKET) != SOCK_UDP)
     socket(DHCP_SOCKET, Sn_MR_UDP, DHCP_CLIENT_PORT, 0x00);
 ret = DHCP_RUNNING;
 type = parseDHCPMSG();
 switch ( dhcp_state ) {
     case STATE_DHCP_INIT     :
         DHCP_allocated_ip[0] = 0;
         DHCP_allocated_ip[1] = 0;
         DHCP_allocated_ip[2] = 0;
         DHCP_allocated_ip[3] = 0;
       send_DHCP_DISCOVER();
       dhcp_state = STATE_DHCP_DISCOVER;
       break;
   case STATE_DHCP_DISCOVER :
     if (type == DHCP_OFFER){
#ifdef _DHCP_DEBUG_
       printf(" > Receive DHCP_OFFERrn");
#endif
           DHCP_allocated_ip[0] = pDHCPMSG- >yiaddr[0];
           DHCP_allocated_ip[1] = pDHCPMSG- >yiaddr[1];
           DHCP_allocated_ip[2] = pDHCPMSG- >yiaddr[2];
           DHCP_allocated_ip[3] = pDHCPMSG- >yiaddr[3];
       send_DHCP_REQUEST();
       dhcp_state = STATE_DHCP_REQUEST;
     } else ret = check_DHCP_timeout();
         break;
   case STATE_DHCP_REQUEST :
     if (type == DHCP_ACK) {
#ifdef _DHCP_DEBUG_
       printf(" > Receive DHCP_ACKrn");
#endif
       if (check_DHCP_leasedIP()) {
         // Network info assignment from DHCP
         dhcp_ip_assign();
         reset_DHCP_timeout();
         dhcp_state = STATE_DHCP_LEASED;
       } else {
         // IP address conflict occurred
         reset_DHCP_timeout();
         dhcp_ip_conflict();
           dhcp_state = STATE_DHCP_INIT;
       }
     } else if (type == DHCP_NAK) {
#ifdef _DHCP_DEBUG_
       printf(" > Receive DHCP_NACKrn");
#endif
       reset_DHCP_timeout();
       dhcp_state = STATE_DHCP_DISCOVER;
     } else ret = check_DHCP_timeout();
   break;
   case STATE_DHCP_LEASED :
       ret = DHCP_IP_LEASED;
     if ((dhcp_lease_time != INFINITE_LEASETIME) && ((dhcp_lease_time/2) < dhcp_tick_1s)) {
       
#ifdef _DHCP_DEBUG_
         printf(" > Maintains the IP address rn");
#endif
       type = 0;
       OLD_allocated_ip[0] = DHCP_allocated_ip[0];
       OLD_allocated_ip[1] = DHCP_allocated_ip[1];
       OLD_allocated_ip[2] = DHCP_allocated_ip[2];
       OLD_allocated_ip[3] = DHCP_allocated_ip[3];
       
       DHCP_XID++;
       send_DHCP_REQUEST();
       reset_DHCP_timeout();
       dhcp_state = STATE_DHCP_REREQUEST;
     }
   break;
   case STATE_DHCP_REREQUEST :
       ret = DHCP_IP_LEASED;
     if (type == DHCP_ACK) {
       dhcp_retry_count = 0;
       if (OLD_allocated_ip[0] != DHCP_allocated_ip[0] || 
           OLD_allocated_ip[1] != DHCP_allocated_ip[1] ||
           OLD_allocated_ip[2] != DHCP_allocated_ip[2] ||
           OLD_allocated_ip[3] != DHCP_allocated_ip[3]) 
       {
         ret = DHCP_IP_CHANGED;
         dhcp_ip_update();
               #ifdef _DHCP_DEBUG_
                 printf(" >IP changed.rn");
               #endif
         
       }
         #ifdef _DHCP_DEBUG_
           else printf(" >IP is continued.rn");
         #endif                
       reset_DHCP_timeout();
       dhcp_state = STATE_DHCP_LEASED;
     } else if (type == DHCP_NAK) {
#ifdef _DHCP_DEBUG_
       printf(" > Receive DHCP_NACK, Failed to maintain iprn");
#endif
       reset_DHCP_timeout();
       dhcp_state = STATE_DHCP_DISCOVER;
     } else ret = check_DHCP_timeout();
       break;
   default :
       break;
 }
 return ret;
}

 

8 运行结果

烧录例程运行后,首先打印了PHY链路检测的结果以及DHCP日志信息,然后打印了网络地址信息,这里可以看到配置方式为DHCP,IP地址为192.168.1.117,最后是PING提示消息。

接着在PC端打开CMD,PING W55MH32的IP地址,可以正常PING通。

物联网

7 总结

本文介绍 DHCP 协议,包括其在 IP 网络自动分配参数的功能、便捷配置等特点、工作原理、报文格式和应用场景。通过 W55MH32 实战例程展示动态获取网络地址信息过程,含注册定时器中断、启用模式和获取信息等步骤,烧录后可完成检测与信息打印,PC 端能 PING 通设备。

下一篇文章将讲解如何在 W55MH32 芯片上实现 TCP 客户端模式,解析 TCP 客户端连接服务器进行回环测试的核心原理及应用,同时通过实战例程讲解具体实现步骤与要点,敬请期待!

WIZnet 是一家无晶圆厂半导体公司,成立于 1998 年。产品包括互联网处理器 iMCU™,它采用 TOE(TCP/IP 卸载引擎)技术,基于独特的专利全硬连线 TCP/IP。iMCU™面向各种应用中的嵌入式互联网设备。

WIZnet 在全球拥有 70 多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。

香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分