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