W6100-EVB-PICO做DNS Client进行域名解析
前言
在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址(网关,子网掩码,dns服务器)等信息,给我们的开发板配置网络信息,成功的接入网络中,那么本章将教大家如何让我们的开发板进行DNS域名解析,通过请求DNS服务器可以对一网络域名进行解析后获得其ip地址。
什么是DNS,有何用途?
DNS即域名系统(Domain Name System),我们知道设备想要接入互联网上进行通信的都需要一个ip地址,我们访问一个服务器也需要知道它的ip地址,但是如果通过输入ip进行访问,那么IPv4地址是32位二进制数,纵使每8位用 “.” 划分并转换为十进制,记起来也很是麻烦,更别说IPv6了;况且并不是所有的网站的ip都是独立ip,很多是共享ip,即一个ip绑定多个网站,直接输入ip访问的话服务器不知道客户端要访问该ip绑定下的具体哪个网站。通过dns很好的解决了这些问题,我们可以通过直接输入域名然后通过dns解析获得ip,服务器根据域名映射识别后,即可访问该域名对应的网站,通俗说就是域名是相当于网站的比较好记一点的名字;况且解析方式不仅可以正向解析(域名解析出ip),还可以反向解析(ip解析出域名)。
通过dns解析,我们的开发板可直接通过其域名对其进行访问。
软硬件准备:
软件:VS code(须具有相应开发环境,具体参考第一章)
硬件;W6100-EVB-PICO开发板,网线,micro USB 数据线,路由器(可上网)
通过使用DNS协议解析百度域名
1.相关代码:
我们先找到dns.h头文件下面看下,可以看到几个函数声明,我们需要用到如下所示几个函数:
DNS_init,要我们传入dns信息的接收缓存buff地址;DNS_run根据这个函数描述,需要我们传入一个socket端口号,dns服务器ip,请求解析的域名,解析后ip存放的地址,以及模式(IPv4或IPv6);DNS_time_handler是1s定时器的处理程序,我们要把它放在一个定时器里,每到1秒调用1次,做dns解析时的计时操作,以判断是否超时,并做相应处理。
/** @brief DNS process initialize* @param s : Socket number for DNS* @param buf : Buffer for DNS message*/
void DNS_init(uint8_t * buf);/** @brief DNS process* @details Send DNS query and receive DNS response* @param dns_ip : DNS server ip* @param name : Domain name to be queryed* @param ip_from_dns : IP address from DNS server* @return -1 : failed. @ref MAX_DOMIN_NAME is too small \n* 0 : failed (Timeout or Parse error)\n* 1 : success* @note This funtion blocks until success or fail. max time = @ref MAX_DNS_RETRY * @ref DNS_WAIT_TIME*/
int8_t DNS_run(uint8_t s,uint8_t * dns_ip, uint8_t * name, uint8_t * ip_from_dns,uint8_t mode);/** @brief DNS 1s Tick Timer handler* @note SHOULD BE register to your system 1s Tick timer handler*/
void DNS_time_handler(void);
然后我们打开dns_client.c,可以看到先初始化网络信息和所需要的解析域名,这里以百度(www.baidu.com)为例,然后与上一章的dhcp类似,都是将函数封装好,然后声明后直接在主程序里调用。如下所示。
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)void network_init(void);
int dns_test(void);
bool repeating_timer_callback(struct repeating_timer *t);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},.dhcp = NETINFO_STATIC};
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,};
uint8_t DNS_2nd[4] = {114,114,114,114};
uint8_t Domain_name[] = "www.baidu.com";
uint8_t Domain_IP[4] = {0,};
uint8_t g_msec_cnt = 0;
我们简单看下声明的这三个函数的具体实现,如下所示:network_init是配置网络信息并用串口打印回显方便观察;dns_test通过调用DNS_run根据其返回的状态做出相应处理,如果dns服务器解析超时或失败就用备用的,如果解析成功就打印出域名解析后的对应ip;然后把定时器处理程序放在定时器回调里,定时1秒,每秒调用一次。
void network_init(void)
{uint8_t temp;wizchip_initialize();printf("W6100 dns test example.\r\n");sleep_ms(2000);/* Determine the network lock register status */if(!ctlwizchip(SYS_NET_LOCK, &temp)){ printf("unlock.\n");NETUNLOCK();}wizchip_setnetinfo(&static_info);print_net_info(&net_info);sleep_ms(2000);
}int dns_test(void)
{int ret;printf("\r\n===== DNS Client Example =====\r\n");printf("> DNS 1st: %d.%d.%d.%d\r\n",net_info.dns[0],net_info.dns[1],net_info.dns[2],net_info.dns[3]);printf("> DNS 2nd: %d.%d.%d.%d\r\n",DNS_2nd[0],DNS_2nd[1],DNS_2nd[2],DNS_2nd[3]);printf("==============================\r\n");printf("> Example Domain Name : %s\r\n",Domain_name);if((ret = DNS_run(SOCKET_ID, net_info.dns, Domain_name, Domain_IP, AS_IPV4)) > 0){printf("> 1st DNS Reponsed\r\n");}else if((ret != -1) && ((ret = DNS_run(SOCKET_ID, DNS_2nd, Domain_name, Domain_IP, AS_IPV4)) > 0)){printf("> 2nd DNS Responsed\r\n");}else if(ret == -1){printf("> MAX_DOMAIN_NAME is too small. Should be redefined it. \r\n");}else{printf("> DNS Failed\r\n");}if(ret > 0){printf("> Translated %s to %d.%d.%d.%d\r\n",Domain_name,Domain_IP[0],Domain_IP[1],Domain_IP[2],Domain_IP[3]);return 1;}return 0;
}/* Timer */
bool repeating_timer_callback(struct repeating_timer *t)
{DNS_time_handler();return true;
}
主程序就是先初始化所有配置,启动定时器,然后运行dns即可,成功就停止(进入while死循环),不成功就继续执行。
2.编译烧录
编译后,打开build下对应的文件夹里找到uf2文件;然后开发板按下BOOTSEL键复位上电进入程序下载模式,此时我们的电脑会检测到一个名为RPI-RP2的u盘,把uf2文件拖入即可完成烧录,如下所示:



3.测试现象
程序下载到我们的开发板后,打开串口监视器,波特率默认为115200,我们可以看到通过dns我们成功解析出了百度(www.baidu.com)的IP地址。如下图所示:

相关代码链接
W6100-EVB-PICO相关例程
https://gitee.com/wiznet-hk/example-of-w6100-evb-pico.git
相关文章:
W6100-EVB-PICO做DNS Client进行域名解析
前言 在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址(网关,子网掩码,dns服务器)等信息,给我们的开发板配置网络信息,成功的接入网络中,那么本章将教大家如何让我们的开发板进行DNS域名解…...
【linux-网络】4层转发方法-iptable以及nginx
1.背景 有时候远程或者某些业务需要做转发就会用到iptables或者nginx,或者ss都可以 根据自己的情况去适配。 2.方法: 1)iptables -把linux内核转发功能打开 echo "net.ipv4.ip_forward1" >> /etc/sysctl.conf -出入转发…...
vue复制文案,复制图片,黏贴图片
vue 实现复制文案,复制图片,在微信聊天框,黏贴为图片 //安装 cnpm i clipboard-all //引用 import clipboard from clipboard-all<!-- row.url 图片路径 --><div ref"foo" class"hidden"><img :src"…...
Web应急思路
Web应急思路 找到webshell --> 确定攻击者IP --> 回溯攻击者操作 --> 梳理整个攻击过程 1.寻找webshell方法 1.文件内容中的恶意函数 2.web日志中的webshell特征 3.贴合web业务中的URL来分析web日志 4.源码版本管理对比,注重修改或新增的脚本文件 5.统计…...
shell脚本清理redis模糊匹配的多个key,并计算释放内存大小
#!/bin/bash# 定义Redis服务器地址和端口 REDIS_HOST"localhost" REDIS_PORT6380# 获取Redis当前内存使用量(以字节为单位) function get_redis_memory_usage() {redis-cli -h $REDIS_HOST -p $REDIS_PORT INFO memory | grep "used_memo…...
python-MySQL数据库建表语句(需要连接数据库)转存为Excel文档-工作小记
将create table XXXXXX 转为指定Excel文档。该脚本适用于数据库表结构本地文档记录 呈现效果 代码 # -*- coding:utf-8 -*- # Time : 2023/8/2 15:14 # Author: 水兵没月 # File : MySQL建表_2_excel.py import reimport mysql.connector import pandas as pd db 库名 mydb …...
iOS Block介绍
文章目录 一、Block定义二、block为什么用copy修饰三、block使用时的注意事项四、使用 block时什么情况会发生引用循环,如何解决?五、在block内如何修改block外部变量?六、__block与__weak的区别 一、Block定义 目的就是能够直接存储一个代码…...
小程序安全性加固:如何保护用户数据和防止恶意攻击
第一章:引言 在当今数字化时代,移动应用程序的使用已经成为人们日常生活中的重要组成部分。小程序作为一种轻量级的应用程序形式,受到了广泛的欢迎。然而,随着小程序的流行,安全性问题也日益凸显。用户数据泄露和恶意攻…...
Ubuntu的tar命令详解
在 Ubuntu 中压缩文件夹可以使用 tar 命令。tar 可以将多个文件或文件夹打成一个包,并可选是否进行压缩,最常用的压缩方式是 gzip 和 bzip2。 常用的 tar 命令参数如下: -c:创建新的 tar 包; -x:解压 tar…...
使用elementplus实现文本框的粘贴复制
需求: 文本框仅用于显示展示数据并且用户可以进行复制,并不会进行修改和编辑, 注意点: 1.首先且文本为多行。所以不能使用普通的el-input,这种一行超出就会隐藏了,如果多行超出行数也会隐藏(…...
计算机毕设 深度学习卫星遥感图像检测与识别 -opencv python 目标检测
文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长…...
devops(前端)
1.前言 前端的打包流程和后端的流程是一样的,只是打包的环境和制作的镜像有所不同,前端需要使用nodejs环境打包,镜像也是使用nginx镜像,因为用的是k8s的pod运行镜像,还需要使用configmap挂载nginx的配置,一…...
SpringBoot中MongoDB的使用
SpringBoot中MongoDB的使用 MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居 多。由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoD…...
Spring学习之GOF的工厂模式
文章目录 工厂模式的三种形态简单工厂模式工厂方法模式抽象工厂模式(了解) 设计模式:一种可以杯冲覅利用的解决方案GoF(Gang of Four),中文名——四人组《Design Patterns: Elements of Reusable Object-Or…...
整数转字符串
描述 用递归法将一个整数 n 转换成字符串。例如,输人 483,应输出字符串"483”。 n的位数不确定,可以是任意位数的整数。 输入 输入一个整数 输出 输出一个字符串 输入样例 1 483 输出样例 1 483 代码一(如下&…...
【ARM Coresight 系列文章 2.4 - Coresight 寄存器:DEVARCH,DEVID, DEVTYPE】
文章目录 1.1 DEVARCH(device architecture register)1.2 DEVID(Device configuration Register)1.3 DEVTYPE(Device Type Identifier Register) 1.1 DEVARCH(device architecture register) DEVARCH 寄存器标识了coresight 组件的架构信息。 bits[31:21] 定义了组件架构&…...
Could not locate supplied template: react+ts搭建
1. reactts创建 我们在是用下create-react-app之前要下载一下 npm install create-react-app -g使用一下命令创建ts的react框架 create-react-app my-app --scripts-versionreact-scripts-ts 2. 遇见问题 我们用以上创建之后会提示一段代码选择“Y”之后发现我们创建的项目…...
fatal error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译
问题 默认情况下,对象文件最多可存放 65,536 (2^16) 个可寻址的节。 /bigobj将该地址容量增加至 4,294,967,296 (2^32)。大多数模块将从来不会生成包含数超过 65,536 的 .obj 文件。 但是,计算机生成的代码或大量使用模板库的代码可能需要可存放更多节的…...
xml文件转成yolo中的txt文件
xml文件转成yolo中的txt文件 # codingutf-8import os import xml.dom.minidom import cv2 as cvdef xml_to_txt(indir, outdir):os.chdir(indir)xmls os.listdir(.)for i, file in enumerate(xmls):file_save file.split(.)[0] .txtfile_txt os.path.join(outdir, file_sa…...
[Linux]手把手教你制作进度条小程序
[Linux]制作进度条小程序 文章目录 [Linux]制作进度条小程序C语言中的\n和\r字符缓冲区的刷新策略进行进度条代码编写 C语言中的\n和\r字符 C语言中字符分为两种: 可显字符控制字符 其中可显字符就是字符a这类的字符,控制字符就是\n这种控制字符。 对于我们制作…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
