單芯片解決方案,開啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲(chǔ)與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場(chǎng)景設(shè)計(jì)。它擁有66個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、5個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN、1個(gè)USB2.0以及1個(gè)SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對(duì)工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對(duì)復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場(chǎng)景,軟件使用方法一致。更多信息和資料請(qǐng)進(jìn)入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評(píng)估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

第七章 W55MH32 DNS解析域名示例
本篇文章,我們將詳細(xì)介紹如何在W55MH32芯片上面實(shí)現(xiàn)DNS域名解析功能。并通過實(shí)戰(zhàn)例程,為大家講解如何將wiznet.io的域名解析為實(shí)際IP地址,供大家參考。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP,請(qǐng)參考相關(guān)章節(jié)。有關(guān)W55MH32的初始化過程,也請(qǐng)參考相關(guān)章節(jié),這里將不再贅述。
1 DNS協(xié)議簡(jiǎn)介
在學(xué)習(xí)DNS協(xié)議之前,我們先區(qū)分一下IP地址和域名這兩個(gè)概念:
IP地址:一長(zhǎng)串能夠唯一地標(biāo)記網(wǎng)絡(luò)上地計(jì)算機(jī)的數(shù)字。
域名:又稱網(wǎng)域,是由一串用點(diǎn)分隔的名字組成的Internet上某一臺(tái)計(jì)算機(jī)或計(jì)算機(jī)組的名稱,用于在數(shù)據(jù)傳輸時(shí)對(duì)計(jì)算機(jī)的定位標(biāo)識(shí),例如:wiznet.io。
如何理解域名和網(wǎng)址的概念,可以這么理解,網(wǎng)址里面包含域名。舉個(gè)例子:https://wiznet.io/Products就是一個(gè)網(wǎng)址,而wiznet.io就是域名。
因?yàn)?IP地址具有不方便記憶并且不能顯示地址組織的名稱和性質(zhì)等缺點(diǎn),所以設(shè)計(jì)出了域名,并通過域名解析協(xié)議(DNS,Domain Name System)來將域名和 IP地址相互映射,使人能夠更方便地訪問互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的 IP地址數(shù)串。將域名映射成 IP地址稱為DNS正向解析,將 IP地址映射成域名稱為DNS反向解析。
DNS協(xié)議可以使用UDP或者TCP進(jìn)行傳輸,使用的端口號(hào)都為53,但大多數(shù)情況下DNS都是用UDP進(jìn)行傳輸。
以上是DNS協(xié)議的簡(jiǎn)介,如想深入了解該協(xié)議,請(qǐng)參考mozilla網(wǎng)站上的介紹:DNS - MDN Web文檔術(shù)語表:Web相關(guān)術(shù)語的定義 | MDN
2 DNS域名介紹
DNS域名通常分為以下幾類:
根域名服務(wù)器:根域名服務(wù)器是DNS系統(tǒng)的頂層,負(fù)責(zé)管理整個(gè)DNS命名空間的根區(qū)(Root Zone)。它主要用于引導(dǎo)查詢,指向頂級(jí)域(TLD)的權(quán)威服務(wù)器。
頂級(jí)域名服務(wù)器:負(fù)責(zé)特定頂級(jí)域(如.com、.org、.net)或國(guó)家/地區(qū)代碼頂級(jí)域(ccTLD,如.cn、.uk)的解析。
權(quán)威DNS服務(wù)器:負(fù)責(zé)存儲(chǔ)并提供特定域名的DNS記錄信息
本地DNS服務(wù)器:本地域名服務(wù)器是電腦解析時(shí)的默認(rèn)域名服務(wù)器,即電腦中設(shè)置的首選 DNS 服務(wù)器和備選 DNS 服務(wù)器。常見的有電信、聯(lián)通、谷歌、阿里等的本地 DNS服務(wù)。
3 DNS查詢方式
DNS查詢方式分為以下兩種:
遞歸查詢:指由DNS客戶端(如用戶設(shè)備或本地域名服務(wù)器)向DNS服務(wù)器發(fā)起的查詢請(qǐng)求,DNS服務(wù)器負(fù)責(zé)全程完成查詢過程,并將最終的解析結(jié)果返回給客戶端。
迭代查詢:指DNS服務(wù)器返回給客戶端或請(qǐng)求者的下一步建議,而不是直接返回最終結(jié)果,由客戶端自行完成多次查詢,逐步獲取解析結(jié)果。
下面兩張圖則是遞歸查詢和迭代查詢的工作流程圖。


4 DNS協(xié)議的基本工作流程
接下來,我們以PC端正向解析www.baidu.com為例,了解下DNS解析的工作流程。
1)首先搜索「瀏覽器的 DNS緩存」,緩存中維護(hù)一張域名與 IP地址的對(duì)應(yīng)表;
2)若沒有命中,則繼續(xù)搜索「操作系統(tǒng)的 DNS緩存」;
3)若仍然沒有命中,則操作系統(tǒng)將域名發(fā)送至「本地域名服務(wù)器」,本地域名服務(wù)器查詢自己的 DNS緩存,查找成功則返回結(jié)果(注意:主機(jī)和本地域名服務(wù)器之間的查詢方式是「遞歸查詢」);
4)若本地域名服務(wù)器的 DNS 緩存沒有命中,則本地域名服務(wù)器向上級(jí)域名服務(wù)器進(jìn)行查詢,通過以下方式進(jìn)行「迭代查詢」(注意:本地域名服務(wù)器和其他域名服務(wù)器之間的查詢方式是迭代查詢,防止根域名服務(wù)器壓力過大):
首先本地域名服務(wù)器向「根域名服務(wù)器」發(fā)起請(qǐng)求,根域名服務(wù)器是最高層次的,它并不會(huì)直接指明這個(gè)域名對(duì)應(yīng)的 IP地址,而是返回頂級(jí)域名服務(wù)器的地址,也就是說給本地域名服務(wù)器指明一條道路,讓他去這里尋找答案。
本地域名服務(wù)器拿到這個(gè)「頂級(jí)域名服務(wù)器」的地址后,就向其發(fā)起請(qǐng)求,獲取「權(quán)限域名服務(wù)器」的地址
本地域名服務(wù)器根據(jù)權(quán)限域名服務(wù)器的地址向其發(fā)起請(qǐng)求,最終得到該域名對(duì)應(yīng)的 IP地址
5)本地域名服務(wù)器將得到的 IP地址返回給操作系統(tǒng),同時(shí)自己將 IP地址緩存起來
6)操作系統(tǒng)將 IP地址返回給瀏覽器,同時(shí)自己也將 IP地址緩存起來
7)至此,瀏覽器就得到了域名對(duì)應(yīng)的 IP地址,并將 IP地址緩存起來
配合下圖直觀理解:

在W55MH32上使用DNS正向解析wiznet.io域名時(shí),我們只需要向本地域名服務(wù)器發(fā)送DNS請(qǐng)求報(bào)文,然后解析DNS響應(yīng)報(bào)文即可。
5 DNS報(bào)文
DNS報(bào)文分為以下五個(gè)部分:
報(bào)文頭部:定義了請(qǐng)求或響應(yīng)的元信息(如標(biāo)志、條目數(shù)等)。
問題區(qū)域:描述了查詢的域名和查詢類型。
回答區(qū)域:包含查詢的最終結(jié)果(如域名對(duì)應(yīng)的IP地址)。
權(quán)威區(qū)域:提供權(quán)威DNS服務(wù)器的信息。
附加區(qū)域:包含附加的相關(guān)信息(如域名的A記錄)。
DNS請(qǐng)求報(bào)文主要由報(bào)文頭部和問題區(qū)域組成,回答區(qū)域、權(quán)威區(qū)域和附加區(qū)域?yàn)榭铡?/p>
報(bào)文頭部
Transaction ID:固定長(zhǎng)度為16bit,唯一標(biāo)識(shí)符,用于匹配請(qǐng)求和響應(yīng)。
Flags:固定長(zhǎng)度為16bit,標(biāo)志位(例如查詢類型、遞歸期望等)。
Questions:固定長(zhǎng)度為16bit,問題區(qū)域的條目數(shù),通常為1。
Answer RRs:固定長(zhǎng)度為16bit,回答區(qū)域的條目數(shù),查詢報(bào)文中為0。
Authority RRs:固定長(zhǎng)度為16bit,權(quán)威區(qū)域的條目數(shù),查詢報(bào)文中為0。
Additional RRs:固定長(zhǎng)度為16bit,附加區(qū)域的條目數(shù),查詢報(bào)文中為0。
問題區(qū)域
QName:查詢的域名(以點(diǎn)分形式存儲(chǔ))。
QType:查詢的記錄類型(如A記錄、AAAA記錄、MX記錄等)。
QClass:查詢的記錄類別,通常為IN(互聯(lián)網(wǎng))。
DNS響應(yīng)報(bào)文包含與請(qǐng)求報(bào)文類似的頭部和問題區(qū)域,并附加回答、權(quán)威和附加區(qū)域信息。
報(bào)文頭部:同請(qǐng)求報(bào)文,但Flags內(nèi)容有所變化:
QR:1表示響應(yīng)(查詢報(bào)文中為0)
RCODE:返回碼,表示響應(yīng)狀態(tài)(如0表示無錯(cuò)誤,3表示域名不存在)。
AA:權(quán)威回答標(biāo)志(1表示這是權(quán)威服務(wù)器返回的響應(yīng))。
問題區(qū)域:與請(qǐng)求報(bào)文一致,用于描述客戶端的查詢。
回答區(qū)域:包含查詢結(jié)果,如域名對(duì)應(yīng)的IP地址。每條回答包含以下字段:
Name:對(duì)應(yīng)的域名
Type:記錄類型(如A、AAAA、CNAME等)。
Class:記錄類別(通常為IN)。
TTL:記錄的生存時(shí)間(秒)。
Rdata:記錄的具體值(如IP地址)。
權(quán)威區(qū)域:提供權(quán)威服務(wù)器的信息,通常包含NS記錄。
附加區(qū)域:包含額外的解析信息,如權(quán)威服務(wù)器的A記錄和AAAA記錄。
請(qǐng)求報(bào)文實(shí)例:請(qǐng)求解析域名wiznet.io的A記錄
|報(bào)文頭部 | Transaction ID: 0x8D12 Flags: 0x0100 (標(biāo)準(zhǔn)查詢、期望遞歸) Questions: 1 Answer RRs: 0 Authority RRs: 0 Additional RRs: 0 |問題區(qū)域 | QName:wiznet.io QType: A QClass: IN |報(bào)文原文 | 8D 12 01 00 00 01 00 00 00 00 00 00 06 77 69 7A 6E 65 74 02 69 64 00 00 01 00 01
響應(yīng)報(bào)文實(shí)例:DNS服務(wù)器返回wiznet.io的A記錄解析結(jié)果(IP為183.111.138.249)
|報(bào)文頭部 | Transaction ID: 0x8D12 Flags: 0x8180 (響應(yīng)、無錯(cuò)誤) Questions: 1 Answer RRs: 1 Authority RRs: 0 Additional RRs: 0 |問題區(qū)域 | QName:wiznet.io QType: A QClass: IN |回答區(qū)域 | Name:wiznet.io Type: A Class: IN TTL: 156 RData: 183.111.138.249 |報(bào)文原文 | 8D 12 81 80 00 01 00 01 00 00 00 00 06 77 69 7A 6E 65 74 02 69 6F 00 00 01 00 01 C0 0C 00 01 00 01 00 00 00 9C 00 04 B7 6F 8A F9
6實(shí)現(xiàn)過程
接下來,我們看看如何在W55MH32上實(shí)現(xiàn)DNS正向解析。
注意:因?yàn)楸臼纠枰L問互聯(lián)網(wǎng),請(qǐng)確保W55MH32的配置能夠訪問互聯(lián)網(wǎng)。
步驟一:注冊(cè)DNS定時(shí)器中斷到1s定時(shí)器中
/**
* @brief 1ms timer IRQ Handler
* @param none
* @return none
*/
void TIM3_IRQHandler(void)
{
static uint32_t tim3_1ms_count = 0;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
tim3_1ms_count++;
if (tim3_1ms_count >= 1000)
{
DHCP_time_handler();
DNS_time_handler();
tim3_1ms_count = 0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
注冊(cè)DNS定時(shí)器中斷主要為了DNS超時(shí)處理。
在dns.h文件中,定義了DNS超時(shí)時(shí)間、重試次數(shù)、端口號(hào)和消息ID等內(nèi)容:
#define MAX_DNS_BUF_SIZE 256 ///< maximum size of DNS buffer. */ /* * @brief Maxium length of your queried Domain name * @todo SHOULD BE defined it equal as or greater than your Domain name lenght + null character(1) * @note SHOULD BE careful to stack overflow because it is allocated 1.5 times as MAX_DOMAIN_NAME in stack. */ #define MAX_DOMAIN_NAME 128 // for example "www.google.com" #define MAX_DNS_RETRY 2 ///< Requery Count #define DNS_WAIT_TIME 3 ///< Wait response time. unit 1s. #define IPPORT_DOMAIN 53 ///< DNS server port number #define DNS_MSG_ID 0x1122 ///< ID for DNS message. You can be modifyed it any number
步驟二:進(jìn)行DNS正向解析處理
在do_dns()函數(shù)中,我們實(shí)現(xiàn)了dns正向解析的過程。
do_dns(ethernet_buf, dns_name, ip_fromdns);
這個(gè)函數(shù)的三個(gè)傳參分別為DNS解析所需緩存,帶解析域名,解析后的IP地址。
do_dns()函數(shù)的內(nèi)容如下:
/** * @brief DNS domain name resolution * @param ethernet_buff: ethernet buffer * @param domain_name:Domain name to be resolved * @param domain_ip:Resolved Internet Protocol Address * @return 0:success;-1:failed */ int do_dns(uint8_t *buf, uint8_t *domain_name, uint8_t *domain_ip) { int dns_ok_flag = 0; int dns_run_flag = 1; wiz_NetInfo net_info; uint8_t dns_retry_cnt = 0; DNS_init(0, buf); // DNS client init wizchip_getnetinfo(&net_info); while (1) { switch (DNS_run(net_info.dns, domain_name, domain_ip)) // Read the DNS_run return value { case DNS_RET_FAIL: // The DNS domain name is successfully resolved { if (dns_retry_cnt < DNS_RETRY) // Determine whether the parsing is successful or whether the parsing exceeds the number of times { dns_retry_cnt++; } else { printf("?> DNS Failedrn"); dns_ok_flag = -1; dns_run_flag = 0; } break; } case DNS_RET_SUCCESS: { printf("> Translated %s to %d.%d.%d.%drn", domain_name, domain_ip[0], domain_ip[1], domain_ip[2], domain_ip[3]); dns_ok_flag = 0; dns_run_flag = 0; break; } } if (dns_run_flag != 1) { return dns_ok_flag; } } }
然后是在DNS主循環(huán)中運(yùn)行DNS執(zhí)行函數(shù)DNS_run,它的主要作用是進(jìn)行DNS組包,發(fā)送請(qǐng)求,響應(yīng)內(nèi)容解析以及超時(shí)處理,這里只需要根據(jù)DNS_run()函數(shù)的返回值進(jìn)行相應(yīng)處理即可。
DNS_run()函數(shù)內(nèi)容如下:
/* DNS CLIENT RUN */
int8_t DNS_run(uint8_t * dns_ip, uint8_t * name, uint8_t * ip_from_dns)
{
int8_t ret;
struct dhdr dhp;
uint8_t ip[4];
uint16_t len, port;
int8_t ret_check_timeout;
retry_count = 0;
dns_1s_tick = 0;
// Socket open
socket(DNS_SOCKET, Sn_MR_UDP, 0, 0);
#ifdef _DNS_DEBUG_
printf("> DNS Query to DNS Server : %d.%d.%d.%drn", dns_ip[0], dns_ip[1], dns_ip[2], dns_ip[3]);
#endif
len = dns_makequery(0, (char *)name, pDNSMSG, MAX_DNS_BUF_SIZE);
sendto(DNS_SOCKET, pDNSMSG, len, dns_ip, IPPORT_DOMAIN);
while (1)
{
if ((len = getSn_RX_RSR(DNS_SOCKET)) > 0)
{
if (len > MAX_DNS_BUF_SIZE) len = MAX_DNS_BUF_SIZE;
len = recvfrom(DNS_SOCKET, pDNSMSG, len, ip, &port);
#ifdef _DNS_DEBUG_
printf("> Receive DNS message from %d.%d.%d.%d(%d). len = %drn", ip[0], ip[1], ip[2],
ip[3],port,len);
#endif
ret = parseDNSMSG(&dhp, pDNSMSG, ip_from_dns);
break;
}
// Check Timeout
ret_check_timeout = check_DNS_timeout();
if (ret_check_timeout < 0) {
#ifdef _DNS_DEBUG_
printf("?> DNS Server is not responding : %d.%d.%d.%drn", dns_ip[0], dns_ip[1], dns_ip[2], dns_ip[3]);
#endif
close(DNS_SOCKET);
return 0; // timeout occurred
}
else if (ret_check_timeout == 0) {
#ifdef _DNS_DEBUG_
printf("> DNS Timeoutrn");
#endif
sendto(DNS_SOCKET, pDNSMSG, len, dns_ip, IPPORT_DOMAIN);
}
}
close(DNS_SOCKET);
// Return value
// 0 > : failed / 1 - success
return ret;
}
7運(yùn)行結(jié)果
燒錄例程運(yùn)行后,首先進(jìn)行了PHY鏈路檢測(cè),然后是DHCP獲取網(wǎng)絡(luò)地址結(jié)果,最后是DNS成功解析出wiznet.io的IP地址為183.111.138.249,如下圖所示:
8總結(jié)
本文介紹在 W55MH32芯片上實(shí)現(xiàn) DNS域名解析功能的方法,講解如何將 wiznet.io域名解析為實(shí)際 IP地址。闡述了 DNS協(xié)議發(fā)熱概念、域名分類、查詢方式和工作流程,介紹了 DNS報(bào)文結(jié)構(gòu)及請(qǐng)求、響應(yīng)報(bào)文實(shí)例等。展示在W55MH32上的實(shí)現(xiàn)過程。
下一篇將講解在該芯片上實(shí)現(xiàn) HTTP Client功能,介紹向指定網(wǎng)站提交數(shù)據(jù)的原理和實(shí)現(xiàn)步驟。敬請(qǐng)期待!
WIZnet是一家無晶圓廠半導(dǎo)體公司,成立于 1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術(shù),基于獨(dú)特的專利全硬連線 TCP/IP。iMCU?面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國(guó)、美國(guó)設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營(yíng)銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國(guó)和日本除外)。
審核編輯 黃宇
-
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
5994瀏覽量
180752 -
DNS
+關(guān)注
關(guān)注
0文章
229瀏覽量
21147
發(fā)布評(píng)論請(qǐng)先 登錄
第二章 W55MH32 DHCP示例
第五章 W55MH32 UDP示例
第六章 W55MH32 UDP?Multicast示例
第九章 W55MH32 HTTP Server示例
第十章 W55MH32 SNTP示例
第十一章 W55MH32 SMTP示例
第十二章 W55MH32 NetBIOS示例
第十四章 W55MH32 TFTP示例
第十五章 W55MH32 SNMP示例
第十六章 W55MH32 PING示例
第七章 W55MH32 DNS解析域名示例
評(píng)論