ETHNET DHCP的两种方式
DHCP API:
nx_dhcp_create
nx_dhcp_start
nx_dhcp_stop
nx_dhcp_delete
nx_ip_address_get //客户端IP获取
nx_dhcp_server_address_get //DHCP SERVER
nx_icmp_ping //ping命令
nx_dhcp_reinitialize
nx_dns_host_by_name_get //通过域名获取IP
1、注意复位PIN:

2、SSP设置如下:

3、测试:
#include "dhcp_thread.h" /* Define the function to call for running a DHCP session. */
UINT run_dhcp_client_session(NX_DHCP *client_ptr, NX_IP *ip_ptr); /* If define, debug output sent to Renesas Virtual Console */
#define SEMI_HOSTING /* Define the wait limit for getting assigned an IP address.
* NX_IP_PERIODIC_RATE is defined internally in NetX for converting
* seconds to timer ticks. This timeout is defined for 2 seconds.
*/
#define WAIT_TO_BE_BOUND (10*NX_IP_PERIODIC_RATE) /* Define error status returns */
#define DHCP_RUN_ERRORS 0x1001
#define DHCP_START_ERROR 0x1002 /* If semi hosting is defined, define the debug output
* method using printf.
*/
#ifdef SEMI_HOSTING
#include "stdio.h"
#ifdef __GNUC__
extern void initialise_monitor_handles(void);
#endif
#endif /* Define some global variables. */
static UINT error_counter = ;
static UINT is_bound = NX_FALSE; /* Declare the DHCP Client state change callback. */
static VOID my_notify_callback(NX_DHCP *dhcp_ptr, UCHAR new_state); char * xp_str_ip(char * x, uint32_t ip)
{
sprintf(x, "%u.%u.%u.%u",
(uint8_t)(ip>> & 0xFF),
(uint8_t)(ip>> & 0xFF),
(uint8_t)(ip>> & 0xFF),
(uint8_t)(ip>> & 0xFF)); return x;
} /**
* This function runs a DHCP Client session.
* client_ptr; pointer to an NX_DHCP instance, an already created DHCP Client instance
* ip_ptr; pointer to an NX_IP instance, an already created IP instance
* If successful return NX_SUCCESS (0x0); else return DHCP_RUN_ERRORS error status.
*/
UINT run_dhcp_client_session(NX_DHCP *client_ptr, NX_IP *ip_ptr)
{ UINT status;
NX_PACKET *my_packet;
ULONG server_address;
ULONG client_address;
ULONG network_mask;
UCHAR buffer[];
UINT buffer_size = ;
ULONG *dns_server_ptr;
UINT wait = ;
UINT wait_limit;
char ip_string[] = {}; /* Initialize the debug output utility. */
#ifdef SEMI_HOSTING
#ifdef __GNUC__
initialise_monitor_handles();
#endif
#endif /* Register a DHCP state change callback function. */
status = nx_dhcp_state_change_notify(client_ptr, my_notify_callback); //方式一:阻塞的方式等待DHCP if (status)
error_counter++; /* Now we're ready to start the DHCP Client. */
status = nx_dhcp_start(client_ptr); /* Check the status. */
if (status)
{
error_counter++; #ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("Aborting DHCP Client. Failed DHCP start 0x%x\n", status);
}
#endif
/* Internal DHCP error or NetX internal error. We cannot continue this demo test. */
nx_dhcp_delete(client_ptr); return DHCP_START_ERROR;
} #ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("DHCP Client is running\n");
}
#endif
/* Wait for the flag that the Client is Bound is set. */
wait = ;
wait_limit = WAIT_TO_BE_BOUND; while(wait < wait_limit)
{ /* If the is_bound flag is set, we have a valid IP address */
if (is_bound == NX_TRUE)
break; /* Not bound yet. Let other application threads run. */
tx_thread_sleep(); /* Update how long we've waited */
wait += ;
} /* Check if Client is bound to an IP address. */
if (is_bound)
{
#ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("DHCP Client is assigned an IP address lease.\n");
}
#endif /* It is. Get the client IP address from this NetX service. */
status = nx_ip_address_get(ip_ptr, &client_address, &network_mask); /* Check for errors. */
if (status)
error_counter++;
else
{
#ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("DHCP Client address is 0x%x. \n",(unsigned int)client_address);
xp_str_ip(ip_string, client_address);
printf("DHCP Client address is:%s\n",ip_string);
}
#endif
} /* Get the DHCP Server IP address. */
status = nx_dhcp_server_address_get(client_ptr, &server_address); /* Check for errors. */
if (status)
{
error_counter++;
}
else
{
/* Check that the device is able to send and receive packets with this IP address. */
status = nx_icmp_ping(ip_ptr, server_address, "Hello World", sizeof("Hello World"), &my_packet, * NX_IP_PERIODIC_RATE); #ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("DHCP Server IP address is 0%x.\n", (unsigned int)server_address);
xp_str_ip(ip_string, server_address);
printf("DHCP Server address is:%s\n",ip_string);
}
#endif /* Check status. */
if (status)
/* No valid ICMP packet received (no packet to release). Update the error counter. */
error_counter++;
else
{
#ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("Successfully pinged Server.\n");
}
#endif
/* Release the echo response packet when we are done with it. */
nx_packet_release(my_packet);
}
}
} /* Stop the DHCP Client. The application can still send and receive network packets. */
status = nx_dhcp_stop(client_ptr); if (status)
error_counter++; /* Prepare the DHCP Client to restart. We can still send and receive
* packets except broadcast packets, but with a source IP address
* of zero, is not very useful except for DHCP. */
status = nx_dhcp_reinitialize(client_ptr); if (status)
error_counter++; #ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("DHCP Client is reinitializing...\n");
}
#endif /* Some time later.... */
tx_thread_sleep(); /* Clear our previous DHCP session flag. */
is_bound = NX_FALSE; /* Restart the DHCP Client thread task. */
status = nx_dhcp_start(client_ptr); #ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("DHCP Client is restarted...\n");
}
#endif /* Check status. */
if (status)
{
/* Update the error count. */
error_counter++; #ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("Aborting DHCP Client. Failed 2nd DHCP start 0x%x\n", status);
}
#endif
/* Internal DHCP error or NetX internal error. We cannot continue this demo test. */
nx_dhcp_delete(client_ptr);
}
else
{
/* This time we'll poll the IP instance directly for a valid IP address. */
wait = ;
do
{
UINT actual_status; /* Check for address resolution. */
status = nx_ip_status_check(ip_ptr, NX_IP_ADDRESS_RESOLVED, (ULONG *) &actual_status, NX_IP_PERIODIC_RATE); //方式二:查询方式等待DHCP /* Check status. */
if (status)
{
/* wait a bit. */
tx_thread_sleep(NX_IP_PERIODIC_RATE); wait += NX_IP_PERIODIC_RATE;
if (wait >= wait_limit)
{
break;
}
} } while (status != NX_SUCCESS); /* Check if we have a valid address. */
if (status == NX_SUCCESS)
{ #ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("DHCP Client is assigned IP address lease for a second time.\n");
}
#endif
/* We do. This time, query the DHCP Client for the DNS Server address. */
status = nx_dhcp_user_option_retrieve(client_ptr, NX_DHCP_OPTION_DNS_SVR, buffer, &buffer_size); /* Check status. */
if (status)
error_counter++;
else
{
dns_server_ptr = (ULONG *)(buffer); /* Send a ping request to the DNS server. */
status = nx_icmp_ping(ip_ptr, *dns_server_ptr, "Hello DNS Server", sizeof("Hello DNS Server"), &my_packet, * NX_IP_PERIODIC_RATE); /* No valid ICMP packet received (no packet to release). Update the error counter. */
if (status)
error_counter++;
else
{
#ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("Successfully pinged Server.\n");
}
#endif
/* Release the echo response packet when we are done with it. */
nx_packet_release(my_packet);
}
} /* We're done with the DHCP Client. */ /* Release the IP address back to the Server. This application should not
send or receive packets with this IP address now. */
status = nx_dhcp_release(client_ptr);
if (status)
error_counter++;
else
{
#ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("Released IP address back to Server.\n");
}
#endif
}
}
#ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("Stopping the DHCP Client.\n");
}
#endif /* Stop the DHCP Client and unbind the DHCP UDP socket.*/
status = nx_dhcp_stop(client_ptr); if (status)
error_counter++; } /* All done. Delete the Client and release resources to NetX and ThreadX. */
status = nx_dhcp_delete(client_ptr); if (status)
error_counter++; #ifdef SEMI_HOSTING
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
{
/* Debugger is connected */
printf("DHCP Client demo has completed with %d errors.\n", error_counter);
}
#endif /* Return a status value based on any errors encountered. */
if (error_counter == )
{
return NX_SUCCESS;
}
else
{ return DHCP_RUN_ERRORS;
}
} /**
* This function defines a user callback for DHCP Client to notify
* when there is a DHCP state change.
* NX_DHCP *client_ptr; previously created DHCP Client instance
* UCHAR state; 2 byte numeric representation of DHCP state
* void
*
* In this callback, we only check if the DHCP
* Client has changed to the bound state (has a valid IP
* address) and we set a flag for the application to check.
*/
VOID my_notify_callback(NX_DHCP *dhcp_ptr, UCHAR state)
{ UINT new_state = (UINT)state; NX_PARAMETER_NOT_USED(dhcp_ptr); /* Check if we have transitioned to the bound state
(have a valid IP address). */
if (new_state == NX_DHCP_STATE_BOUND)
{
/* We have. Set the flag for the application. */
is_bound = NX_TRUE;
}
} /* Define the application thread. */
void dhcp_thread_entry(void)
{ UINT error_counter = ;
UINT status; /* Wait for the IP stack and network hardware
* to get initialized.
*/
tx_thread_sleep( *NX_IP_PERIODIC_RATE); /* Start and run a brief DHCP Client session. */
status = run_dhcp_client_session(&g_dhcp_client0, &g_ip0); /* Check for successful result. */
if (status)
error_counter++;
}
4、调试信息如下:
DHCP Client is running
DHCP Client is assigned an IP address lease.
DHCP Client address is 0xc0a81f7d.
DHCP Client address is:192.168.31.125
DHCP Server IP address is 0c0a81f01.
DHCP Server address is:192.168.31.1
Successfully pinged Server.
DHCP Client is reinitializing...
DHCP Client is restarted...
DHCP Client is assigned IP address lease for a second time.
Successfully pinged Server.
Released IP address back to Server.
Stopping the DHCP Client.
DHCP Client demo has completed with errors.
ETHNET DHCP的两种方式的更多相关文章
- 自学Linux Shell9.2-基于Red Hat系统工具包存在两种方式之一:RPM包
点击返回 自学Linux命令行与Shell脚本之路 9.2-基于Red Hat系统工具包存在两种方式之一:RPM包 本节主要介绍基于Red Had的系统(测试系统centos) 1. 工具包存在两种方 ...
- 两种方式测试 GNS3 环境
GNS3已经部署好了,怎么测试环境呢?两种方式,一是使用自带的VPC连接交换机互联互通,二是配合VMware连接GNS3中的交换机互联互通. 自带 VPC 测试 使用两台VPC与一台二层交换机相连,测 ...
- Struts2实现ajax的两种方式
基于Struts2框架下实现Ajax有两种方式,第一种是原声的方式,另外一种是struts2自带的一个插件. js部分调用方式是一样的: JS代码: function testAjax() { var ...
- CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking)
CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking) 我在(Modern OpenGL用Shader拾取 ...
- 两种方式实现java生成Excel
Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...
- Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)
Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...
- 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...
- (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步
最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
随机推荐
- poj 3617输出格式问题
注意是说的80个字母一行....
- 大话设计模式之PHP篇 - 适配器模式
定义将一个类的接口转换成客户希望的另外一个接口,使用原本不兼容的而不能在一起工作的那些类可以在一起工作. 角色Target适配目标,该角色定义把其他类转换为何种接口,也就是我们的期望接口.Adapte ...
- Java Hibernate 5.3.x
SchemeExport Hibernate根据实体类和实体类映射文件自动生成表结构. 示例代码: <?xml version='1.0' encoding='utf-8'?> <! ...
- jstl标签 c:if和c:choose
<c:if test="${test == null}">test为null</c:if> 其意思是,如果test 为 null,那么就打印 “test为n ...
- dfs枚举
深度优先搜索(DFS,Depth-First Search)是搜索手段之一.它从某个状态开始,不断的转移状态知道无法转移,然后退回到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解. ...
- 进程【TLCL】
ps命令 ps x 加上 "x" 选项(注意没有开头的 "-" 字符),告诉 ps 命令,展示所有进程,不管它们由什么 终端(如果有的话)控制. 在 TTY 一 ...
- 51nod 1060 最复杂的数 反素数
1060 最复杂的数 基准时间限制:1 秒 空间限制:131072 KB 把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数. 例如:12的约数为:1 2 3 4 6 ...
- javascript的宿主环境
关于javascript语言,最有意思的是它必须要在一个宿主环境中运行,其中受欢迎的宿主环境当然就是浏览器了,但这并不是我们唯一的选择, javascript完全可以运行在服务器端,桌面以及富媒体环境 ...
- javascript删除JSON元素
首先要搞清JSON的数据格式,我这里所说的JSON都是指javascript中的. JSON数据是由对象和数组数据结构组成,我们只要学会javascript中对对象和数组的删除方法即可对JSON项进行 ...
- Codeforces 938E Max History:排列 + 逆元【考虑单个元素的贡献】
题目链接:http://codeforces.com/problemset/problem/938/E 题意: 定义f(a): 初始时f(a) = 0, M = 1. 枚举i = 2 to n,如果a ...