單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網(wǎng)單片機
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨立的32KB以太網(wǎng)收發(fā)緩存,可供8個獨立硬件socket使用。如此配置,真正實現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場景設(shè)計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復(fù)用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場景,軟件使用方法一致。更多信息和資料請進(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ù)線,就能輕松實現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第七章 W55MH32 DNS解析域名示例
本篇文章,我們將詳細(xì)介紹如何在W55MH32芯片上面實現(xiàn)DNS域名解析功能。并通過實戰(zhàn)例程,為大家講解如何將wiznet.io的域名解析為實際IP地址,供大家參考。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP,請參考相關(guān)章節(jié)。有關(guān)W55MH32的初始化過程,也請參考相關(guān)章節(jié),這里將不再贅述。
1 DNS協(xié)議簡介
在學(xué)習(xí)DNS協(xié)議之前,我們先區(qū)分一下IP地址和域名這兩個概念:
IP地址:一長串能夠唯一地標(biāo)記網(wǎng)絡(luò)上地計算機的數(shù)字。
域名:又稱網(wǎng)域,是由一串用點分隔的名字組成的Internet上某一臺計算機或計算機組的名稱,用于在數(shù)據(jù)傳輸時對計算機的定位標(biāo)識,例如:wiznet.io。
如何理解域名和網(wǎng)址的概念,可以這么理解,網(wǎng)址里面包含域名。舉個例子:https://wiznet.io/Products就是一個網(wǎng)址,而wiznet.io就是域名。
因為 IP地址具有不方便記憶并且不能顯示地址組織的名稱和性質(zhì)等缺點,所以設(shè)計出了域名,并通過域名解析協(xié)議(DNS,Domain Name System)來將域名和 IP地址相互映射,使人能夠更方便地訪問互聯(lián)網(wǎng),而不用去記住能夠被機器直接讀取的 IP地址數(shù)串。將域名映射成 IP地址稱為DNS正向解析,將 IP地址映射成域名稱為DNS反向解析。
DNS協(xié)議可以使用UDP或者TCP進(jìn)行傳輸,使用的端口號都為53,但大多數(shù)情況下DNS都是用UDP進(jìn)行傳輸。
以上是DNS協(xié)議的簡介,如想深入了解該協(xié)議,請參考mozilla網(wǎng)站上的介紹:DNS - MDN Web文檔術(shù)語表:Web相關(guān)術(shù)語的定義 | MDN
2 DNS域名介紹
DNS域名通常分為以下幾類:
根域名服務(wù)器:根域名服務(wù)器是DNS系統(tǒng)的頂層,負(fù)責(zé)管理整個DNS命名空間的根區(qū)(Root Zone)。它主要用于引導(dǎo)查詢,指向頂級域(TLD)的權(quán)威服務(wù)器。
頂級域名服務(wù)器:負(fù)責(zé)特定頂級域(如.com、.org、.net)或國家/地區(qū)代碼頂級域(ccTLD,如.cn、.uk)的解析。
權(quán)威DNS服務(wù)器:負(fù)責(zé)存儲并提供特定域名的DNS記錄信息
本地DNS服務(wù)器:本地域名服務(wù)器是電腦解析時的默認(rèn)域名服務(wù)器,即電腦中設(shè)置的首選 DNS 服務(wù)器和備選 DNS 服務(wù)器。常見的有電信、聯(lián)通、谷歌、阿里等的本地 DNS服務(wù)。
3 DNS查詢方式
DNS查詢方式分為以下兩種:
遞歸查詢:指由DNS客戶端(如用戶設(shè)備或本地域名服務(wù)器)向DNS服務(wù)器發(fā)起的查詢請求,DNS服務(wù)器負(fù)責(zé)全程完成查詢過程,并將最終的解析結(jié)果返回給客戶端。
迭代查詢:指DNS服務(wù)器返回給客戶端或請求者的下一步建議,而不是直接返回最終結(jié)果,由客戶端自行完成多次查詢,逐步獲取解析結(jié)果。
下面兩張圖則是遞歸查詢和迭代查詢的工作流程圖。
4 DNS協(xié)議的基本工作流程
接下來,我們以PC端正向解析www.baidu.com為例,了解下DNS解析的工作流程。
1)首先搜索「瀏覽器的 DNS緩存」,緩存中維護(hù)一張域名與 IP地址的對應(yīng)表;
2)若沒有命中,則繼續(xù)搜索「操作系統(tǒng)的 DNS緩存」;
3)若仍然沒有命中,則操作系統(tǒng)將域名發(fā)送至「本地域名服務(wù)器」,本地域名服務(wù)器查詢自己的 DNS緩存,查找成功則返回結(jié)果(注意:主機和本地域名服務(wù)器之間的查詢方式是「遞歸查詢」);
4)若本地域名服務(wù)器的 DNS 緩存沒有命中,則本地域名服務(wù)器向上級域名服務(wù)器進(jìn)行查詢,通過以下方式進(jìn)行「迭代查詢」(注意:本地域名服務(wù)器和其他域名服務(wù)器之間的查詢方式是迭代查詢,防止根域名服務(wù)器壓力過大):
首先本地域名服務(wù)器向「根域名服務(wù)器」發(fā)起請求,根域名服務(wù)器是最高層次的,它并不會直接指明這個域名對應(yīng)的 IP地址,而是返回頂級域名服務(wù)器的地址,也就是說給本地域名服務(wù)器指明一條道路,讓他去這里尋找答案。
本地域名服務(wù)器拿到這個「頂級域名服務(wù)器」的地址后,就向其發(fā)起請求,獲取「權(quán)限域名服務(wù)器」的地址
本地域名服務(wù)器根據(jù)權(quán)限域名服務(wù)器的地址向其發(fā)起請求,最終得到該域名對應(yīng)的 IP地址
5)本地域名服務(wù)器將得到的 IP地址返回給操作系統(tǒng),同時自己將 IP地址緩存起來
6)操作系統(tǒng)將 IP地址返回給瀏覽器,同時自己也將 IP地址緩存起來
7)至此,瀏覽器就得到了域名對應(yīng)的 IP地址,并將 IP地址緩存起來
配合下圖直觀理解:
在W55MH32上使用DNS正向解析wiznet.io域名時,我們只需要向本地域名服務(wù)器發(fā)送DNS請求報文,然后解析DNS響應(yīng)報文即可。
5 DNS報文
DNS報文分為以下五個部分:
報文頭部:定義了請求或響應(yīng)的元信息(如標(biāo)志、條目數(shù)等)。
問題區(qū)域:描述了查詢的域名和查詢類型。
回答區(qū)域:包含查詢的最終結(jié)果(如域名對應(yīng)的IP地址)。
權(quán)威區(qū)域:提供權(quán)威DNS服務(wù)器的信息。
附加區(qū)域:包含附加的相關(guān)信息(如域名的A記錄)。
DNS請求報文主要由報文頭部和問題區(qū)域組成,回答區(qū)域、權(quán)威區(qū)域和附加區(qū)域為空。
報文頭部
Transaction ID:固定長度為16bit,唯一標(biāo)識符,用于匹配請求和響應(yīng)。
Flags:固定長度為16bit,標(biāo)志位(例如查詢類型、遞歸期望等)。
Questions:固定長度為16bit,問題區(qū)域的條目數(shù),通常為1。
Answer RRs:固定長度為16bit,回答區(qū)域的條目數(shù),查詢報文中為0。
Authority RRs:固定長度為16bit,權(quán)威區(qū)域的條目數(shù),查詢報文中為0。
Additional RRs:固定長度為16bit,附加區(qū)域的條目數(shù),查詢報文中為0。
問題區(qū)域
QName:查詢的域名(以點分形式存儲)。
QType:查詢的記錄類型(如A記錄、AAAA記錄、MX記錄等)。
QClass:查詢的記錄類別,通常為IN(互聯(lián)網(wǎng))。
DNS響應(yīng)報文包含與請求報文類似的頭部和問題區(qū)域,并附加回答、權(quán)威和附加區(qū)域信息。
報文頭部:同請求報文,但Flags內(nèi)容有所變化:
QR:1表示響應(yīng)(查詢報文中為0)
RCODE:返回碼,表示響應(yīng)狀態(tài)(如0表示無錯誤,3表示域名不存在)。
AA:權(quán)威回答標(biāo)志(1表示這是權(quán)威服務(wù)器返回的響應(yīng))。
問題區(qū)域:與請求報文一致,用于描述客戶端的查詢。
回答區(qū)域:包含查詢結(jié)果,如域名對應(yīng)的IP地址。每條回答包含以下字段:
Name:對應(yīng)的域名
Type:記錄類型(如A、AAAA、CNAME等)。
Class:記錄類別(通常為IN)。
TTL:記錄的生存時間(秒)。
Rdata:記錄的具體值(如IP地址)。
權(quán)威區(qū)域:提供權(quán)威服務(wù)器的信息,通常包含NS記錄。
附加區(qū)域:包含額外的解析信息,如權(quán)威服務(wù)器的A記錄和AAAA記錄。
請求報文實例:請求解析域名wiznet.io的A記錄
|報文頭部 | 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 |報文原文 | 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)報文實例:DNS服務(wù)器返回wiznet.io的A記錄解析結(jié)果(IP為183.111.138.249)
|報文頭部 | Transaction ID: 0x8D12 Flags: 0x8180 (響應(yīng)、無錯誤) 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 |報文原文 | 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實現(xiàn)過程
接下來,我們看看如何在W55MH32上實現(xiàn)DNS正向解析。
注意:因為本示例需要訪問互聯(lián)網(wǎng),請確保W55MH32的配置能夠訪問互聯(lián)網(wǎng)。
步驟一:注冊DNS定時器中斷到1s定時器中
/** * @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); } }
注冊DNS定時器中斷主要為了DNS超時處理。
在dns.h文件中,定義了DNS超時時間、重試次數(shù)、端口號和消息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ù)中,我們實現(xiàn)了dns正向解析的過程。
do_dns(ethernet_buf, dns_name, ip_fromdns);
這個函數(shù)的三個傳參分別為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)中運行DNS執(zhí)行函數(shù)DNS_run,它的主要作用是進(jìn)行DNS組包,發(fā)送請求,響應(yīng)內(nèi)容解析以及超時處理,這里只需要根據(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運行結(jié)果
燒錄例程運行后,首先進(jìn)行了PHY鏈路檢測,然后是DHCP獲取網(wǎng)絡(luò)地址結(jié)果,最后是DNS成功解析出wiznet.io的IP地址為183.111.138.249,如下圖所示:
8總結(jié)
本文介紹在 W55MH32芯片上實現(xiàn) DNS域名解析功能的方法,講解如何將 wiznet.io域名解析為實際 IP地址。闡述了 DNS協(xié)議發(fā)熱概念、域名分類、查詢方式和工作流程,介紹了 DNS報文結(jié)構(gòu)及請求、響應(yīng)報文實例等。展示在W55MH32上的實現(xiàn)過程。
下一篇將講解在該芯片上實現(xiàn) HTTP Client功能,介紹向指定網(wǎng)站提交數(shù)據(jù)的原理和實現(xiàn)步驟。敬請期待!
WIZnet是一家無晶圓廠半導(dǎo)體公司,成立于 1998年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術(shù),基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
5866瀏覽量
178609 -
DNS
+關(guān)注
關(guān)注
0文章
227瀏覽量
20873
發(fā)布評論請先 登錄
第二章 W55MH32 DHCP示例

第五章 W55MH32 UDP示例

第六章 W55MH32 UDP?Multicast示例

第九章 W55MH32 HTTP Server示例

第十章 W55MH32 SNTP示例

第十一章 W55MH32 SMTP示例

第十二章 W55MH32 NetBIOS示例

第十四章 W55MH32 TFTP示例

第十五章 W55MH32 SNMP示例

第十六章 W55MH32 PING示例

評論