当前位置:   article > 正文

WIZnet W5100S-EVB-Pico DHCP 配置教程(三)_w5100s使用教程

w5100s使用教程

DHCP协议介绍

什么是DHCP?

        动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用户IP地址进行动态管理和配置。

        DHCP于1993年10月成为标准协议,其前身是BOOTP协议。DHCP协议由RFC 2131定义,采用客户端/服务器通信模式,由客户端(DHCP Client)向服务器(DHCP Server)提出配置申请,DHCP Server基于请求的客户端(DHCP Client)的mac地址为它动态分配IP地址、子网掩码、默认网关地址,域名服务器(DNS)地址和其他相关配置参数,以便可以与其他IP网络通信。

        与静态IP地址相反的,而关于静态IP和动态IP地址一直以来都是网络技术人员们热议的话题,动态IP地址是一个不断变化的地址,若是要创建动态IP地址,网络必须配置并运行DHCP服务器。DHCP服务器为连接到网络的所有设备分配了一个空闲的IP地址。DHCP是一种向物理网络上的网络设备自动分配动态IP地址的方法,它能自动为网络设备分配或更新IP地址,以及其他配置信息。

        静态IP地址允许网络设备始终保持相同的IP地址,网络管理员必须跟踪每个静态分配的设备,从而避免再次使用该IP地址。由于静态IP地址需要手动配置,因此若是对TCP/IP协议不太了解,则可能会出现网络问题。

        DHCP是用于自动分配IP地址的协议,对网络管理员来说是非常有利的,因为它能避免网络上的每台设备分配多个IP地址(也就是重复分配IP地址)。通常配置可能只需要一分钟,但是当您配置数百个网络设备时,确实比较麻烦。当网络中接入无线接入点时可利用DHCP自动获取动态IP地址,无需再做配置。对于无线接入点,PoE交换机通常可支持用户定义进行动态绑定,为连接在一起的各个设备分配IP地址。此外,相对于静态IP地址而言,DHCP维护较少且便宜,对于用户而言具备吸引力

动态ip优点

1、成本低。由于静态IP数量有限,所以价格相对而言高一些。由于动态ip可以循环使用,所以使用动态IP更加经济。

2、自动配置。使用动态IP地址,服务器会自动为设备分配可用的IP地址,非常适合家庭使用。

3、更安全。每一次用户登录都会为设备分配一个新的IP地址,相对而言比较安全。

动态ip缺点

1、不太准确的地理定位。很难找到设备的准确位置,因为动态ip地址会变化。

2、限制远程访问。如果您使用动态IP地址,您的程序可能无法连接。

硬件准备

  • W5500-EVB-Pico开发板
  • 网线
  • Micro USB数据线

    注意:需将W5500-EVB-Pico通过RJ45网口接入到路由器上,电脑也接入到同一路由器下。路由器必须开启DHCP服务

软件环境

  • Visual Studio Code

W5100S-EVB-Pico使用DHCP协议获取IP地址

步骤1:找到dhcp_client示例程序并打开

主要引用到dhcp.h中的几个函数

void DHCP_init(uint8_t s, uint8_t * buf);
void DHCP_time_handler(void);
uint8_t DHCP_run(void);
void reg_dhcp_cbfunc(void(*ip_assign)(void), void(*ip_update)(void), void(*ip_conflict)(void));

  • 1
  • 2
  • 3
  • 4
  • 5

修改网络信息结构体内容,将.dhcp的内容改为NETINFO_DHCP

uint8_t wizchip_version = 0x00;
    wiz_NetInfo net_info = {
        .mac = {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e},
        .ip = {192, 168, 1, 235},
        .sn = {255, 255, 255, 0},
        .gw = {192, 168, 1, 1},
        .dhcp = NETINFO_DHCP                      // DHCP enable/disable
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

定时器函数

bool repeating_timer_callback(struct repeating_timer *t) {
    DHCP_time_handler();
    return true;
}
  • 1
  • 2
  • 3
  • 4

DHCP运行函数

int main()
{
    /* Initialize */
    uint8_t retval = 0;
    uint8_t dhcp_retry = 0;
    stdio_init_all();
    gpio_config();
    // Enable SPI 0 at 8 MHz and co,nnect to GPIOs
    spi_init(SIP_ID, 8 * 1000 * 1000);
     struct repeating_timer timer;
    add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer);
   wizchip_version = getVER();
        printf("wizchip_version = %02X\r\n", wizchip_version);
        sleep_ms(1000);
       if (net_info.dhcp == NETINFO_DHCP) // DHCP
    {
        wizchip_dhcp_init();
    }
   else // static
    {
        wizchip_setnetinfo(&net_info); // apply from DHCP
        printf("mac: %02X%02X%02X%02X%02X%02X\r\n", net_info.mac[0], net_info.mac[1], net_info.mac[2], net_info.mac[3], net_info.mac[4], net_info.mac[5]);
        printf("ip: %d.%d.%d.%d\r\n", net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3]);
        printf("mask: %d.%d.%d.%d\r\n", net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3]);
        printf("gw: %d.%d.%d.%d\r\n", net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3]);
    }
 
    while (1)
    {
       
          if (net_info.dhcp == NETINFO_DHCP)
        {
            retval = DHCP_run();
 
            if (retval == DHCP_IP_LEASED)
            {
                if (g_dhcp_get_ip_flag == 0)
                {
                    printf(" DHCP success\n");
 
                    g_dhcp_get_ip_flag = 1;
                }
            }
            else if (retval == DHCP_FAILED)
            {
                g_dhcp_get_ip_flag = 0;
                dhcp_retry++;
 
                if (dhcp_retry <= DHCP_RETRY_COUNT)
                {
                    printf(" DHCP timeout occurred and retry %d\n", dhcp_retry);
                }
            }
            if (dhcp_retry > DHCP_RETRY_COUNT)
            {
                printf(" DHCP failed\n");
                DHCP_stop();
                while (1)                   ;
            }
 
             wiz_delay_ms(1000); // wait for 1 second
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

IP地址请求和更新回调函数

static void wizchip_dhcp_assign(void)
{
    getIPfromDHCP(net_info.ip);
    getGWfromDHCP(net_info.gw);
    getSNfromDHCP(net_info.sn);
    getDNSfromDHCP(net_info.dns);
 
    net_info.dhcp = NETINFO_DHCP;
 
    /* Network initialize */
    wizchip_setnetinfo(&net_info); // apply from DHCP
    printf("mac: %02X%02X%02X%02X%02X%02X\r\n", net_info.mac[0], net_info.mac[1], net_info.mac[2], net_info.mac[3], net_info.mac[4], net_info.mac[5]);
    printf("ip: %d.%d.%d.%d\r\n", net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3]);
    printf("mask: %d.%d.%d.%d\r\n", net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3]);
    printf("gw: %d.%d.%d.%d\r\n", net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3]);
    printf(" DHCP leased time : %ld seconds\n", getDHCPLeasetime());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

步骤2:编译烧录

        选择编译器,选择编译项目为dhcp_client,点击Build进行编译

        编译之后,按住boot按钮把开发板连接到电脑上,此时电脑将开发板识别为大容量存储器,我们将build/examples/dhcp_client文件夹下面的uf2文件拖入开发板的大容量存储器中,就烧录好了。

步骤3:验证测试

        此时串口会打印获取到的IP地址信息,我们也能直接ping通获取到的IP地址

 

示例下载链接 

例程下载WIZnet-EVB-PICO资源

本期内容到此结束,谢谢大家的观看,下期我们将对W5100S-EVB-PICO解析域名这一知识点进行讲解。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/659566
推荐阅读
相关标签
  

闽ICP备14008679号