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 ...
随机推荐
- MySQL-重做日志 redo log -原理
[redo log buffer][redo log file]-原理 目录: 1.重做日志写入过程图 2.相关知识点汇总图 3.redo_log_buffer 原理 4.redo_log_file ...
- Pandas标记删除重复记录
Pandas提供了duplicated.Index.duplicated.drop_duplicates函数来标记及删除重复记录 duplicated函数用于标记Series中的值.DataFrame ...
- Linux 配置 SSL 证书
完整的 SSL 证书分为四个部分: CA 根证书 (root CA) 中级证书 (Intermediate Certificate) 域名证书 证书密钥 (仅由您持有) 以 COMODO Positi ...
- freemarker 异常处理
SSH2处理方案: freemarker文件如果出错,网站的前台页面会报出很明显的错误-焦黄的背景,血红的文字,很不利于用户体验的.如何修改这个问题呢?首先需要在struts.xml配置文件里添加下面 ...
- eclipse设置高亮显示的颜色
设置高亮显示的颜色:Window-->preferences-->General-->Editors-->Text Editors-->Annotations--> ...
- mysql删除重复记录
Solution 1: Add Unique Index on your table: ALTER IGNORE TABLE `TableA` ADD UNIQUE INDEX (`member_id ...
- 【P2514】工厂选址(贪心)
看到题了不首先应该看看数据范围确定一下算法么,这个题的数据范围大约可以支持到O(nmlogm),所以肯定不是搜索什么的,DP貌似至少也要n^2m,所以可以想一些其他的.对于题目的输入,我们发现这些输入 ...
- 【P2476】着色方案(记忆化搜索+特殊的DP数组)
这个题代码难度几乎为0,然而思维难度对于蒟蒻来说简直是突破天际啊!首先我思考的是这个油漆的种类只有15种,是不是可以像一道叫做8数码难题的东西暴力15维数组呢..计算发现不可以....空间会直接让你学 ...
- 泛型学习第一天:List与IList的区别 (三)
已经有很多人讨论过IList和List的区别,恩,我也赞同其中的一些观点,其实他们二者也是有优有劣的,看你着重用在哪个方面,先贴一下我赞同的意见,基本上也都是网友们总结的. 首先IList 泛型接口是 ...
- 使用roboware创建工作空间
1.打开终端,启动roboware软件: $roboware-studio 2.在欢迎使用的页面点新建工作区,工作区的名字建议写为:catkin_ws,路径放在home文件夹或者任意你想放的文件夹中. ...