WIZnet W6100-EVB-Pico DHCP 配置教程(三)

这篇具有很好参考价值的文章主要介绍了WIZnet W6100-EVB-Pico DHCP 配置教程(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

       在上一章节中我们讲了网络信息配置,那些网络信息的配置都是用户手动的去配置的,为了能跟电脑处于同一网段,且电脑能成功ping通板子,我们不仅要注意子网掩码,对于IP地址主机位和网络位的划分,而且还要注意不能跟同一网段已有IP地址的重复,对于新手和不了解网络的人来说,如何配置是件很麻烦的事,那么本章将通过DHCP协议,从dhcp服务器获取网络信息来进行配置(IPv4),直接省去了用户手动配置不知道如何配置的烦恼。

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网络通信。

为什么要使用DHCP?

        在IP网络中,每个连接Internet的设备都需要分配唯一的IP地址。DHCP使网络管理员能从中心结点监控和分配IP地址。当某台计算机移到网络中的其它位置时,能自动收到新的IP地址。DHCP实现的自动化分配IP地址不仅降低了配置和部署设备的时间,同时也降低了发生配置错误的可能性。另外DHCP服务器可以管理多个网段的配置信息,当某个网段的配置发生变化时,管理员只需要更新DHCP服务器上的相关配置即可,实现了集中化管理。

        总体来看,DHCP相比设置静态IP地址带来了如下优势:

  • 准确的IP配置:IP地址配置参数必须准确,并且在处理“ 192.168.XXX.XXX”之类的输入时,很容易出错。另外印刷错误通常很难解决,使用DHCP服务器可以最大程度地降低这种风险。
  • 减少IP地址冲突:每个连接的设备都必须有一个IP地址。但是,每个地址只能使用一次,重复的地址将导致无法连接一个或两个设备的冲突。当手动分配地址时,尤其是在存在大量仅定期连接的端点(例如移动设备)时,可能会发生这种情况。DHCP的使用可确保每个地址仅使用一次。
  • IP地址管理的自动化:如果没有DHCP,网络管理员将需要手动分配和撤消地址。跟踪哪个设备具有什么地址可能是徒劳的,因为几乎无法理解设备何时需要访问网络以及何时需要离开网络。DHCP允许将其自动化和集中化,因此网络专业人员可以从一个位置管理所有位置。
  • 高效的变更管理:DHCP的使用使更改地址,范围或端点变得非常简单。例如,组织可能希望将其IP寻址方案从一个范围更改为另一个范围。DHCP服务器配置有新信息,该信息将传播到新端点。同样,如果升级并更换了网络设备,则不需要网络配置。

        劣势:可能会导致同一设备的IP地址不固定,例如我们的服务器或者是一些设备想固定IP地址的话,这个时候就只能采取静态IP地址来配置了。

硬件准备

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

    注意:需将W6100-EVB-Pico通过RJ45网口接入到路由器(dhcp服务器)LAN口上,电脑也接入到同一路由器下(保证跟板子同一网段),路由器必须开启DHCP服务。

软件环境

  • Visual Studio Code

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

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

        我们先打开dhcpv4.h可以看到四个头函数声明,是我们要用到的:

第一个是dhcpv4初始化,传入一个socket端口号s和协议解析数据包所用的缓存buf;

第二个根据描述是让我们把它放到一个1s的定时器里,用与dhcp协议解析数据包时的计时;

第三个需要用户传入三个回调函数,用于不同状态下的回调处理;

第四个是dhcpv4运行函数,根据函数上面的描述,得知该函数是直接放到主函数循环里运行的,

这几个函数的具体实现大家可以自行了解。

/*
 * @brief DHCP client initialization (outside of the main loop)
 * @param s   - socket number
 * @param buf - buffer for processing DHCP message
 */
void DHCPv4_init(uint8_t s, uint8_t * buf);

/*
 * @brief DHCP 1s Tick Timer handler
 * @note SHOULD BE register to your system 1s Tick timer handler
 */
void DHCPv4_time_handler(void);

/*
 * @brief Register call back function
 * @param ip_assign   - callback func when IP is assigned from DHCP server first
 * @param ip_update   - callback func when IP is changed
 * @param ip_conflict - callback func when the assigned IP is conflict with others.
 */
void reg_dhcpv4_cbfunc(void(*ip_assign)(void), void(*ip_update)(void), void(*ip_conflict)(void));

/*
 * @brief DHCP client in the main loop
 * @return    The value is as the follow \n
 *            @ref DHCPV4_FAILED     \n
 *            @ref DHCPv4_runNING    \n
 *            @ref DHCP_IPV4_ASSIGN  \n
 *            @ref DHCP_IPV4_CHANGED \n
 * 			  @ref DHCP_IPV4_LEASED  \n
 *            @ref DHCPV4_STOPPED    \n
 *
 * @note This function is always called by you main task.
 */
uint8_t DHCPv4_run(void);

        然后我们打开dhcp_client.c,可以看到主函数前声明的几个函数和初始化的网络配置信息,注意其中一个元素ipmode我们选择NETINFO_DHCP_V4,即从dhcp获取IPv4等网络信息;

void dhcp_test(void);
void my_ip_conflict(void);
void my_ip_assign(void);
void network_init(void);

wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},
    .ip = {192, 168, 1, 10},
    .sn = {255, 255, 255, 0},
    .gw = {192, 168, 1, 1},
    .dns = {8, 8, 8, 8},
    .ipmode = NETINFO_DHCP_V4};
uint8_t my_dhcp_retry = 0;
uint8_t g_msec_cnt = 0;

        然后我们先看dhcp_test()函数的实现,它把DHCPv4_run()函数用一个Switch状态机去获取其返回的值(dhcp状态)并做出相应的处理,前面提到DHCPv4_run()函数是直接放主函数循环里的,因而这里dhcp_test()对其封装后直接运行在主函数的while循环里。

void dhcp_test(void)
{
    switch (DHCPv4_run())
    {
    case DHCP_IPV4_ASSIGN:
    case DHCP_IPV4_CHANGED:
        break;
    case DHCP_IPV4_LEASED:
        break;
    case DHCPV4_FAILED:
        my_dhcp_retry++;
        if (my_dhcp_retry > 5)
        {
            printf(">>DHCP %d Failed\r\n", my_dhcp_retry);
            my_dhcp_retry = 0;
            DHCPv4_stop();
            network_init();
        }
    default:
        break;
    }
}


void my_ip_conflict(void)
{
    printf("CONFLICT IP from DHCP\r\n");
    while(1);
}


void my_ip_assign(void)
{
    getIPfromDHCPv4(net_info.ip);
    getGWfromDHCPv4(net_info.gw);
    getSNfromDHCPv4(net_info.sn);
    getDNSfromDHCPv4(net_info.dns);
    net_info.ipmode = NETINFO_DHCP_V4;
    network_init();
    printf("DHCP LEASED TIME:%ld Sec.\r\n",getDHCPv4Leasetime());
}

void network_init(void)
{
    uint8_t tmpstr[6] = {0,};
    wiz_NetInfo netinfo;
    ctlnetwork(CN_SET_NETINFO,(void*)&net_info);
    ctlnetwork(CN_GET_NETINFO,(void*)&netinfo);
    ctlwizchip(CW_GET_ID,(void*)tmpstr);

    if(netinfo.ipmode == NETINFO_DHCP_V4) printf("\r\n=== %s NET CONF:DHCP ===\r\n",(char*)tmpstr);
    else printf("\r\n===%s NET CONF : Static === \r\n",(char*)tmpstr);

    printf("mac: %02X-%02X-%02X-%02X-%02X-%02X\r\n", netinfo.mac[0], netinfo.mac[1], netinfo.mac[2], netinfo.mac[3], netinfo.mac[4], netinfo.mac[5]);
    printf("ip: %d.%d.%d.%d\r\n", netinfo.ip[0], netinfo.ip[1], netinfo.ip[2], netinfo.ip[3]);
    printf("mask: %d.%d.%d.%d\r\n", netinfo.sn[0], netinfo.sn[1], netinfo.sn[2], netinfo.sn[3]);
    printf("gw: %d.%d.%d.%d\r\n", netinfo.gw[0], netinfo.gw[1], netinfo.gw[2], netinfo.gw[3]);
    printf("dns: %d.%d.%d.%d\r\n", netinfo.dns[0], netinfo.dns[1], netinfo.dns[2], netinfo.dns[3]);
}

        然后是写一个定时器调用DHCPv4_time_handler用于dhcp协议的计时;

/* Timer */
static void repeating_timer_callback(void)
{
    g_msec_cnt++;

    if (g_msec_cnt >= 1000 - 1)
    {
        g_msec_cnt = 0;

        DHCPv4_time_handler();
    }
}

最后看主函数,因为dhcp协议需要我们首先需要为它配置一个MAC地址,注意配置网络信息需要对网络锁寄存器进行解锁后才能配置。

int main()
{
    uint8_t temp;
    uint8_t databuf[2048];
    stdio_init_all();
    sleep_ms(2000);
    printf("W6100 network install example.\r\n");
    wizchip_initialize();
    /* Chip software reset. All registers are initialized. */
    wizchip_sw_reset();
    /* Determine the network lock register status. */
    if(!ctlwizchip(SYS_NET_LOCK, &temp))
    {   
        printf("unlock.\n");
        NETUNLOCK();
    }
    setSHAR(net_info.mac);
    DHCPv4_init(0,databuf);
    reg_dhcpv4_cbfunc(my_ip_assign,my_ip_assign,my_ip_conflict);
    while (true)
    {   
        dhcp_test();
        sleep_ms(100);
    }
}

步骤2:编译烧录

  1. 选择GCC arm-none-eabi编译链
  2. 选择编译项目为dhcp_client
  3. 点击生成

WIZnet W6100-EVB-Pico DHCP 配置教程(三),php,开发语言

 

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

WIZnet W6100-EVB-Pico DHCP 配置教程(三),php,开发语言

步骤3:验证测试

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

WIZnet W6100-EVB-Pico DHCP 配置教程(三),php,开发语言

 

WIZnet W6100-EVB-Pico DHCP 配置教程(三),php,开发语言

示例下载链接

链接:W6100-EVB-Pico示例

        本期内容就分享到这里啦!觉得写的还不错的话给个关注鼓励一下吧!下期我们来讲讲如何通过DNS解析百度的域名地址。文章来源地址https://www.toymoban.com/news/detail-618176.html

到了这里,关于WIZnet W6100-EVB-Pico DHCP 配置教程(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WIZnet W51000S-EVB-PICO 入门教程(一)

    W5100S-EVB-Pico 是基于树莓派RP2040和全硬件TCP/IP协议栈控制器W5100S的微控制器开发板-基本上与树莓派Pico板相同,但通过W5100S芯片增加了以太网功能。 RP2040 规格参数        双核Arm Cortex-M0 + @133MHz 264KB 高速SRAM和2MB板载内存 通过专用QSPI总线最高支持16MB的片外闪存  DMA控制器 30

    2024年02月15日
    浏览(46)
  • W5500-EVB-PICO 做TCP Server进行回环测试(六)

            上一章我们用W5500-EVB-PICO开发板做 TCP 客户端连 接服务器进行数据回环测试,那么本章将用开发板做 TCP服务器 来进行数据回环测试。         TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的传输协议,用于在计算机网络上传输数据。TC

    2024年02月13日
    浏览(40)
  • W5500-EVB-PICO进行UDP组播数据回环测试(九)

            上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试,那么本章我们进行UDP组播数据回环测试。         组播是主机间一对多的通讯模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将一份报文发送到特定的

    2024年02月11日
    浏览(36)
  • W5500-EVB-PICO作为TCP Client 进行数据回环测试(五)

            上一章我们用W5500-EVB-PICO开发板通过DNS解析www.baidu.com(百度域名)成功得到其IP地址,那么本章我们将用我们的开发板作为客户端去连接服务器,并做数据回环测试:收到服务器发送的数据,并回传给服务器。         TCP (Transmission Control Protocol) 是一种面向连

    2024年02月13日
    浏览(43)
  • W5500-EVB-PICO主动PING主机IP检测连通性(十)

            上一章我们用W5500_EVB_PICO 开发板做UDP组播数据回环测试,那么本章我们进行W5500_EVB_PICO Ping的测试。         Ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序  。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特

    2024年02月10日
    浏览(29)
  • W5500-EVB-PICO 做UDP Server进行数据回环测试(七)

            前面我们用W5500-EVB-PICO 开发板在TCP Client和TCP Server模式下,分别进行数据回环测试,本章我们将用开发板在UDP Server模式下进行数据回环测试。         UDP (User Dataqram Protocol) 是一种无连接的、不可靠的传输协议,用于在计算机网络上传输数据UDP Server是指UDP网络

    2024年02月12日
    浏览(42)
  • W5500-EVB-PICO做UDP Client进行数据回环测试(八)

            上一章我们用开发板作为UDP Server进行数据回环测试,本章我们让我们的开发板作为UDP Client进行数据回环测试。 使开发板和我们的电脑处于同一网段: 开发板通过交叉线直连主机 开发板和主机都接在路由器LAN口 网路调试工具(任意) wireshark抓包工具 我们打开例程

    2024年02月12日
    浏览(38)
  • 从零开始的PICO教程(1)Pico游戏开发项目配置

    1、大纲 经过该教程你将学会 配置好Pico游戏开发需要的环境 只有成为Pico开发者才可以发布可以在Pico上运行的游戏,所以这也是我们开始Pico开发生涯的第一步了。 1、注册 PICO 开发者帐号 你需要注册一个 PICO 开发者帐号,以便在 PICO 开发者平台管理应用。对于中国大陆地区

    2024年02月09日
    浏览(57)
  • 如何使用W5100S-EVB-Pico连接Azure物联网中心

    使用Wiznet的W5100S-EVB-Pico板以及X.509证书连接到Azure物联网中心 注:最初发表-by renakim 组成: 硬件设施: W5100S-EVB-Pico ×1 W5100S-EVB-Pico | WIZnet Document System 软件应用程序和在线服务: Azure物联网中心 详细信息: 开发环境(Window 10,Code) 关于设置开发环境的信息可以在官方文档中

    2024年02月05日
    浏览(68)
  • Pico VR眼镜(XR) Unity开发环境部署及打包教程,包含瞬间移动、转向等基本操作配置

    创建项目 我这里选择的是URP项目。URP对移动端性能比较友好,另外VR平台也不支持HDRP渲染管线。 然后进入unity工具栏-File - Build Settings 点击 Android后,点就Switch Platform将项目转为Android项目 安装依赖包 在unity的工具栏中点击Window-Package Manager,打开包管理器 如图将package来源设置

    2024年02月03日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包