zoukankan      html  css  js  c++  java
  • 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.

      

  • 相关阅读:
    OnMeasureItem和OnDrawItem的区别和联系
    DockPanel 类
    C# 源码 AForge.NET
    ystem.Windows.Forms.SplitContainer : ContainerControl, ISupportInitialize
    System.Windows.Forms.Control : Component, IOleControl, IOleObject, IOleInPlaceObject, IOleInPlaceActiveObject....
    System.ComponentModel.Component : MarshalByRefObject, IComponent, IDisposable
    System.Windows.Forms.ListView : Control
    vs2013 密钥_
    系统封装 EasyBoot如何将WIN7安装版提取到光盘
    系统封装 ES3使用方法
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/8949892.html
Copyright © 2011-2022 走看看