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 = 0;
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>>24 & 0xFF),
            (uint8_t)(ip>>16 & 0xFF),
            (uint8_t)(ip>>8  & 0xFF),
            (uint8_t)(ip>>0  & 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[4];
UINT        buffer_size = 4;
ULONG       *dns_server_ptr;
UINT        wait = 0;
UINT        wait_limit;
char    ip_string[20] = {0};

      /* 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
", 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
");
        }
#endif
    /* Wait for the flag that the Client is Bound is set. */
    wait = 0;
    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(100);

        /* Update how long we've waited */
        wait += 100;
    }

    /* 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.
");
        }
#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. 
",(unsigned int)client_address);
                xp_str_ip(ip_string, client_address);
                printf("DHCP Client address is:%s
",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, 3* 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.
", (unsigned int)server_address);
                xp_str_ip(ip_string, server_address);
                printf("DHCP Server address is:%s
",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.
");
                }
#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...
");
    }
#endif

    /* Some time later.... */
    tx_thread_sleep(100);

    /* 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...
");
    }
#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
", 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 = 0;
        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.
");
            }
#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, 3* 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.
");
                    }
#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.
");
                }
#endif
            }
        }
#ifdef SEMI_HOSTING
        if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
        {
            /* Debugger is connected */
            printf("Stopping the DHCP Client.
");
        }
#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.
", error_counter);
    }
#endif

    /* Return a status value based on any errors encountered. */
    if (error_counter == 0)
    {
        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 = 0;
    UINT status;

    /* Wait for the IP stack and network hardware
     * to get initialized.
     */
    tx_thread_sleep(3 *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 0 errors.

  

原文地址:https://www.cnblogs.com/jiangzhaowei/p/8949892.html