單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網單片機
W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。
在封裝規格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業控制中多樣化的連接需求,無論是與各類傳感器、執行器的通信,還是對復雜工業協議的支持,都能游刃有余,成為復雜工控領域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第十七章 W55MH32 ARP示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面實現MAC RAW模式。并通過實戰例程,為大家講解如何使用MAC RAW模式實現ARP解析IP地址為MAC地址。
該例程用到的其他網絡協議,例如 DHCP,請參考相關章節。有關 W55MH32的初始化過程,請參考Network Install章節,這里將不再贅述。
1 MACRAW模式簡介
MACRAW模式是W55MH32 TOE提供的一種底層通信模式,芯片會直接接收和發送以太網幀,而無需解析 TCP/IP層的協議。通過這種模式,用戶可以直接操作以太網幀的頭部(如目的 MAC地址、源 MAC地址、以太類型等)和有效負載數據。
注意:僅Socket0能設置為MACRAW模式。
2 ARP協議簡介
ARP(Address Resolution Protocol,地址解析協議)是一個網絡協議,用于通過已知的IP地址解析對應的MAC地址,工作于OSI模型的第二層(數據鏈路層),它是IPv4網絡中局域網通信的重要組成部分。
3 ARP協議特點
協議工作范圍:ARP協議僅在同一個局域網(LAN)內工作,因為廣播請求無法跨越路由器。
緩存機制:為了減少頻繁的廣播,設備會將IP-MAC的對應關系緩存一段時間。
協議類型:ARP請求(Opcode = 1):用于查詢目標設備的MAC地址。
ARP響應(Opcode = 2):用于回復請求方的ARP消息。
4 ARP協議請求的工作流程
當發送方主機A需要與目標主機B通信,但只知道目標主機的IP地址,而不知道目標主機的MAC地址,并且自己的ARP緩存表中也無對應關系,此時會觸發ARP請求流程:
構建ARP請求:發送方需要構建一個ARP請求數據包。
廣播ARP請求:發送方將構建好的ARP請求封裝為以太網幀,使用廣播方式發送到局域網。
目標主機接收并處理:網絡中的所有主機都會收到廣播幀,但只有目標主機(IP地址匹配)會響應。
發送方接收ARP響應,并更新自己的ARP緩存表。
5 ARP協議應用場景
地址解析:當設備需要進行鏈路層通信時,可以使用ARP協議獲取對方MAC地址。
網絡調試與診斷:在調試嵌入式設備時,通過發送 ARP請求驗證設備的網絡連通性。
6 ARP協議的安全風險及防護措施
盡管ARP協議在局域網通信中非常重要,但它也存在安全風險。例如,ARP欺騙是一種常見的攻擊手段,攻擊者可以通過偽造ARP回復來誤導其他設備,從而竊取敏感信息或中斷網絡通信。為了防范ARP欺騙攻擊,可以采取以下措施:
1.使用靜態ARP表:通過配置靜態ARP表項,可以限制和指定IP地址的設備通信時只使用指定的MAC地址。這樣,即使攻擊者發送了偽造的ARP報文,也無法修改此表項的IP地址和MAC地址的映射關系。
2.端口安全和靜態IP/MAC綁定:在接入交換機上啟用端口安全功能,并將用戶IP/MAC地址進行靜態綁定。這種方法可以防止用戶發出假冒網關的ARP信息。
3.動態ARP檢查(DAI)與DHCP偵聽:結合使用動態ARP檢查和DHCP偵聽功能,可以對用戶發出的ARP報文進行合法性檢測,并過濾掉不符合規則的ARP報文。
4.加密通信協議:通過使用加密通信協議,可以防止網絡流量被竊聽和篡改。
5.防火墻和交換機配置:在防火墻和交換機上設置相應的安全策略,例如啟用特殊的ARP報文過濾功能。
6客戶端管理:確保所有終端設備都遵循安全策略,并定期更新和打補丁。
7 ARP協議的工作原理
發送ARP請求:
當設備A需要與設備B通信時,首先檢查ARP緩存是否存有設備B的MAC地址。如果ARP緩存中沒有設備B的MAC地址,設備A會發送一條廣播ARP請求消息,格式為:“誰是IP地址 X.X.X.X?請告訴我(設備A的IP地址和MAC地址)。”
接收ARP響應:
設備B收到廣播請求后,檢查請求中的IP地址是否與自身匹配。如果匹配,設備B發送一條單播ARP響應消息給設備A,告知設備B的MAC地址。設備A收到響應后,將設備B的MAC地址緩存起來,用于后續通信。
8 ARP報文格式
一個標準的ARP報文由以下字段組成,總長度為28字節(不包含鏈路層幀頭):
字段名 | 長度(字節) | 描述 |
Hardware Type | 2 | 表示硬件類型,常見值為1(以太網)。 |
Protocol Type | 2 | 表示需要解析的協議類型,常見值為0x0800(IPv4)。 |
Hardware Address Length | 1 | 硬件地址(MAC地址)的長度,通常為6字節。 |
Protocol Address Length | 1 | 協議地址(IP地址)的長度,通常為4字節(IPv4)。 |
Operation Code | 2 | 指示操作類型:1(請求),2(響應)。 |
Sender Hardware Address | 6 | 請求方的MAC地址。 |
Sender Protocol Address | 4 | 請求方的IP地址。 |
Target Hardware Address | 6 | 目標設備的MAC地址。請求中此字段為0。 |
Target Protocol Address | 4 | 目標設備的IP地址。 |
報文字段詳解
硬件類型 (Hardware Type):說明所使用的網絡類型,例如:
1:以太網。
6:IEEE 802網絡。
對于以太網的ARP報文,該值始終為0x0001。
協議類型 (Protocol Type):表示要解析的協議類型,例如:
0x0800:表示IPv4地址解析。
0x86DD:表示IPv6(通常由ND協議替代ARP)。
硬件地址長度 (Hardware Address Length):定義硬件地址(MAC地址)的長度,通常為6字節(以太網)。
協議地址長度 (Protocol Address Length):定義協議地址(IP地址)的長度,通常為4字節(IPv4)。
操作碼 (Operation Code):說明ARP的操作類型:
1:ARP請求。
2:ARP響應。
發送方硬件地址 (Sender Hardware Address):包含請求方設備的MAC地址。
發送方協議地址 (Sender Protocol Address):包含請求方設備的IP地址。
目標硬件地址 (Target Hardware Address):在ARP請求中,這一字段為空(全0)。在ARP響應中,包含目標設備的MAC地址。
目標協議地址 (Target Protocol Address):包含目標設備的IP地址。
報文內容:
ARP Probe請求報文:
|報文解析| Address Resolution Protocol (ARP Probe) (ARP Probe請求報文,用于檢測目標IP地址是否沖突) Hardware type: Ethernet (1) (硬件類型:1表示以太網) Protocol type: IPv4 (0x0800) (協議類型:0x0800表示IPv4) Hardware size: 6 (硬件地址長度:6字節) Protocol size: 4 (協議地址長度:4字節) Opcode: request (1) (操作碼:1表示ARP請求) [Is probe: True] (是否為探測:是,用于檢測IP沖突) Sender MAC address: Wiznet_12:22:12 (00:08:dc:12:22:12) (發送方MAC地址:00:08:dc:12:22:12) Sender IP address: 0.0.0.0 (發送方IP地址:未分配,用于探測) Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00) (目標MAC地址:全0,未指定) Target IP address: 192.168.1.105 (目標IP地址:192.168.1.105,探測對象) |報文原文| 00 01 08 00 06 04 00 01 00 08 dc 12 22 12 00 00 00 00 00 00 00 00 00 00 c0 a8 01 69
ARP請求報文:
|報文解析| Address Resolution Protocol (request) (請求報文) Hardware type: Ethernet (1) (硬件類型:1表示以太網) Protocol type: IPv4 (0x0800) (協議類型:0x0800表示IPv4) Hardware size: 6 (硬件地址長度:6字節) Protocol size: 4 (協議地址長度:4字節) Opcode: request (1) (操作碼:1表示ARP請求) Sender MAC address: Wiznet_12:22:12 (00:08:dc:12:22:12) (發送方MAC地址) Sender IP address: 192.168.1.105 (發送方IP地址:192.168.1.105) Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00) (未知目標設備的物理地址) Target IP address: 192.168.1.138 (目標IP地址:192.168.1.138,目標設備的IPv4地址) |報文原文| 00 01 08 00 06 04 00 01 00 08 dc 12 22 12 c0 a8 01 69 00 00 00 00 00 00 c0 a8 01 8a
ARP響應報文:
|報文解析| Address Resolution Protocol (reply) (響應報文) Hardware type: Ethernet (1) (硬件類型:1表示以太網) Protocol type: IPv4 (0x0800) (協議類型:0x0800表示IPv4) Hardware size: 6 (硬件地址長度:6字節) Protocol size: 4 (協議地址長度:4字節) Opcode: reply (2) (操作碼:2表示ARP響應) Sender MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11) (發送方MAC地址:64:4e:d7:b1:37:11) Sender IP address: 192.168.1.138 (發送方IP地址:192.168.1.138) Target MAC address: Wiznet_12:22:12 (00:08:dc:12:22:12) (目標MAC地址,ARP請求者的物理地址) Target IP address: 192.168.1.105 (目標IP地址:192.168.1.105,ARP請求者的IPv4地址) |報文原文| 00 01 08 00 06 04 00 02 64 4e d7 b1 37 11 c0 a8 01 8a 00 08 dc 12 22 12 c0 a8 01 69
9實現過程
接下來,我們看看如何在W55MH32上實現ARP請求。
注意:測試實例需要PC端和W55MH32處于同一網段。
步驟1:在主循環中調用do_arp()函數,執行ARP請求流程
while (1) { do_arp(SOCKET_ID, ethernet_buf, dest_ip); }
do_arp()函數如下所示:
void do_arp(uint8_t sn, uint8_t *buf, uint8_t *dest_ip) { uint16_t rlen = 0; uint16_t local_port = 5000; uint16_t cnt = 0; switch (getSn_SR(sn)) { case SOCK_CLOSED: close(sn); socket(sn, Sn_MR_MACRAW, local_port, 0x00); break; case SOCK_MACRAW: arp_request(sn, local_port, dest_ip); while (1) { if ((rlen = getSn_RX_RSR(sn)) > 0) { arp_reply(sn, buf, rlen); break; } if (cnt > 1000) { printf("Request Time out.rn"); cnt = 0; break; } else { cnt++; delay_ms(5); } } break; } if (arp_succ_flag) while (1); }
進入該函數后,程序會執行一個狀態機,當socket狀態為關閉狀態時開啟一個MACRAW模式的socket。當socket成功打開為MAC RAW模式后,執行arp_request()函數發送ARP請求,然后進入一個循環,當成功接收到響應時,執行arp_reply()函數解析請求。當超過5秒未能得到響應時,則ARP請求失敗。當arp_succ_flag標志位為1時,說明ARP請求成功。
arp_request()函數如下所示:
void arp_request(uint8_t sn, uint16_t port, uint8_t *dest_ip) { uint16_t i; uint8_t broadcast_addr[4] = {0xff, 0xff, 0xff, 0xff}; for (i = 0; i < 6; i++) { pARPMSG.dst_mac[i] = 0xff; // Broadcast address in an Ethernet frame pARPMSG.tgt_mac[i] = 0x00; if (i < 4) { pARPMSG.tgt_ip[i] = dest_ip[i]; } } getSHAR(pARPMSG.src_mac); // Fill in the source MAC address of the link layer getSHAR(pARPMSG.sender_mac); // Fill in the MAC address of the sender in ARP getSIPR(pARPMSG.sender_ip); // Enter the IP address of the sender in ARP pARPMSG.msg_type = htons(ARP_TYPE); // ARP type pARPMSG.hw_type = htons(ETHER_TYPE); // Ethernet type pARPMSG.pro_type = htons(PRO_TYPE); // IP pARPMSG.hw_size = HW_SIZE; // 6 pARPMSG.pro_size = PRO_SIZE; // 4 pARPMSG.opcode = htons(ARP_REQUEST); // request: 0x0001; reply: 0x0002 if (sendto(sn, (uint8_t *)&pARPMSG, sizeof(pARPMSG), broadcast_addr, port) != sizeof(pARPMSG)) { printf("Fail to send arp request packet.rn"); } else { if (pARPMSG.opcode == htons(ARP_REQUEST)) { printf("Who has %d.%d.%d.%d ? Tell %d.%d.%d.%drn", pARPMSG.tgt_ip[0], pARPMSG.tgt_ip[1],pARPMSG.tgt_ip[2], pARPMSG.tgt_ip[3], pARPMSG.sender_ip[0], pARPMSG.sender_ip[1], pARPMSG.sender_ip[2], pARPMSG.sender_ip[3]); } else { printf("Opcode has wrong value. check opcode!rn"); } } }
在這個函數中,進行了ARP報文的組包以及發送。
arp_reply()函數如下所示:
void arp_reply(uint8_t sn, uint8_t *buff, uint16_t rlen) { uint8_t destip[4]; uint16_t destport; uint8_t ret_arp_reply[128]; uint8_t i; recvfrom(sn, (uint8_t *)buff, rlen, destip, &destport); if (buff[12] == ARP_TYPE_HI && buff[13] == ARP_TYPE_LO) { aAPRMSG = (ARPMSG *)buff; if ((aAPRMSG->opcode) == htons(ARP_REPLY)) { for (i = 0; i < 4; i++) { if (aAPRMSG-?>tgt_ip[i] != pARPMSG.tgt_ip[i]) { break; } arp_succ_flag = 1; } memset(ret_arp_reply, 0x00, 128); sprintf((char *)ret_arp_reply, "%d.%d.%d.%d is at %.2x.%.2x.%.2x.%.2x.%.2x.%.2xrn", aAPRMSG->sender_ip[0], aAPRMSG->sender_ip[1], aAPRMSG->sender_ip[2], aAPRMSG>sender_ip[3], aAPRMSG->sender_mac[0], aAPRMSG->sender_mac[1], aAPRMSG->sender_mac[2], aAPRMSG->sender_mac[3], aAPRMSG->sender_mac[4], aAPRMSG->sender_mac[5]); printf("%d.%d.%d.%d is at %.2x.%.2x.%.2x.%.2x.%.2x.%.2xrn", aAPRMSG->sender_ip[0], aAPRMSG->sender_ip[1], aAPRMSG->sender_ip[2], aAPRMSG->sender_ip[3], aAPRMSG->sender_mac[0], aAPRMSG->sender_mac[1], aAPRMSG->sender_mac[2], aAPRMSG->sender_mac[3], aAPRMSG->sender_mac[4], aAPRMSG->sender_mac[5]); } else if ((aAPRMSG->opcode) == htons(ARP_REQUEST)) { printf("Who has %d.%d.%d.%d ? Tell %.2x.%.2x.%.2x.%.2x.%.2x.%.2xrn", aAPRMSG->tgt_ip[0], aAPRMSG->tgt_ip[1], aAPRMSG->tgt_ip[2], aAPRMSG->tgt_ip[3], aAPRMSG->sender_mac[0], aAPRMSG->sender_mac[1], aAPRMSG->sender_mac[2], aAPRMSG->sender_mac[3], aAPRMSG->sender_mac[4], aAPRMSG->sender_mac[5]); } } else { // printf("This message is not ARP reply: opcode is not 0x02!rn"); } }
在這個函數中,我們會將接收到的ARP報文進行校驗,如果ARP報文為回復報文,并且回復的IP地址與我們請求的IP地址匹配時,將arp_succ_flag標志位置一,表示ARP請求成功。
10運行結果
燒錄例程運行后,首先可以看到進行了PHY鏈路檢測,然后打印了設置的網絡地址信息,然后是執行ARP請求以及請求結果,如下圖所示:
11總結
文講解了如何在 W55MH32芯片上通過 MAC RAW模式實現 ARP協議,將 IP地址解析為 MAC地址,通過實戰例程展示了從發送 ARP請求到接收并處理響應的完整過程。文章詳細介紹了 MAC RAW模式和 ARP協議的概念、特點、工作流程、應用場景、安全風險及防護措施和報文格式,幫助讀者理解其在局域網通信中的實際應用價值。
下一篇文章將聚焦 FTP協議服務器模式,解析其核心原理及在文件傳輸中的應用,同時講解如何在相關設備上搭建 FTP服務器,敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
單片機
+關注
關注
6068文章
45011瀏覽量
651188 -
ARP
+關注
關注
0文章
51瀏覽量
15019
發布評論請先 登錄
第十七章 SPI

"STM32H7學習繼續(STM32H7系列5)第十七章比較實用,以后寫程序的時候會用到"

第二章 W55MH32 DHCP示例

第五章 W55MH32 UDP示例

第九章 W55MH32 HTTP Server示例

第十章 W55MH32 SNTP示例

第十一章 W55MH32 SMTP示例

第十二章 W55MH32 NetBIOS示例

第十四章 W55MH32 TFTP示例

第十五章 W55MH32 SNMP示例

第十六章 W55MH32 PING示例

第十八章 W55MH32 FTP_Server示例

第二十六章 W55MH32?上位機搜索和配置示例

第二十七章 W55MH32?Interrupt示例

評論