女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

第二章 W55MH32 DHCP示例

W55MH32 ? 來源:W55MH32 ? 作者:W55MH32 ? 2025-07-24 09:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

單芯片解決方案,開啟全新體驗——W55MH32高性能以太網(wǎng)單片機

W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達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,其資源豐富,專為各種復雜工控場景設(shè)計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對工業(yè)控制中多樣化的連接需求,無論是與各類傳感器、執(zhí)行器的通信,還是對復雜工業(yè)協(xié)議的支持,都能游刃有余,成為復雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guā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ā)板的更多詳細信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

wKgZO2iBhEGADwC9AACHawDEnho263.png

第二章 W55MH32 DHCP示例

本篇文章我們將詳細講解DHCP協(xié)議的基本信息、優(yōu)勢特點、工作原理、應(yīng)用場景,并通過實戰(zhàn)例程,為大家講解如何使用W55MH32動態(tài)獲取IP信息,幫助讀者更好地了解并運用這一協(xié)議。

有關(guān)W55MH32的初始化過程,請參考相關(guān)章節(jié),這里將不再詳述。

1 DHCP協(xié)議簡介

DHCP(Dynamic Host Configuration Protocol)即動態(tài)主機配置協(xié)議,是一個應(yīng)用層協(xié)議。它主要用于在 IP網(wǎng)絡(luò)中為客戶端自動分配 IP地址及其他相關(guān)網(wǎng)絡(luò)配置參數(shù),如子網(wǎng)掩碼、默認網(wǎng)關(guān)、DNS服務(wù)器地址等。這種動態(tài)分配的方式大大簡化了網(wǎng)絡(luò)管理員的工作,并且能夠更有效地利用有限的 IP地址資源。

2 DHCP協(xié)議特點

便捷配置與管控:DHCP可自動分配IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)、DNS等網(wǎng)絡(luò)參數(shù),設(shè)備入網(wǎng)即自動獲取,用戶無需手動操作。管理員能通過服務(wù)器集中管理IP分配,網(wǎng)絡(luò)架構(gòu)調(diào)整時,修改服務(wù)器設(shè)置,客戶端自動適配;靜態(tài)IP則要逐臺手動輸入、調(diào)整,流程繁瑣還易出錯。

靈活資源利用:DHCP動態(tài)分配IP,設(shè)備離線后地址回池再利用,契合公共場所臨時大量接入需求,提升地址利用率;還能按需靈活調(diào)配,為關(guān)鍵設(shè)備保留靜態(tài)IP,其余動態(tài)分配。靜態(tài)IP固定占用,閑置浪費資源,靈活性差。

高效維護與排障:DHCP自動分配,規(guī)避手動配置錯誤與IP地址沖突,服務(wù)器詳細記錄分配情況。網(wǎng)絡(luò)故障時,管理員依服務(wù)器日志鎖定故障設(shè)備排查;靜態(tài)IP手動配置易沖突,故障排查缺少有效記錄,難度大、耗時久。

適配移動與拓展:移動設(shè)備橫跨網(wǎng)絡(luò)時,DHCP讓其自動獲取IP配置,無需手動切換;網(wǎng)絡(luò)規(guī)模擴大、新增設(shè)備時,DHCP自動分配地址,助力快速擴容。靜態(tài)IP需提前規(guī)劃,易現(xiàn)地址不足、分配不合理問題,還增加設(shè)備移動操作難度。

3 DHCP工作原理

DHCP工作原理如圖所示:

wKgZO2iBhEGAWhltAAAf55K7z1I506.png

從圖示中我們可以直觀明了地看出DHCP地工作原理,一般為四個階段:

發(fā)現(xiàn)階段:客戶端接入網(wǎng)絡(luò)時以廣播形式發(fā)送DHCP Discover報文(目的IP是255.255.255.255,源IP是0.0.0.0)尋找DHCP服務(wù)器,報文中含客戶端MAC地址。若服務(wù)器和客戶端不在同一子網(wǎng),會通過中繼代理(如路由器)轉(zhuǎn)發(fā)。

提供階段:DHCP服務(wù)器收到Discover報文后,從IP地址池選一個未分配的IP地址,將其和子網(wǎng)掩碼、默認網(wǎng)關(guān)、DNS服務(wù)器地址等信息封裝進DHCP Offer報文,以廣播或單播方式發(fā)給客戶端,可能會有多個Offer報文。

請求階段:客戶端收到多個Offer后選擇一個,以廣播形式發(fā)送DHCP Request報文請求分配該IP地址等配置信息,且發(fā)送ARP請求檢查IP地址唯一性。

確認階段:服務(wù)器收到Request報文后,檢查IP地址是否可用。若可用,將以廣播或單播的形式發(fā)送DHCP Ack報文,客戶端收到后完成網(wǎng)絡(luò)配置正常上網(wǎng)。若不可用,發(fā)送DHCP Nak報文,客戶端收到后重新發(fā)起Discover流程。

4 DHCP協(xié)議報文

DHCP的報文格式如下:

0~7 bit 8~15 bit 16~23 bit 24~31 bit
op(1) htype(1) hlen(1) hops(1)
Xid(4)
secs(2) flags(2)
ciaddr(4)
yiaddr(4)
siaddr(4)
giaddr(4)
chaddr(16)
sname(64)
file(128)
options(variable)

DHCP報文各字段的說明如下表所示:

字段 長度 含義
op(op code) 1字節(jié) 表示報文的類型,取值為1或2,含義如下:
1:客戶端請求報文。
2:服務(wù)器響應(yīng)報文。
htype(hardware type) 1字節(jié) 表示硬件類型。不同的硬件類型取值不同,常見值為1,表示以太網(wǎng)(10Mb)。
hlen(hardware length) 1字節(jié) 表示硬件地址長度,以太網(wǎng)的值為6。
hops 1字節(jié) 表示DHCP報文經(jīng)過的DHCP中繼數(shù)目。客戶端或服務(wù)器初始設(shè)為0,每經(jīng)過一個中繼則加1,用于限制DHCP報文經(jīng)過的中繼數(shù)量,且服務(wù)器與客戶端間中繼數(shù)目不能超16個(Hops值不能大于16),否則報文將被丟棄。
xid 4字節(jié) 表示DHCP客戶端選取的隨機數(shù),使DHCP服務(wù)器的回復與DHCP客戶端的報文相關(guān)聯(lián)。
secs(seconds) 2字節(jié) 表示客戶端從開始獲取地址或地址續(xù)租更新后所用的時間,單位是秒。
flags 2字節(jié) 表示標志字段。只有標志字段的最高位才有意義,其余的15位均被置為0。最高位被解釋為單播或者廣播響應(yīng)標志位,內(nèi)容如下所示:
0:客戶端請求服務(wù)器以單播形式發(fā)送響應(yīng)報文。
1:客戶端請求服務(wù)器以廣播形式發(fā)送響應(yīng)報文。
ciaddr(client ip address) 4字節(jié) 表示客戶端的IP地址。可以是服務(wù)器分配給客戶端的IP地址或者客戶端已有的IP地址。客戶端在初始化狀態(tài)時沒有IP地址,此字段為0.0.0.0。
IP地址0.0.0.0僅在采用DHCP方式的系統(tǒng)啟動時允許本主機利用它進行臨時的通信,不是有效目的地址。
yiaddr(your client ip address) 4字節(jié) 表示服務(wù)器分配給客戶端的IP地址。當服務(wù)器進行DHCP響應(yīng)時,將分配給客戶端的IP地址填入此字段。
siaddr(server ip address) 4字節(jié) DHCP客戶端獲得啟動配置信息的服務(wù)器的IP地址。
giaddr(gateway ip address) 4字節(jié) 表示首個DHCP中繼的IP地址。客戶端發(fā)DHCP請求,若服務(wù)器與客戶端不在同一網(wǎng)段,首個中繼轉(zhuǎn)發(fā)請求報文給服務(wù)器時填入自身IP地址,服務(wù)器據(jù)此判斷客戶端網(wǎng)段地址,選地址池分配對應(yīng)IP地址,再按此地址回發(fā)響應(yīng)報文給該中繼,由中繼轉(zhuǎn)發(fā)給客戶端。若存在多個中繼,此字段作為客戶端網(wǎng)段標記,填好首個中繼IP地址后不再變更,每經(jīng)過一個中繼,hops字段數(shù)值加1。
chaddr(client hardware address) 16字節(jié) 表示客戶端的MAC地址,此字段與前面的“hardware type”和“hardware length”保持一致。當客戶端發(fā)出DHCP請求時,將自己的硬件地址填入此字段。對于以太網(wǎng),當“hardware type”和“hardware length”分別為“1”和“6”時,此字段必須填入6字節(jié)的以太網(wǎng)MAC地址。
sname(server host name) 64字節(jié) 表示客戶端獲取配置信息的服務(wù)器名字。此字段由DHCP服務(wù)器填寫,是可選的。如果填寫,必須是一個以0結(jié)尾的字符串。
file(file name) 128字節(jié) 表示客戶端需獲取的啟動配置文件名。由DHCP服務(wù)器填寫,隨DHCP地址分配下發(fā)至客戶端。該字段可選,若填寫則須是以0結(jié)尾的字符串。
options 可變 表示DHCP的選項字段,最多1200字節(jié),包含DHCP報文類型、服務(wù)器分配給終端的配置信息(如網(wǎng)關(guān)IP地址、DNS服務(wù)器IP地址、客戶端IP地址有效租期等)。詳情參見IETF官網(wǎng)“DHCP Options”部分的描述。

Discover報文實例:客戶端通過UDP廣播的方式發(fā)送DHCP發(fā)現(xiàn)報文,報文中包含了客戶端MAC地址、主機名和請求的IP地址等信息

|報文解析|
Message type: Boot Request (1)(op code為1,客戶端請求報文)
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0xbf600589
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0
Your (client) IP address: 0.0.0.0
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11)
Client hardware address padding: 00000000000000000000
Server host name not given
Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (Discover)
Option: (61) Client identifier
Option: (50) Requested IP Address (192.168.1.115)
Option: (12) Host Name
Option: (60) Vendor class identifier
Option: (55) Parameter Request List
Option: (255) End
Padding: 0000000000000000

|報文原文|
01 01 06 00 bf 60
05 89 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 3d 07 01 64 4e d7 b1 37 11 32 04 c0 a8 01 73 0c 05 46 41 45 5f 33 3c 08 4d 53 46 54 20 35 2e 30 37 0e 01 03 06 0f 1f 21 2b 2c 2e 2f 77 79 f9 fc ff 00 00 00 00 00 00 00 00

Offer報文實例:DHCP服務(wù)器收到Discover報文后,從IP地址池選一個未分配的IP地址,將其和子網(wǎng)掩碼、默認網(wǎng)關(guān)等信息封裝進Offer報文以廣播或單播(這里為廣播的方式)方式發(fā)給客戶端

|報文解析|
Message type: Boot Reply (2)(op code為2,服務(wù)器響應(yīng)報文)
Hardware type: Ethernet (0x01)
Hardware address length: 6
Hops: 0
Transaction ID: 0xbf600589
Seconds elapsed: 0
Bootp flags: 0x0000 (Unicast)
Client IP address: 0.0.0.0
Your (client) IP address: 192.168.1.115
Next server IP address: 0.0.0.0
Relay agent IP address: 0.0.0.0
Client MAC address: HP_b1:37:11 (64:4e:d7:b1:37:11)
Client hardware address padding: 00000000000000000000
Server host name not given
 Boot file name not given
Magic cookie: DHCP
Option: (53) DHCP Message Type (Offer)
Option: (54) DHCP Server Identifier (192.168.1.1)
 Option: (51) IP Address Lease Time
 Option: (6) Domain Name Server
Option: (1) Subnet Mask (255.255.255.0)
Option: (3) Router
Option: (255) End
|報文原文|
02 01 06 00 bf 60
05 89 00 00 00 00 00 00 00 00 c0 a8 01 73 00 00 00 00 00 00 00 00 64 4e d7 b1 37 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 02 36 04 c0 a8 01 01 33 04 00 00 1c 20 06 08 ca 60 86 21 ca 60 80 56 01 04 ff ff ff 00 03 04 c0 a8 01 01 ff

其他報文信息這里就不一一展示了,感興趣的朋友可以自行抓取查看。

5 DHCP應(yīng)用場景

DHCP的應(yīng)用場景通常集中在需要動態(tài)分配IP地址的局域網(wǎng)環(huán)境中。例如,在大型的辦公環(huán)境或者學校中,由于有大量的網(wǎng)絡(luò)設(shè)備需要連接到網(wǎng)絡(luò),手動為每個設(shè)備分配和管理IP地址會非常繁瑣且容易出錯。使用DHCP可以集中管理IP地址的分配,提高網(wǎng)絡(luò)管理員的工作效率,減少錯誤的發(fā)生,且可以適應(yīng)網(wǎng)絡(luò)變化。

6實現(xiàn)過程

接下來,我們一起來看看如何在W55MH32上實現(xiàn)DHCP動態(tài)獲取網(wǎng)絡(luò)地址信息。

注意:使用DHCP動態(tài)獲取IP時,必需將網(wǎng)絡(luò)結(jié)構(gòu)體配置中dhcp的值改為NETINFO_DHCP,這樣才能運行DHCP模式。

步驟一:注冊DHCP定時器中斷到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();
           tim3_1ms_count = 0;
       }
       TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
   }
}

注冊DHCP定時器中斷主要為了DHCP超時處理。

在dhcp.h文件中,定義了DHCP超時時間、重試次數(shù)、端口號和主機名等內(nèi)容:

/* Retry to processing DHCP */
#define MAX_DHCP_RETRY          2        ///< Maximum retry count
#define DHCP_WAIT_TIME          10       ///< Wait Time 10s

/* UDP port numbers for DHCP */
#define DHCP_SERVER_PORT       67       ///< DHCP server port number
#define DHCP_CLIENT_PORT         68       ///< DHCP client port number

#define MAGIC_COOKIE             0x63825363  ///< You should not modify it number.
#define DCHP_HOST_NAME           "WIZnet"

步驟二:啟用DHCP動態(tài)獲取:

首先需要將默認網(wǎng)絡(luò)地址信息結(jié)構(gòu)體中的模式改為DHCP模式

/* network information */
wiz_NetInfo default_net_info = {
   .mac  = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12},
   .ip   = {192, 168, 1, 30},
   .gw   = {192, 168, 1, 1},
   .sn   = {255, 255, 255, 0},
   .dns  = {8, 8, 8, 8},
   .dhcp = NETINFO_DHCP
};

步驟三:DHCP獲取網(wǎng)絡(luò)地址信息

首先是在初始化完硬件和TOE之后調(diào)用network_init進行網(wǎng)絡(luò)地址信息配置

network_init(ethernet_buf, &default_net_info);

這個函數(shù)需要將DHCP處理用到的緩存數(shù)組以及默認網(wǎng)絡(luò)地址信息傳入,函數(shù)具體內(nèi)容如下:

/**
* @brief   set network information
*
* First determine whether to use DHCP. If DHCP is used, first obtain the Internet Protocol Address through DHCP.
* When DHCP fails, use static IP to configure network information. If static IP is used, configure network information directly
*
* @param   sn: socketid
* @param   ethernet_buff:
* @param   net_info: network information struct
* @return  none
*/
void network_init(uint8_t *ethernet_buff, wiz_NetInfo *conf_info)
{
   int ret;
   wizchip_setnetinfo(conf_info); // Configuring Network Information
   if (conf_info->dhcp == NETINFO_DHCP)
   {
       ret = wiz_dhcp_process(0, ethernet_buff);
       if (ret == 0)
       {
           conf_info->dhcp = NETINFO_STATIC;
           wizchip_setnetinfo(conf_info);
       }
   }
   print_network_information();
}

在這個函數(shù)中,會先設(shè)置一遍網(wǎng)絡(luò)地址到W55MH32中,然后判斷模式是否為DHCP模式,如果為DHCP模式,則使用wiz_dhcp_process函數(shù)來執(zhí)行DHCP進程,在通過DHCP方式成功獲取到網(wǎng)絡(luò)地址后更新到W55MH32中,最后將網(wǎng)絡(luò)地址信息打印出來。wiz_dhcp_process函數(shù)內(nèi)容如下:

/**
* @brief DHCP process
* @param sn :socket number
* @param buffer :socket buffer
*/
static uint8_t wiz_dhcp_process(uint8_t sn, uint8_t *buffer)
{
   wiz_NetInfo conf_info;
   uint8_t     dhcp_run_flag = 1;
   uint8_t     dhcp_ok_flag  = 0;
   /* Registration DHCP_time_handler to 1 second timer */
   DHCP_init(sn, buffer);
   printf("DHCP runningrn");
   while (1)
   {
       switch (DHCP_run())  // Do the DHCP client
       {
       case DHCP_IP_LEASED: // DHCP Acquiring network information successfully
           if (dhcp_ok_flag == 0)
           {
               dhcp_ok_flag  = 1;
               dhcp_run_flag = 0;
           }
           break;
       case DHCP_FAILED:
           dhcp_run_flag = 0;
           break;
       }
       if (dhcp_run_flag == 0)
       {
           printf("DHCP %s!rn", dhcp_ok_flag ? "success" : "fail");
           DHCP_stop();
           if (dhcp_ok_flag)
           {
               getIPfromDHCP(conf_info.ip);
               getGWfromDHCP(conf_info.gw);
               getSNfromDHCP(conf_info.sn);
               getDNSfromDHCP(conf_info.dns);
               conf_info.dhcp = NETINFO_DHCP;
               getSHAR(conf_info.mac);
               wizchip_setnetinfo(&conf_info); // Update network information to network information obtained by DHCP
               return 1;
           }
           return 0;
       }
   }
}

在該函數(shù)體中,首先會調(diào)用DHCP_init函數(shù)進行初始化DHCP配置:

void DHCP_init(uint8_t s, uint8_t * buf)
{
   uint8_t zeroip[4] = {0,0,0,0};
   getSHAR(DHCP_CHADDR);
   if((DHCP_CHADDR[0] | DHCP_CHADDR[1]  | DHCP_CHADDR[2] | DHCP_CHADDR[3] | DHCP_CHADDR[4] | DHCP_CHADDR[5]) == 0x00)
   {
     // assigning temporary mac address, you should be set SHAR before call this function. 
     DHCP_CHADDR[0] = 0x00;
     DHCP_CHADDR[1] = 0x08;
     DHCP_CHADDR[2] = 0xdc;      
     DHCP_CHADDR[3] = 0x00;
     DHCP_CHADDR[4] = 0x00;
     DHCP_CHADDR[5] = 0x00; 
     setSHAR(DHCP_CHADDR);     
   }
 DHCP_SOCKET = s; // SOCK_DHCP
 pDHCPMSG = (RIP_MSG*)buf;
 DHCP_XID = 0x12345678;
 {
   DHCP_XID += DHCP_CHADDR[3];
   DHCP_XID += DHCP_CHADDR[4];
   DHCP_XID += DHCP_CHADDR[5];
   DHCP_XID += (DHCP_CHADDR[3] ^ DHCP_CHADDR[4] ^ DHCP_CHADDR[5]);
 }
 // WIZchip Netinfo Clear
 setSIPR(zeroip);
 setGAR(zeroip);
 reset_DHCP_timeout();
 dhcp_state = STATE_DHCP_INIT;
}

然后是在DHCP主循環(huán)中運行DHCP_run函數(shù),它的主要作用是進行DHCP組包,發(fā)送發(fā)現(xiàn)、請求等報文,對服務(wù)器的提供、響應(yīng)等內(nèi)容進行解析以及超時處理,這里只需要根據(jù)DHCP_run函數(shù)的返回值進行相應(yīng)處理即可。DHCP_run函數(shù)內(nèi)容如下:

uint8_t DHCP_run(void)
{
 uint8_t  type;
 uint8_t  ret;
 if(dhcp_state == STATE_DHCP_STOP) return DHCP_STOPPED;
 if(getSn_SR(DHCP_SOCKET) != SOCK_UDP)
     socket(DHCP_SOCKET, Sn_MR_UDP, DHCP_CLIENT_PORT, 0x00);
 ret = DHCP_RUNNING;
 type = parseDHCPMSG();
 switch ( dhcp_state ) {
     case STATE_DHCP_INIT     :
         DHCP_allocated_ip[0] = 0;
         DHCP_allocated_ip[1] = 0;
         DHCP_allocated_ip[2] = 0;
         DHCP_allocated_ip[3] = 0;
       send_DHCP_DISCOVER();
       dhcp_state = STATE_DHCP_DISCOVER;
       break;
   case STATE_DHCP_DISCOVER :
     if (type == DHCP_OFFER){
#ifdef _DHCP_DEBUG_
       printf("> Receive DHCP_OFFERrn");
#endif
           DHCP_allocated_ip[0] = pDHCPMSG->yiaddr[0];
           DHCP_allocated_ip[1] = pDHCPMSG->yiaddr[1];
           DHCP_allocated_ip[2] = pDHCPMSG->yiaddr[2];
           DHCP_allocated_ip[3] = pDHCPMSG->yiaddr[3];
       send_DHCP_REQUEST();
       dhcp_state = STATE_DHCP_REQUEST;
     } else ret = check_DHCP_timeout();
         break;
   case STATE_DHCP_REQUEST :
     if (type == DHCP_ACK) {
#ifdef _DHCP_DEBUG_
       printf("> Receive DHCP_ACKrn");
#endif
       if (check_DHCP_leasedIP()) {
         // Network info assignment from DHCP
         dhcp_ip_assign();
         reset_DHCP_timeout();
         dhcp_state = STATE_DHCP_LEASED;
       } else {
         // IP address conflict occurred
         reset_DHCP_timeout();
         dhcp_ip_conflict();
           dhcp_state = STATE_DHCP_INIT;
       }
     } else if (type == DHCP_NAK) {
#ifdef _DHCP_DEBUG_
       printf("> Receive DHCP_NACKrn");
#endif
       reset_DHCP_timeout();
       dhcp_state = STATE_DHCP_DISCOVER;
     } else ret = check_DHCP_timeout();
   break;
   case STATE_DHCP_LEASED :
       ret = DHCP_IP_LEASED;
     if ((dhcp_lease_time != INFINITE_LEASETIME) && ((dhcp_lease_time/2) < dhcp_tick_1s)) {
       
#ifdef _DHCP_DEBUG_
         printf("?> Maintains the IP address rn");
#endif
       type = 0;
       OLD_allocated_ip[0] = DHCP_allocated_ip[0];
       OLD_allocated_ip[1] = DHCP_allocated_ip[1];
       OLD_allocated_ip[2] = DHCP_allocated_ip[2];
       OLD_allocated_ip[3] = DHCP_allocated_ip[3];
       
       DHCP_XID++;
       send_DHCP_REQUEST();
       reset_DHCP_timeout();
       dhcp_state = STATE_DHCP_REREQUEST;
     }
   break;
   case STATE_DHCP_REREQUEST :
       ret = DHCP_IP_LEASED;
     if (type == DHCP_ACK) {
       dhcp_retry_count = 0;
       if (OLD_allocated_ip[0] != DHCP_allocated_ip[0] || 
           OLD_allocated_ip[1] != DHCP_allocated_ip[1] ||
           OLD_allocated_ip[2] != DHCP_allocated_ip[2] ||
           OLD_allocated_ip[3] != DHCP_allocated_ip[3]) 
       {
         ret = DHCP_IP_CHANGED;
         dhcp_ip_update();
               #ifdef _DHCP_DEBUG_
                 printf(">IP changed.rn");
               #endif
         
       }
         #ifdef _DHCP_DEBUG_
           else printf(">IP is continued.rn");
         #endif                
       reset_DHCP_timeout();
       dhcp_state = STATE_DHCP_LEASED;
     } else if (type == DHCP_NAK) {
#ifdef _DHCP_DEBUG_
       printf("> Receive DHCP_NACK, Failed to maintain iprn");
#endif
       reset_DHCP_timeout();
       dhcp_state = STATE_DHCP_DISCOVER;
     } else ret = check_DHCP_timeout();
       break;
   default :
       break;
 }
 return ret;
}

8運行結(jié)果

燒錄例程運行后,首先打印了PHY鏈路檢測的結(jié)果以及DHCP日志信息,然后打印了網(wǎng)絡(luò)地址信息,這里可以看到配置方式為DHCP,IP地址為192.168.1.117,最后是PING提示消息。

接著在PC端打開CMD,PING W55MH32的IP地址,可以正常PING通。

wKgZPGiBhEGAO_jOAACWGcew2vs443.png

7總結(jié)

本文介紹 DHCP協(xié)議,包括其在 IP網(wǎng)絡(luò)自動分配參數(shù)的功能、便捷配置等特點、工作原理、報文格式和應(yīng)用場景。通過 W55MH32實戰(zhàn)例程展示動態(tài)獲取網(wǎng)絡(luò)地址信息過程,含注冊定時器中斷、啟用模式和獲取信息等步驟,燒錄后可完成檢測與信息打印,PC端能 PING通設(shè)備。

下一篇文章將講解如何在 W55MH32芯片上實現(xiàn) TCP客戶端模式,解析 TCP客戶端連接服務(wù)器進行回環(huán)測試的核心原理及應(yīng)用,同時通過實戰(zhàn)例程講解具體實現(xiàn)步驟與要點,敬請期待!

WIZnet是一家無晶圓廠半導體公司,成立于 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ū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    41

    文章

    5682

    瀏覽量

    176226
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2931

    文章

    46302

    瀏覽量

    393362
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    第二章 開發(fā)板與芯片介紹 詳解W55MH32芯片及開發(fā)板

    本章介紹了W55MH32芯片及開發(fā)板。該芯片采用Cortex-M3內(nèi)核,主頻216MHz,集成以太網(wǎng)功能,有L和Q兩種型號。配套開發(fā)板L-EVB功能豐富、Q-EVB為最小系統(tǒng)板,均含仿真器。
    的頭像 發(fā)表于 05-26 09:19 ?426次閱讀
    <b class='flag-5'>第二章</b> 開發(fā)板與芯片介紹  詳解<b class='flag-5'>W55MH32</b>芯片及開發(fā)板

    第五 W55MH32 UDP示例

    本文介紹了在 W55MH32?芯片上實現(xiàn) UDP?通信及數(shù)據(jù)回環(huán)測試的方法。闡述了 UDP?協(xié)議的概念、特點、應(yīng)用場景、報文傳輸流程和報文結(jié)構(gòu),展示了實現(xiàn)過程,借助網(wǎng)絡(luò)調(diào)試工具完成測試。
    的頭像 發(fā)表于 07-24 09:13 ?72次閱讀
    第五<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> UDP<b class='flag-5'>示例</b>

    第六 W55MH32 UDP?Multicast示例

    本文介紹了在W55MH32芯片上實現(xiàn)UDP組播的原理、應(yīng)用場景及回環(huán)測試方法,并通過實戰(zhàn)代碼展示了其具體實現(xiàn)過程。下一篇文章將聚焦DNS例程,講解其工作原理及實現(xiàn)方法,幫助大家更深入地理解網(wǎng)絡(luò)通信。敬請期待!
    的頭像 發(fā)表于 07-24 09:19 ?113次閱讀
    第六<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> UDP?Multicast<b class='flag-5'>示例</b>

    第九 W55MH32 HTTP Server示例

    本文介紹了在 W55MH32?芯片上實現(xiàn) HTTP Server?功能,并通過瀏覽器修改其網(wǎng)絡(luò)地址信息的方法。闡述了 HTTP?協(xié)議的概念、特點、應(yīng)用場景、工作流程、請求方法、響應(yīng)內(nèi)容,以及 Web?頁面構(gòu)成和交互方式。展示了在W55MH32上實現(xiàn)的過程。
    的頭像 發(fā)表于 07-24 09:35 ?113次閱讀
    第九<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> HTTP Server<b class='flag-5'>示例</b>

    第十 W55MH32 SNTP示例

    本文講解了如何在W55MH32芯片上實現(xiàn)SNTP授時功能,通過實例詳細展示了從SNTP服務(wù)器同步時間的實現(xiàn)流程,包括時間請求、響應(yīng)解析和本地時間校準等核心步驟。文章還對SNTP的應(yīng)用場景進行了分析,幫助讀者理解其在時間同步中的實際應(yīng)用價值。
    的頭像 發(fā)表于 07-24 09:43 ?131次閱讀
    第十<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> SNTP<b class='flag-5'>示例</b>

    第十二 W55MH32 NetBIOS示例

    本文講解了如何在 W55MH32?芯片上實現(xiàn) NetBIOS?功能,通過實戰(zhàn)例程展示了利用 NetBIOS?進行名稱 PING?測試的具體過程,包括 NetBIOS?功能的調(diào)用、請求處理、名稱解析
    的頭像 發(fā)表于 07-24 09:58 ?121次閱讀
    第十二<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> NetBIOS<b class='flag-5'>示例</b>

    第十四章 W55MH32 TFTP示例

    本文講解了如何在 W55MH32?芯片上實現(xiàn) TFTP?協(xié)議,通過實戰(zhàn)例程詳細展示了使用 TFTP?客戶端模式從服務(wù)器獲取文本文件的過程,涵蓋 TFTP?初始化、發(fā)送讀請求、運行協(xié)議并處理結(jié)果等核心
    的頭像 發(fā)表于 07-24 10:37 ?129次閱讀
    第十四章 <b class='flag-5'>W55MH32</b> TFTP<b class='flag-5'>示例</b>

    第十五 W55MH32 SNMP示例

    本文講解了如何在 W55MH32?芯片上實現(xiàn) SNMP?功能,通過實戰(zhàn)例程展示了使用 MIB Browser?管理 W55MH32?的具體過程,涵蓋在 MIB Browser?中創(chuàng)建分支、添加葉子
    的頭像 發(fā)表于 07-24 10:43 ?134次閱讀
    第十五<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> SNMP<b class='flag-5'>示例</b>

    第十六章 W55MH32 PING示例

    本文講解了如何在 W55MH32?芯片上通過 IPRAW?模式實現(xiàn) ICMP?協(xié)議中的 PING?命令,以進行網(wǎng)絡(luò)連通性測試,通過實戰(zhàn)例程展示了從發(fā)送 PING?請求、接收并解析回復到統(tǒng)計結(jié)果的完整
    的頭像 發(fā)表于 07-24 11:41 ?48次閱讀
    第十六章 <b class='flag-5'>W55MH32</b> PING<b class='flag-5'>示例</b>

    第十七 W55MH32 ARP示例

    文講解了如何在 W55MH32?芯片上通過 MAC RAW?模式實現(xiàn) ARP?協(xié)議,將 IP?地址解析為 MAC?地址,通過實戰(zhàn)例程展示了從發(fā)送 ARP?請求到接收并處理響應(yīng)的完整過程。文章詳細介紹
    的頭像 發(fā)表于 07-24 11:49 ?144次閱讀
    第十七<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> ARP<b class='flag-5'>示例</b>

    第十八章 W55MH32 FTP_Server示例

    本文講解了如何在 W55MH32?芯片上實現(xiàn) FTP?協(xié)議的服務(wù)器模式,通過實戰(zhàn)例程展示了使用 W55MH32?作為 FTP?服務(wù)器與 PC?端進行文件傳輸、目錄操作等功能的過程,涵蓋獲取網(wǎng)絡(luò)配置
    的頭像 發(fā)表于 07-24 11:55 ?35次閱讀
    第十八章 <b class='flag-5'>W55MH32</b> FTP_Server<b class='flag-5'>示例</b>

    第二十二章 W55MH32 MQTT&amp;Aliyun示例

    本文講解了如何在 W55MH32?芯片上實現(xiàn) MQTT?協(xié)議并連接阿里云平臺,通過實戰(zhàn)例程展示了從準備工作、連接配置到消息訂閱、發(fā)布及接收處理的完整過程。文章詳細介紹了 MQTT?協(xié)議的概念、特點
    的頭像 發(fā)表于 07-24 14:17 ?132次閱讀
    <b class='flag-5'>第二十二章</b> <b class='flag-5'>W55MH32</b> MQTT&amp;Aliyun<b class='flag-5'>示例</b>

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

    本文講解了如何在 W55MH32?芯片上實現(xiàn)上位機搜索和配置功能,通過實戰(zhàn)例程展示了使用開源上位機配置工具 SmartConfigTool?搜索局域網(wǎng)中的 W55MH32?并進行網(wǎng)絡(luò)地址配置的過程
    的頭像 發(fā)表于 07-24 16:13 ?79次閱讀
    <b class='flag-5'>第二</b>十六章 <b class='flag-5'>W55MH32</b>?上位機搜索和配置<b class='flag-5'>示例</b>

    第二十七章 W55MH32?Interrupt示例

    本文講解了如何在 W55MH32?芯片上使用 TOE?中斷功能并進行回環(huán)數(shù)據(jù)測試,通過實戰(zhàn)例程展示了從初始化中斷引腳、處理中斷、開啟中斷功能到在主循環(huán)中運行 TCP?回環(huán)服務(wù)器的完整過程。文章詳細
    的頭像 發(fā)表于 07-24 16:14 ?77次閱讀
    <b class='flag-5'>第二十七章</b> <b class='flag-5'>W55MH32</b>?Interrupt<b class='flag-5'>示例</b>

    第三十 W55MH32 HTTP_Server&amp;NetBIOS示例

    本文講解了如何在 W55MH32?芯片上實現(xiàn) HTTP_Server?與 NetBIOS?功能,并通過 NetBIOS?訪問 HTTP?服務(wù)器網(wǎng)頁內(nèi)容,通過實戰(zhàn)例程展示了在主循環(huán)中并行處理 HTTP?與 NetBIOS?相關(guān)事務(wù)的過程。
    的頭像 發(fā)表于 07-24 16:21 ?104次閱讀
    第三十<b class='flag-5'>章</b> <b class='flag-5'>W55MH32</b> HTTP_Server&amp;NetBIOS<b class='flag-5'>示例</b>