|**银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801** ||| |技术支持邮件|Gingko@vip.163.com ||| |购买链接|[[https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22598974120.6.5923532fw67dqQ&id=610595120319|点击购买]]||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V0.1 |20201021 |FMJ| 初次建立 | \\ \\ \\ ===== 实验四十四:LWIP_DNS实验——域名 ===== ==== 一、 实验目的与意义 ==== - 了解DNS的作用 - 了解LWIP中DNS的使用 - 掌握以太网调试工具的使用 - 掌握KEILMDK 集成开发环境使用方法 ==== 二、 实验设备及平台 ==== - iCore4T双核心板、扩展底板; - JLINK(或相同功能)仿真器; - Micro USB线缆; - 以太网通讯线缆 - Keil MDK 开发平台; - STM32CubeMX开发平台; - TCP通讯测试工具 - Putty串口调试工具 - 装有WIN XP(及更高版本)系统的计算机。 ==== 三、 实验原理 ==== === 1、DNS简介 === * 域名系统(Domain Name System,DNS)是Internet上解决网上机器命名的一种系统。Internet上当一台主机要访问另外一台主机时,必须首先获知其地址,TCP/IP中的IP地址是由四段以“.”分开的数字组成,这种方式存在记忆不方便的问题,因此采用域名系统来管理名字和IP的对应关系。 * 域名可将一个IP地址关联到一组有意义的字符,用户访问一个网站的时候,既可以输入该网站的IP地址,也可以输入其域名。例如:微软公司的Web服务器的IP地址是207.46.230.229,其对应的域名是www.microsoft.com,不管用户在浏览器中输入的是207.46.230.229还是www.microsoft.com,都可以访问其Web网站。DNS极大地方便了人们对网站的访问。 * 本实验例程采用的LWIP 版本位1.4.1,其中包含了DNS协议,在LWIP—DHCP例程的基础上进行域名的解析。 ==== 四、 实验程序 ==== === 1. 主函数 === int main(void) { /* USER CODE BEGIN 1 */ int cnt; /* USER CODE END 1 */ /*MCU Configuration-----------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ i2c.initialize(); axp152.initialize(); axp152.set_dcdc1(3500);//[ARM & FPGA BK1/2/6 &OTHER] axp152.set_dcdc2(1200);//[FPGA INT & PLL D] axp152.set_aldo1(2500);//[FPGA PLL A] axp152.set_dcdc4(3300);//[POWER_OUTPUT] axp152.set_dcdc3(3300);//[FPGA BK4][Adjustable] axp152.set_aldo2(3300);//[FPGA BK3][Adjustable] axp152.set_dldo1(3300);//[FPGA BK7][Adjustable] axp152.set_dldo2(3300);//[FPGA BK5][Adjustable] /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ETH_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ usart2.printf("\033[1;32;40m");//设置字体终端为绿色 usart2.printf("\r\nHello, I am iCore4T!\r\n"); //串口信息输出 //LWIP初始化 while(lwip.initialize())//lwip初始化 { //ETH初始化失败 usart2.printf("\r\nETH initialize error!\r\n\r\n"); } NETMPU_Config(); eth_tcps.initialize(); usart2.initialize(115200); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if((cnt ++ / 800000) % 2){ LED_ON; }else{ LED_OFF; } lwip.periodic_handle(); key.process(); //tcp process if(eth_tcps.receive_ok_flag == 1){ eth_tcps.receive_ok_flag = 0; eth_tcps.send_data(eth_tcps.tcppcbnew); } } /* USER CODE END 3 */ } === 2.DNS测试函数(在配置LWIP的DNS功能前,需要将lwipopts.h中的LWIP_DNS宏定义,定义为1,否则无法使用DNS功能,针对编译报错的情况,需要在dns.h包含ip_addr.h和err.h))=== static void dns_test(const char *hostname) { struct ip_addr cipaddr_DNS; //获取域名信息 dns_gethostbyname(hostname,&cipaddr_DNS,NULL,NULL); //将解析到的IP转换为字符串 char *ptr = ip_ntoa(&cipaddr_DNS); usart2.printf("解析 %s 网址\r\n",hostname); usart2.printf("解析的DNS: %s\r\n",ptr); } === 3.按键处理函数 === static void process(void) { //按键处理 if(key.value != key.bak_value){ switch(key.value){ case ARM_KEY: lwip.lwip_dhcp_task();//获取DHCP信息 my_dns.dns_test("www.baidu.com");//对百度进行域名解析 break; } key.bak_value = key.value; } } ==== 五、 实验步骤 ==== - 把仿真器与iCore4T的SWD调试口相连(直接相连或者通过转接器相连); - 采用12V电源为iCore4T及底板供电; - 把iCore4T通过Micro USB线与计算机相连,便于与计算机通讯; - 把iCore4T通过以太网与路由设备连接; - 打开Keil MDK 开发环境,并打开本实验工程,并烧写程序到iCore4T上; - 通过putty打开对应串口,按下ARM按键即可获取DHCP及解析的DNS信息。 - 采用同一网络中的电脑,在浏览器中输入解析得到的IP地址,进行网页的访问。 ==== 六、 实验现象 ==== * ARM按键每按下一次,在putty将打印DHCP信息,如图所示。从图中可以看到iCore4T的DNCP信息和解析的http://www.baidu.com的IP地址。 {{ :icore4t:icore4t_arm_hal_44_1.png?direct |}} * 在浏览器上输入iCore4T解析得到的IP地址,可以进入百度的首页。 {{ :icore4t:icore4t_arm_hal_44_2.png?direct |}}