chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

第十九章 W55MH32 FTP_Client示例

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

掃碼添加小助手

加入工程師交流群

單芯片解決方案,開啟全新體驗(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,滿足存儲與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。

在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN100和QFN68。

W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場景設(shè)計(jì)。它擁有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ù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評估芯片性能。

若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

wKgZO2iBiBmAe3DyAACpGc5mWX8613.png

第十九章 W55MH32 FTP_Client示例

本篇文章,我們將詳細(xì)介紹如何在W55MH32芯片上面實(shí)現(xiàn)FTP協(xié)議的客戶端模式。并通過實(shí)戰(zhàn)例程,為大家講解如何在W55MH32上使用FTP協(xié)議的客戶端模式來訪問FTP服務(wù)器并下載文件。

該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP,請參考相關(guān)章節(jié)。有關(guān) W55MH32的初始化過程,請參考Network Install章節(jié),這里將不再贅述。

1 FTP協(xié)議簡介

FTP(File Transfer Protocol,文件傳輸協(xié)議)是一種標(biāo)準(zhǔn)的網(wǎng)絡(luò)協(xié)議,用于在客戶端和服務(wù)器之間傳輸文件。FTP客戶端協(xié)議是基于 FTP協(xié)議實(shí)現(xiàn)的,用來指導(dǎo)客戶端如何與 FTP服務(wù)器通信,實(shí)現(xiàn)文件的上傳、下載、目錄操作等功能。由于 FTP最初是以明文傳輸設(shè)計(jì)的,不夠安全,在 FTP上加入 SSL/TLS加密層,可提供加密的控制連接和數(shù)據(jù)連接。以下是 FTP客戶端協(xié)議的主要內(nèi)容和工作機(jī)制的介紹。

2 FTP協(xié)議特點(diǎn)

基于 TCP傳輸:

FTP使用兩個 TCP連接:控制連接(端口 21)和數(shù)據(jù)連接(端口 20或 PASV模式動態(tài)分配的端口),確??煽康臄?shù)據(jù)傳輸。

分離控制與數(shù)據(jù):

控制連接用于發(fā)送命令和接收響應(yīng)。

數(shù)據(jù)連接用于文件內(nèi)容或目錄信息的傳輸。

支持多種傳輸模式:

主動模式(Active Mode):服務(wù)器主動連接客戶端的數(shù)據(jù)端口。

被動模式(Passive Mode):客戶端主動連接服務(wù)器提供的數(shù)據(jù)端口,解決 NAT防火墻限制。

支持多種文件操作:

文件上傳(STOR)、下載(RETR)、刪除(DELE)。

目錄操作(MKD、RMD、CWD、PWD)。

獲取文件列表(LIST、NLST)。

明文傳輸(傳統(tǒng) FTP):

用戶名、密碼及數(shù)據(jù)以明文形式傳輸,不安全。

安全改進(jìn):FTPS(FTP Secure,基于 SSL/TLS)和 SFTP(Secure File Transfer Protocol,基于 SSH)。

靈活的用戶認(rèn)證機(jī)制:

支持匿名登錄(匿名用戶可通過 email作為密碼)。

支持認(rèn)證用戶名和密碼。

3 FTP協(xié)議應(yīng)用場景

接下來,我們了解下在W55MH32上,可以使用FTP協(xié)議完成哪些操作及應(yīng)用呢?

版本升級嵌入式設(shè)備通過 FTP客戶端從遠(yuǎn)程服務(wù)器下載最新的固件文件并執(zhí)行升級。

日志下載:嵌入式設(shè)備在運(yùn)行中生成日志、監(jiān)測數(shù)據(jù)或用戶交互記錄,通過 FTP客戶端上傳到遠(yuǎn)程服務(wù)器。

配置保存:用戶可以將配置文件上傳到FTP服務(wù)器進(jìn)行備份或共享。

離線模式數(shù)據(jù)同步:嵌入式設(shè)備在脫機(jī)運(yùn)行時本地保存數(shù)據(jù),在網(wǎng)絡(luò)恢復(fù)后通過 FTP同步到服務(wù)器。

4 FTP工作流程

1.建立控制連接

客戶端初始化:客戶端啟動 FTP客戶端程序,指定要連接的 FTP服務(wù)器的地址和端口號(端口號為 21)。

TCP連接建立:客戶端通過 TCP協(xié)議向服務(wù)器的 21端口發(fā)起連接請求。服務(wù)器監(jiān)聽該端口,接收到請求后,與客戶端建立起一條 TCP連接,這個連接被稱為控制連接,主要用于傳輸 FTP命令和服務(wù)器的響應(yīng)信息。

身份驗(yàn)證:連接建立后,服務(wù)器會提示客戶端輸入用戶名和密碼進(jìn)行身份驗(yàn)證??蛻舳税l(fā)送相應(yīng)的用戶名和密碼信息到服務(wù)器,服務(wù)器驗(yàn)證通過后,才允許客戶端進(jìn)行后續(xù)操作。也有一些匿名 FTP服務(wù)器,允許用戶以 “anonymous” 作為用戶名,以電子郵件地址作為密碼進(jìn)行登錄,提供公開的文件訪問服務(wù)。

2.傳輸模式選擇

客戶端和服務(wù)器在控制連接上協(xié)商數(shù)據(jù)傳輸模式,主要有兩種模式:

主動模式(PORT模式):客戶端通過控制連接告訴服務(wù)器自己的數(shù)據(jù)端口(客戶端隨機(jī)開放的一個端口),服務(wù)器使用 20端口主動連接客戶端的數(shù)據(jù)端口來傳輸數(shù)據(jù)。

被動模式(PASV模式):客戶端發(fā)送 PASV命令給服務(wù)器,服務(wù)器在控制連接上告知客戶端自己開放的一個臨時數(shù)據(jù)端口(通常是 1024以上的端口),然后客戶端使用自己的一個隨機(jī)端口連接服務(wù)器的這個臨時數(shù)據(jù)端口來傳輸數(shù)據(jù)。

3.數(shù)據(jù)傳輸

根據(jù)用戶的操作需求,通過數(shù)據(jù)連接進(jìn)行文件或目錄相關(guān)操作:

上傳文件:客戶端向服務(wù)器發(fā)送 STOR(存儲)命令,然后通過數(shù)據(jù)連接將本地文件數(shù)據(jù)發(fā)送到服務(wù)器。服務(wù)器接收到數(shù)據(jù)后,將其存儲在指定的目錄下。

下載文件:客戶端向服務(wù)器發(fā)送 RETR(檢索)命令,請求下載服務(wù)器上的文件。服務(wù)器通過數(shù)據(jù)連接將文件數(shù)據(jù)發(fā)送給客戶端,客戶端接收數(shù)據(jù)并將其保存到本地指定位置。

目錄操作:客戶端還可以發(fā)送諸如 LIST(列出目錄內(nèi)容)、CWD(更改工作目錄)、MKD(創(chuàng)建目錄)、RMD(刪除目錄)等命令,服務(wù)器執(zhí)行相應(yīng)操作,并通過控制連接返回操作結(jié)果。執(zhí)行這些命令時,若需要傳輸目錄列表等數(shù)據(jù),也會通過數(shù)據(jù)連接進(jìn)行傳輸。

4.關(guān)閉連接

數(shù)據(jù)連接關(guān)閉:在完成文件傳輸或其他操作后,數(shù)據(jù)連接會被關(guān)閉。如果還有其他操作需要進(jìn)行,客戶端和服務(wù)器可以根據(jù)需要重新建立數(shù)據(jù)連接。

控制連接關(guān)閉:當(dāng)客戶端完成所有操作后,會向服務(wù)器發(fā)送 QUIT命令,服務(wù)器接收到該命令后,會關(guān)閉控制連接。至此,客戶端與服務(wù)器之間的 FTP會話結(jié)束。

5主動模式與被動模式詳解

主動模式(Active Mode):

客戶端打開一個端口并監(jiān)聽。

客戶端通過控制連接告訴服務(wù)器自己的 IP和端口。

服務(wù)器主動連接到客戶端指定的端口傳輸數(shù)據(jù)。

被動模式(Passive Mode):

客戶端通過控制連接請求被動模式。

服務(wù)器打開一個隨機(jī)端口并通過控制連接告知客戶端。

客戶端主動連接到服務(wù)器指定的端口傳輸數(shù)據(jù)。

優(yōu)缺點(diǎn)對比:

主動模式更適合在服務(wù)器端網(wǎng)絡(luò)無防火墻限制的環(huán)境。

被動模式更適合客戶端在 NAT或防火墻后的情況。

6 FTP客戶端實(shí)現(xiàn)功能

FTP客戶端的核心功能包括:

連接到 FTP服務(wù)器。

用戶身份認(rèn)證。

上傳和下載文件。

瀏覽和管理服務(wù)器目錄結(jié)構(gòu)。

支持主動模式和被動模式的切換。

提供斷點(diǎn)續(xù)傳功能(某些高級客戶端)。

7 FTP報(bào)文解析

FTP報(bào)文分為命令和響應(yīng)報(bào)文,命令報(bào)文用于發(fā)送操作請求,響應(yīng)報(bào)文用于返回結(jié)果。

命令報(bào)文格式為“<命令> <參數(shù)>rn”,字段解釋如下:

<命令>:FTP命令(如 USER、PASS)。

<參數(shù)>:命令的附加信息(如用戶名、文件名)。

例如“USER usernamern”。常見的命令包括登錄 (USER, PASS)、文件操作 (RETR, STOR)、目錄操作 (LIST, CWD)等。每個 FTP報(bào)文由命令或響應(yīng)代碼、狀態(tài)碼及附加數(shù)據(jù)組成,狀態(tài)碼用于指示操作結(jié)果。

以下是 FTP常見命令:

USER:提供用戶名進(jìn)行身份驗(yàn)證。

PASS:提供密碼進(jìn)行身份驗(yàn)證。

CWD:更改當(dāng)前工作目錄。

PWD:顯示當(dāng)前工作目錄。

LIST:列出目錄下的文件和子目錄。

RETR:從服務(wù)器下載文件。

STOR:上傳文件到服務(wù)器。

DELE:刪除指定文件。

MKD:創(chuàng)建新目錄。

RMD:刪除目錄。

QUIT:終止會話并退出。

TYPE:設(shè)置文件傳輸類型(ASCII或 Binary)。

PORT:指定數(shù)據(jù)連接的端口。

PASV:啟用被動模式,服務(wù)器指定端口供客戶端連接。

響應(yīng)報(bào)文格式為“<狀態(tài)碼> <說明文字>rn”,字段解釋如下:

<狀態(tài)碼>:三位數(shù)字表示狀態(tài)。

<說明文字>:狀態(tài)的文字描述。

例如“230 User logged in, proceed.rn”。以下是FTP常見的響應(yīng)碼:

1xx(信息性響應(yīng)):主要是提供一些初步的信息,通常表示服務(wù)器正在處理請求,還沒有完成操作。

2xx(成功響應(yīng)):表示命令成功執(zhí)行。這是客戶端最希望看到的響應(yīng)類型之一,說明請求的操作(如登錄、文件傳輸?shù)龋╉樌瓿伞?/p>

3xx(補(bǔ)充信息響應(yīng)):表示服務(wù)器需要一些額外的信息才能完成操作。通常是在身份驗(yàn)證或者文件定位等過程中出現(xiàn)。

4xx(暫時錯誤響應(yīng)):表示客戶端的請求有問題,但錯誤是暫時的,可能通過一些調(diào)整(如重新發(fā)送請求等)可以解決。

5xx(永久性錯誤響應(yīng)):表示客戶端的請求存在錯誤,并且這個錯誤是比較嚴(yán)重的,很難通過簡單的調(diào)整來糾正。

接著我們來看看FTP獲取目錄的報(bào)文示例:

客戶端建立TCP連接到服務(wù)器的21端口

服務(wù)器返回:220 Welcome to FTP Serverrn

客戶端發(fā)送:USER wiznetrn

服務(wù)器返回:331 User wiznet OK.Password requiredrn

客戶端發(fā)送:PASS wiznetrn

服務(wù)器返回:230 User logged inrn

客戶端發(fā)送PORT 192,168,1,5,20,100rn(主動模式,192,168,1,5是客戶端的地址,20,100是客戶端期望的端口號20*256+100=5260)

服務(wù)器返回:200 PORT command successfulrn

客戶端發(fā)送:LISTrn(DIR命令,獲取當(dāng)前目錄的文件信息)

服務(wù)器回復(fù):150 Opening ASCII mode data connection for file listrn

服務(wù)器像客戶端期望的端口號發(fā)起TCP連接,并傳輸目錄信息,傳輸完成后關(guān)閉TCP連接。

客戶端發(fā)送:QUITrn(退出FTP會話)

服務(wù)器回復(fù):221 Goodbyern

8實(shí)現(xiàn)過程

接下來,我們看看如何在W55MH32上實(shí)現(xiàn)FTP協(xié)議Client模式。

注意:測試實(shí)例需要PC端和W55MH32處于同一網(wǎng)段。

步驟一:FTP Client模式初始化

void ftpc_init(uint8_t *src_ip, uint8_t sn_ctrl, uint8_t sn_data)
{
   ftpc.dsock_mode = ACTIVE_MODE;
   local_ip.cVal[0] = src_ip[0];
   local_ip.cVal[1] = src_ip[1];
   local_ip.cVal[2] = src_ip[2];
   local_ip.cVal[3] = src_ip[3];
   local_port       = 35000;
   socket_ctrl      = sn_ctrl;
   socket_data      = sn_data;
   strcpy(ftpc.workingdir, "/");
   socket(socket_ctrl, Sn_MR_TCP, FTP_destport, 0x0);
}

ftpc_init()函數(shù)的主要作用是初始化FTP客戶端的配置和狀態(tài),包括設(shè)置傳輸模式、本地IP地址和端口、socket、工作目錄,并創(chuàng)建用于命令傳輸?shù)目刂苨ocket。

步驟二:在主循環(huán)中運(yùn)行ftpc_run()函數(shù)

while (1)
{
   ftpc_run(ethernet_buf);
}

ftpc_run()函數(shù)如下所示:

uint8_t ftpc_run(uint8_t *dbuf)
{
   uint16_t size = 0;
   long     ret  = 0;
#if defined(F_FILESYSTEM)
   uint32_t send_byte;
#endif
   uint32_t recv_byte;
   uint32_t blocklen;
   uint32_t remain_filesize;
   uint32_t remain_datasize;
   uint8_t  dat[50] = {
       0,
   };
   switch (getSn_SR(socket_ctrl))
   {
   case SOCK_ESTABLISHED:
       if (!connect_state_control_ftpc)
       {
           printf("%d:FTP Connectedrn", socket_ctrl);
           strcpy(ftpc.workingdir, "/");
           connect_state_control_ftpc = 1;
       }
       if (gMenuStart)
       {
           gMenuStart = 0;
           printf("rn----------------------------------------rn");
           printf("Press menu keyrn");
           printf("----------------------------------------rn");
           printf("1> View FTP Server Directoryrn");
           printf("2> View My Directoryrn");
           printf("3> Sets the type of file to be transferred. Current state : %srn", (ftpc.type == ASCII_TYPE) ? "Ascii" : "Binary");
           printf("4> Sets Data Connection. Current state : %srn", (ftpc.dsock_mode == ACTIVE_MODE) ? "Active" : "Passive");
           printf("5> Put File to Serverrn");
           printf("6> Get File from Serverrn");
#if defined(F_FILESYSTEM)
           printf("7> Delete My Filern");
#endif
           printf("----------------------------------------rn");
           while (1)
           {
               memset(gMsgBuf, 0, sizeof(gMsgBuf));
               scanf("%s", gMsgBuf);
               if (gMsgBuf[0] == '1')
               {
                   if (ftpc.dsock_mode == PASSIVE_MODE)
                   {
                       sprintf((char *)dat, "PASVrn");
                       send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
                       Command.First = f_dir;
                       break;
                   }
                   else
                   {
                       wiz_NetInfo gWIZNETINFO;
                       ctlnetwork(CN_GET_NETINFO, (void *)&gWIZNETINFO);
                       sprintf((char *)dat, "PORT %d,%d,%d,%d,%d,%drn", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port >> 8), (uint8_t)(local_port & 0x00ff));
                       send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
                       Command.First = f_dir;
                       gModeActivePassiveflag = 1;
                       break;
                   }
               }
               else if (gMsgBuf[0] == '5')
               {
                   if (ftpc.dsock_mode == PASSIVE_MODE)
                   {
                       sprintf((char *)dat, "PASVrn");
                       send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
                       Command.First = f_put;
                       break;
                   }
                   else
                   {
                       wiz_NetInfo gWIZNETINFO;
                       ctlnetwork(CN_GET_NETINFO, (void *)&gWIZNETINFO);
                       sprintf((char *)dat, "PORT %d,%d,%d,%d,%d,%drn", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port >> 8), (uint8_t)(local_port & 0x00ff));
                       send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
                       Command.First = f_put;
                       gModeActivePassiveflag = 1;
                       break;
                   }
               }
               else if (gMsgBuf[0] == '6')
               {
                   if (ftpc.dsock_mode == PASSIVE_MODE)
                   {
                       sprintf((char *)dat, "PASVrn");
                       send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
                       Command.First = f_get;
                       break;
                   }
                   else
                   {
                       wiz_NetInfo gWIZNETINFO;
                       ctlnetwork(CN_GET_NETINFO, (void *)&gWIZNETINFO);
                       sprintf((char *)dat, "PORT %d,%d,%d,%d,%d,%drn", gWIZNETINFO.ip[0], gWIZNETINFO.ip[1], gWIZNETINFO.ip[2], gWIZNETINFO.ip[3], (uint8_t)(local_port >> 8), (uint8_t)(local_port & 0x00ff));
                       send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
                       Command.First = f_get;
                       gModeActivePassiveflag = 1;
                       break;
                   }
               }
               else if (gMsgBuf[0] == '2')
               {
#if defined(F_FILESYSTEM)
                   scan_files(ftpc.workingdir, dbuf, (int *)&size);
                   printf("rn%srn", dbuf);
#else
                   if (strncmp(ftpc.workingdir, "/$Recycle.Bin", sizeof("/$Recycle.Bin")) != 0)
                       size = sprintf((char *)dbuf, "drwxr-xr-x 1 ftp ftp 0 Dec 31 2014 $Recycle.Binrn-rwxr-xr-x 1 ftp ftp 512 Dec 31 2014 test.txtrn");
                   printf("rn%srn", dbuf);
#endif
                   gMenuStart = 1;
                   break;
               }
               else if (gMsgBuf[0] == '3')
               {
                   printf("1> ASCIIrn");
                   printf("2> BINARYrn");
                   while (1)
                   {
                       memset(gMsgBuf, 0, sizeof(gMsgBuf));
                       scanf("%s", gMsgBuf);
                       if (gMsgBuf[0] == '1')
                       {
                           sprintf((char *)dat, "TYPE %crn", TransferAscii);
                           ftpc.type = ASCII_TYPE;
                           send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
                           break;
                       }
                       else if (gMsgBuf[0] == '2')
                       {
                           sprintf((char *)dat, "TYPE %crn", TransferBinary);
                           ftpc.type = IMAGE_TYPE;
                           send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
                           break;
                       }
                       else if (gMsgBuf[0] != 0x00)
                       {
                           printf("rnRetry...rn");
                       }
                   }
                   break;
               }
               else if (gMsgBuf[0] == '4')
               {
                   printf("1> ACTIVErn");
                   printf("2> PASSIVErn");
                   while (1)
                   {
                       memset(gMsgBuf, 0, sizeof(gMsgBuf));
                       scanf("%s", gMsgBuf);
                       if (gMsgBuf[0] == '1')
                       {
                           ftpc.dsock_mode = ACTIVE_MODE;
                           break;
                       }
                       else if (gMsgBuf[0] == '2')
                       {
                           ftpc.dsock_mode = PASSIVE_MODE;
                           break;
                       }
                       else if (gMsgBuf[0] != 0x00)
                       {
                           printf("rnRetry...rn");
                       }
                   }
                   gMenuStart = 1;
                   break;
               }
#if defined(F_FILESYSTEM)
               else if (msg_c == '7')
               {
                   printf(">del filename?");
                   memset(gMsgBuf, 0, sizeof(gMsgBuf));
                   scanf("%s", gMsgBuf);
                   sprintf((char *)dat, "STOR %srn", gMsgBuf);
                   if (f_unlink((const char *)ftpc.filename) != 0)
                   {
                       printf("rnCould not delete.rn");
                   }
                   else
                   {
                       printf("rnDeleted.rn");
                   }
                   gMenuStart = 1;
                   break;
               }
#endif
               else if (gMsgBuf[0] != 0x00)
               {
                   printf("rnRetry...rn");
               }
           }
       }
       if (gDataSockReady)
       {
           gDataSockReady = 0;
           switch (Command.First)
           {
           case f_dir:
               sprintf((char *)dat, "LISTrn");
               send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
               break;
           case f_put:
               printf(">put file name?");
               memset(gMsgBuf, 0, sizeof(gMsgBuf));
               scanf("%s", gMsgBuf);
               sprintf((char *)dat, "STOR %srn", gMsgBuf);
               send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
               break;
           case f_get:
               printf(">get file name?");
               memset(gMsgBuf, 0, sizeof(gMsgBuf));
               scanf("%s", gMsgBuf);
               sprintf((char *)dat, "RETR %srn", gMsgBuf);
               send(socket_ctrl, (uint8_t *)dat, strlen((char *)dat));
               break;
           default:
               printf("Command.First = defaultrn");
               break;
           }
       }
       if ((size = getSn_RX_RSR(socket_ctrl)) > 0)
       { // Don't need to check SOCKERR_BUSY because it doesn't not occur.
           memset(dbuf, 0, _MAX_SS);
           if (size > _MAX_SS)
               size = _MAX_SS - 1;
           ret       = recv(socket_ctrl, dbuf, size);
           dbuf[ret] = '';
           if (ret != size)
           {
               if (ret == SOCK_BUSY)
                   return 0;
               if (ret < 0)
               {
                   printf("%d:recv() error:%ldrn", socket_ctrl, ret);
                   close(socket_ctrl);
                   return ret;
               }
           }
           printf("Rcvd Command: %srn", dbuf);
           proc_ftpc((char *)dbuf, size);
       }
       break;
   case SOCK_CLOSE_WAIT:
       printf("%d:CloseWaitrn", socket_ctrl);
       if ((ret = disconnect(socket_ctrl)) != SOCK_OK)
           return ret;
       printf("%d:Closedrn", socket_ctrl);
       break;
   case SOCK_CLOSED:
       printf("%d:FTPStartrn", socket_ctrl);
       if ((ret = socket(socket_ctrl, Sn_MR_TCP, FTP_destport, 0x0)) != socket_ctrl)
       {
           printf("%d:socket() error:%ldrn", socket_ctrl, ret);
           close(socket_ctrl);
           return ret;
       }
       break;
   case SOCK_INIT:
       printf("%d:Openedrn", socket_ctrl);
       if ((ret = connect(socket_ctrl, local_ip.cVal, FTP_destport)) != SOCK_OK)
       {
           printf("%d:Connect errorrn", socket_ctrl);
           return ret;
       }
       connect_state_control_ftpc = 0;
       printf("%d:Connectting...rn", socket_ctrl);
       break;
   default:
       break;
   }
   switch (getSn_SR(socket_data))
   {
   case SOCK_ESTABLISHED:
       if (!connect_state_data_ftpc)
       {
           printf("%d:FTP Data socket Connectedrn", socket_data);
           connect_state_data_ftpc = 1;
       }
       if (gDataPutGetStart)
       {
           switch (Command.Second)
           {
           case s_dir:
               printf("dir waiting...rn");
               if ((size = getSn_RX_RSR(socket_data)) > 0)
               { // Don't need to check SOCKERR_BUSY because it doesn't not occur.
                   printf("okrn");
                   memset(dbuf, 0, _MAX_SS);
                   if (size > _MAX_SS)
                       size = _MAX_SS - 1;
                   ret       = recv(socket_data, dbuf, size);
                   dbuf[ret] = '';
                   if (ret != size)
                   {
                       if (ret == SOCK_BUSY)
                           return 0;
                       if (ret < 0)
                       {
                           printf("%d:recv() error:%ldrn", socket_ctrl, ret);
                           close(socket_data);
                           return ret;
                       }
                   }
                   printf("Rcvd Data:nr%snr", dbuf);
                   gDataPutGetStart = 0;
                   Command.Second   = s_nocmd;
               }
               break;
           case s_put:
               printf("put waiting...rn");
               if (strlen(ftpc.workingdir) == 1)
                   sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
               else
                   sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
#if defined(F_FILESYSTEM)
               ftpc.fr = f_open(&(ftpc.fil), (const char *)ftpc.filename, FA_READ);
               if (ftpc.fr == FR_OK)
               {
                   remain_filesize = ftpc.fil.fsize;
                   printf("f_open return FR_OKrn");
                   do
                   {
                       memset(dbuf, 0, _MAX_SS);
                       if (remain_filesize > _MAX_SS)
                           send_byte = _MAX_SS;
                       else
                           send_byte = remain_filesize;
                       ftpc.fr = f_read(&(ftpc.fil), (void *)dbuf, send_byte, (UINT *)&blocklen);
                       if (ftpc.fr != FR_OK)
                       {
                           break;
                       }
                       printf("#");
                       send(socket_data, dbuf, blocklen);
                       remain_filesize -= blocklen;
                   } while (remain_filesize != 0);
                   printf("rnFile read finishedrn");
                   ftpc.fr = f_close(&(ftpc.fil));
               }
               else
               {
                   printf("File Open Error: %drn", ftpc.fr);
                   ftpc.fr = f_close(&(ftpc.fil));
               }
#else
               remain_filesize = strlen(ftpc.filename);
               do
               {
                   memset(dbuf, 0, _MAX_SS);
                   blocklen = sprintf((char *)dbuf, "%s", ftpc.filename); // Upload file content
                   printf("########## dbuf:%srn", dbuf);
                   send(socket_data, dbuf, blocklen);
                   remain_filesize -= blocklen;
               } while (remain_filesize != 0);
#endif
               gDataPutGetStart = 0;
               Command.Second   = s_nocmd;
               disconnect(socket_data);
               break;
           case s_get:
               printf("get waiting...rn");
               if (strlen(ftpc.workingdir) == 1)
                   sprintf(ftpc.filename, "/%s", (uint8_t *)gMsgBuf);
               else
                   sprintf(ftpc.filename, "%s/%s", ftpc.workingdir, (uint8_t *)gMsgBuf);
#if defined(F_FILESYSTEM)
               ftpc.fr = f_open(&(ftpc.fil), (const char *)ftpc.filename, FA_CREATE_ALWAYS | FA_WRITE);
               if (ftpc.fr == FR_OK)
               {
                   printf("f_open return FR_OKrn");
                   while (1)
                   {
                       if ((remain_datasize = getSn_RX_RSR(socket_data)) > 0)
                       {
                           while (1)
                           {
                               memset(dbuf, 0, _MAX_SS);
                               if (remain_datasize > _MAX_SS)
                                   recv_byte = _MAX_SS;
                               else
                                   recv_byte = remain_datasize;
                               ret              = recv(socket_data, dbuf, recv_byte);
                               ftpc.fr          = f_write(&(ftpc.fil), (const void *)dbuf, (UINT)ret, (UINT *)&blocklen);
                               remain_datasize -= blocklen;
                               if (ftpc.fr != FR_OK)
                               {
                                   printf("f_write failedrn");
                                   break;
                               }
                               if (remain_datasize <= 0)
                                   break;
                           }
                           if (ftpc.fr != FR_OK)
                           {
                               printf("f_write failedrn");
                               break;
                           }
                           printf("#");
                       }
                       else
                       {
                           if (getSn_SR(socket_data) != SOCK_ESTABLISHED)
                               break;
                       }
                   }
                   printf("rnFile write finishedrn");
                   ftpc.fr          = f_close(&(ftpc.fil));
                   gDataPutGetStart = 0;
               }
               else
               {
                   printf("File Open Error: %drn", ftpc.fr);
               }
#else
               while (1)
               {
                   if ((remain_datasize = getSn_RX_RSR(socket_data)) > 0)
                   {
                       while (1)
                       {
                           memset(dbuf, 0, _MAX_SS);
                           if (remain_datasize > _MAX_SS)
                               recv_byte = _MAX_SS;
                           else
                               recv_byte = remain_datasize;
                           ret = recv(socket_data, dbuf, recv_byte);
                           printf("########## dbuf:%srn", dbuf);
                           remain_datasize -= ret;
                           if (remain_datasize <= 0)
                               break;
                       }
                   }
                   else
                   {
                       if (getSn_SR(socket_data) != SOCK_ESTABLISHED)
                           break;
                   }
               }
               gDataPutGetStart = 0;
               Command.Second   = s_nocmd;
#endif
               break;
           default:
               printf("Command.Second = defaultrn");
               break;
           }
       }
       break;
   case SOCK_CLOSE_WAIT:
       printf("%d:CloseWaitrn", socket_data);
       if ((size = getSn_RX_RSR(socket_data)) > 0)
       { // Don't need to check SOCKERR_BUSY because it doesn't not occur.
           ret       = recv(socket_data, dbuf, size);
           dbuf[ret] = '';
           if (ret != size)
           {
               if (ret == SOCK_BUSY)
                   return 0;
               if (ret < 0)
               {
                   printf("%d:recv() error:%ldrn", socket_ctrl, ret);
                   close(socket_data);
                   return ret;
               }
           }
           printf("Rcvd Data:nr%snr", dbuf);
       }
       if ((ret = disconnect(socket_data)) != SOCK_OK)
           return ret;
       printf("%d:Closedrn", socket_data);
       break;
   case SOCK_CLOSED:
       if (ftpc.dsock_state == DATASOCK_READY)
       {
           if (ftpc.dsock_mode == PASSIVE_MODE)
           {
               printf("%d:FTPDataStart, port : %drn", socket_data, local_port);
               if ((ret = socket(socket_data, Sn_MR_TCP, local_port, 0x0)) != socket_data)
               {
                   printf("%d:socket() error:%ldrn", socket_data, ret);
                   close(socket_data);
                   return ret;
               }
               local_port++;
               if (local_port > 50000)
                   local_port = 35000;
           }
           else
           {
               printf("%d:FTPDataStart, port : %drn", socket_data, local_port);
               if ((ret = socket(socket_data, Sn_MR_TCP, local_port, 0x0)) != socket_data)
               {
                   printf("%d:socket() error:%ldrn", socket_data, ret);
                   close(socket_data);
                   return ret;
               }
               local_port++;
               if (local_port > 50000)
                   local_port = 35000;
           }
           ftpc.dsock_state = DATASOCK_START;
       }
       break;
   case SOCK_INIT:
       printf("%d:Openedrn", socket_data);
       if (ftpc.dsock_mode == ACTIVE_MODE)
       {
           if ((ret = listen(socket_data)) != SOCK_OK)
           {
               printf("%d:Listen errorrn", socket_data);
               return ret;
           }
           gDataSockReady = 1;
           printf("%d:Listen okrn", socket_data);
       }
       else
       {
           if ((ret = connect(socket_data, remote_ip.cVal, remote_port)) != SOCK_OK)
           {
               printf("%d:Connect errorrn", socket_data);
               return ret;
           }
           gDataSockReady = 1;
       }
       connect_state_data_ftpc = 0;
       break;
   default:
       break;
   }
   return 0;
}
 

在這個函數(shù)中,會分別執(zhí)行兩個TCP狀態(tài)機(jī),一個用于FTP控制,一個用于FTP數(shù)據(jù)傳輸,F(xiàn)TP數(shù)據(jù)傳輸?shù)臓顟B(tài)機(jī),僅當(dāng)要進(jìn)行數(shù)據(jù)傳輸時(上傳或下載文件)才會開啟。

首先看到FTP控制的狀態(tài)機(jī),大致流程如下圖所示:

wKgZO2iBrtCARlLwAACGPbMAt2E108.png

當(dāng)用戶在選項(xiàng)菜單中選擇不同的選項(xiàng)時,系統(tǒng)會根據(jù)所選選項(xiàng)發(fā)送相應(yīng)的操作指令。這些操作指令將被發(fā)送至服務(wù)器,隨后服務(wù)器會返回相應(yīng)的響應(yīng)內(nèi)容。在proc_ftpc()函數(shù)中,程序會根據(jù)服務(wù)器返回的響應(yīng)碼來判斷操作是否成功,并依據(jù)響應(yīng)碼的具體情況執(zhí)行下一步操作。一旦相應(yīng)操作完成,程序?qū)⒆詣臃祷剡x項(xiàng)菜單,以便用戶繼續(xù)進(jìn)行后續(xù)操作。

9運(yùn)行結(jié)果

燒錄例程運(yùn)行后,首先進(jìn)行了PHY鏈路檢測,然后是通過DHCP獲取網(wǎng)絡(luò)地址并打印網(wǎng)絡(luò)地址信息,打印出FTP連接信息,并提示輸入信息進(jìn)行連接,如下圖所示:

FileZilla Server Interface是 FileZilla Server的圖形用戶界面(GUI),用于管理和配置 FileZilla Server。FileZilla Server是一款開源的、跨平臺的 FTP和 FTP over TLS (FTPS)服務(wù)器,它常用于文件共享和數(shù)據(jù)傳輸。下載鏈接:服務(wù)端 - FileZilla中文網(wǎng)。下載、安裝完成后打開。

第一步:建立服務(wù)器,設(shè)置一個賬戶(用戶名:wiznet密碼:123456)

wKgZPGiBrtCAcpy9AAA5zp3MTUA938.pngwKgZO2iBrtCAQ0dNAAAZFg9CO7k930.png

第二步:添加一個共享文件夾,用于客戶端和服務(wù)器的文件操作使用

第三步:在串口助手界面根據(jù)串口消息提示Rcvd Command: 220-FileZilla Server ????????? 0.9.60 beta先輸入用戶名,再輸入密碼(注意:發(fā)送的內(nèi)容的結(jié)尾需要帶上回車換行符),然后串口就會發(fā)送6條選項(xiàng)

wKgZO2iBrtCAAX4fAABq2A-BHiw290.png

第四步:我們選擇6,從服務(wù)器獲取文件

wKgZPGiBrtCAfXBsAABwr14w-Bw273.png

第五步:然后輸入需要獲取文件的名字,如圖所示,成功獲取文件內(nèi)容

wKgZPGiBrtCABWiLAABwqlgZ91E763.png

其他操作類似,這里就不在一一進(jìn)行講解。

10總結(jié)

本文講解了如何在 W55MH32芯片上實(shí)現(xiàn) FTP協(xié)議的客戶端模式,通過實(shí)戰(zhàn)例程展示了使用該客戶端模式訪問 FTP服務(wù)器并下載文件的過程,涵蓋 FTP客戶端模式初始化、在主循環(huán)中運(yùn)行相關(guān)函數(shù)實(shí)現(xiàn)與服務(wù)器交互等關(guān)鍵步驟。文章詳細(xì)介紹了 FTP協(xié)議的概念、特點(diǎn)、應(yīng)用場景、工作流程、主動與被動模式、客戶端功能、報(bào)文解析,幫助讀者理解其在文件傳輸中的實(shí)際應(yīng)用價(jià)值。

下一篇文章將聚焦 WOL(Wake-on-LAN)網(wǎng)絡(luò)喚醒功能,解析其核心原理及在網(wǎng)絡(luò)設(shè)備管理中的應(yīng)用,同時講解如何在W55MH32上實(shí)現(xiàn) WOL功能,敬請期待!

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多家分銷商,在香港、韓國、美國設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營銷。

香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。

審核編輯 黃宇

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

    關(guān)注

    6071

    文章

    45256

    瀏覽量

    660069
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    41

    文章

    5866

    瀏覽量

    178603
  • Client
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    第十九章 ADC——電壓采集

    本章介紹W55MH32的12位逐次逼近型ADC,含18個通道(16外部+2內(nèi)部),支持多種轉(zhuǎn)換模式。剖析功能框圖,涉及電壓范圍、通道分類、轉(zhuǎn)換順序等,詳解初始化結(jié)構(gòu)體及單通道、雙重ADC等代碼配置與驗(yàn)證。
    的頭像 發(fā)表于 06-19 17:08 ?1159次閱讀
    <b class='flag-5'>第十九章</b> ADC——電壓采集

    第二章 W55MH32 DHCP示例

    本文介紹 DHCP?協(xié)議,包括其在 IP?網(wǎng)絡(luò)自動分配參數(shù)的功能、便捷配置等特點(diǎn)、工作原理、報(bào)文格式和應(yīng)用場景。通過 W55MH32?實(shí)戰(zhàn)例程展示動態(tài)獲取網(wǎng)絡(luò)地址信息過程,含注冊定時器中斷、啟用模式和獲取信息等步驟,燒錄后可完成檢測與信息打印,PC?端能 PING?通設(shè)備。
    的頭像 發(fā)表于 07-24 09:02 ?449次閱讀
    第二章 <b class='flag-5'>W55MH32</b> DHCP<b class='flag-5'>示例</b>

    第三章 W55MH32 TCP Client示例

    本文介紹在 W55MH32?芯片上實(shí)現(xiàn) TCP?客戶端模式進(jìn)行數(shù)據(jù)回環(huán)測試的方法。闡述 TCP?協(xié)議概念、特點(diǎn)、與 UDP?區(qū)別、應(yīng)用場景及相關(guān)機(jī)制。展示實(shí)現(xiàn)過程,包括開啟 Keepalive?功能,在主循環(huán)運(yùn)行測試程序。燒錄例程后進(jìn)行 PHY?鏈路檢測、獲取網(wǎng)絡(luò)地址,再借助網(wǎng)絡(luò)調(diào)試工具測試。
    的頭像 發(fā)表于 07-24 09:06 ?550次閱讀
    第三章 <b class='flag-5'>W55MH32</b> TCP <b class='flag-5'>Client</b><b class='flag-5'>示例</b>

    第五章 W55MH32 UDP示例

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

    九章 W55MH32 HTTP Server示例

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

    第十W55MH32 SNTP示例

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

    第十一章 W55MH32 SMTP示例

    本文講解了如何在 W55MH32?芯片上實(shí)現(xiàn) SMTP?協(xié)議,通過實(shí)例詳細(xì)展示了在該芯片上使用 SMTP?協(xié)議發(fā)送電子郵件的實(shí)現(xiàn)流程,包括 SMTP?發(fā)送內(nèi)容初始化、使用 DNS?協(xié)議解析 SMTP
    的頭像 發(fā)表于 07-24 09:49 ?696次閱讀
    <b class='flag-5'>第十</b>一章 <b class='flag-5'>W55MH32</b> SMTP<b class='flag-5'>示例</b>

    第十三章 W55MH32 UPnP端口轉(zhuǎn)發(fā)示例

    本文講解了如何在 W55MH32?芯片上實(shí)現(xiàn) UPnP?協(xié)議的端口轉(zhuǎn)發(fā)功能,通過實(shí)戰(zhàn)例程詳細(xì)展示了從設(shè)備搜索、獲取設(shè)備描述、訂閱事件到添加和刪除端口映射的完整流程,包括各步驟涉及的協(xié)議報(bào)文、函數(shù)實(shí)現(xiàn)
    的頭像 發(fā)表于 07-24 10:28 ?618次閱讀
    <b class='flag-5'>第十</b>三章 <b class='flag-5'>W55MH32</b> UPnP端口轉(zhuǎn)發(fā)<b class='flag-5'>示例</b>

    第十四章 W55MH32 TFTP示例

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

    第十五章 W55MH32 SNMP示例

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

    第十六章 W55MH32 PING示例

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

    第十七章 W55MH32 ARP示例

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

    第十八章 W55MH32 FTP_Server示例

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

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

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

    第二十九章 W55MH32 Modbus_TCP_Server示例

    本文講解了如何在 W55MH32?芯片上實(shí)現(xiàn) Modbus TCP?協(xié)議的服務(wù)器模式,通過實(shí)戰(zhàn)例程展示了從初始化 LED?相關(guān)函數(shù)、主循環(huán)調(diào)用處理函數(shù)到解析處理接收到的報(bào)文的完整過程。文章詳細(xì)介紹了
    的頭像 發(fā)表于 07-24 16:18 ?362次閱讀
    第二<b class='flag-5'>十九章</b> <b class='flag-5'>W55MH32</b> Modbus_TCP_Server<b class='flag-5'>示例</b>