建设商务网站的经济可行性分析,wordpress连接微博专业版 下载,互联网品牌营销公司,公司网站架构前言 在上一章节中我们讲了网络信息配置#xff0c;那些网络信息的配置都是用户手动的去配置的#xff0c;为了能跟电脑处于同一网段#xff0c;且电脑能成功ping通板子#xff0c;我们不仅要注意子网掩码#xff0c;对于IP地址主机位和网络位的划分#xff0c;而且还要注…
前言 在上一章节中我们讲了网络信息配置那些网络信息的配置都是用户手动的去配置的为了能跟电脑处于同一网段且电脑能成功ping通板子我们不仅要注意子网掩码对于IP地址主机位和网络位的划分而且还要注意不能跟同一网段已有IP地址的重复对于新手和不了解网络的人来说如何配置是件很麻烦的事那么本章将通过DHCP协议从dhcp服务器获取网络信息来进行配置IPv4直接省去了用户手动配置不知道如何配置的烦恼。
DHCP协议介绍
什么是DHCP 动态主机配置协议DHCPDynamic 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服务器上电脑也接入到同一路由器下保证跟板子同一网段路由器必须开启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编译烧录
选择GCC arm-none-eabi编译链选择编译项目为dhcp_client点击Build进行编译 编译之后按住boot按钮把开发板连接到电脑上也可以连接后按住boot键再按下run复位上电此时电脑将开发板识别为大容量存储器我们将build/examples/dhcp_client文件夹下面的uf2文件拖入开发板的大容量存储器中就烧录好了。 步骤3验证测试 此时串口会打印获取到的IP地址信息我们也能直接ping通获取到的IP地址 示例下载链接
链接W6100-EVB-Pico示例 本期内容就分享到这里啦觉得写的还不错的话给个关注鼓励一下吧下期我们来讲讲如何通过DNS解析百度的域名地址。