|**银杏科技有限公司旗下技术文档发布平台**  ||||
|技术支持电话|**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 |}}