單芯片解決方案,開啟全新體驗——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 SMTP示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面實現SMTP協議。并通過實戰例程,為大家講解如何在W55MH32上使用SMTP協議給他人發送電子郵件。
該例程用到的其他網絡協議,例如DHCP和DNS,請參考相關章節。有關W55MH32的初始化過程,請參考Network Install 章節,這里將不再贅述。
1 SMTP協議簡介
SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)是一種用于電子郵件傳輸的通信協議。它是互聯網標準協議之一,專門設計用于電子郵件的發送和路由。SMTP定義了郵件如何從發件人發送到收件人的電子郵件服務器,并規范了服務器之間的郵件中繼操作。
2 SMTP協議特點
面向文本:SMTP協議使用純文本命令和響應(如HELO、MAIL FROM、RCPT TO等)來進行通信,郵件內容通常是以ASCII碼表示。
請求-響應模式:SMTP通信是基于請求-響應模型的,客戶端發送請求,服務器根據請求返回響應。
基于TCP:SMTP依賴于TCP協議來提供可靠的數據傳輸服務。SMTP會通過TCP建立連接并發送郵件。
廣泛兼容性:SMTP是國際標準郵件傳輸協議,廣泛應用于郵件系統,確保不同系統間高效互通。
高效性與可靠性:SMTP協議簡單易用,支持錯誤處理和重試機制。郵件無法發送時,可暫存隊列并重試,確保傳輸可靠。
可擴展性:通過擴展SMTP協議的命令和響應碼,可以支持更多的郵件傳輸特性和功能。
安全性:SMTP本身不處理加密,但可結合 SSL/TLS(SMTPS)提供加密通道,保障郵件傳輸的安全性。
異步傳輸:SMTP支持異步傳輸,使郵件發送和接收可在不同時間進行,提升效率并支持批量處理。
靈活性:SMTP設計靈活,可配置郵件路由、優先級、大小限制等,以滿足不同需求。
3 SMTP應用場景
接下來,我們了解下在W55MH32上,可以使用SMTP協議完成哪些操作及應用呢?
物聯網(IoT)設備遠程監控:使用W55MH32實現SMTP通信,收集傳感器數據,并發送定期報告或警報郵件。
環境監測系統:W55MH32通過SMTP協議將監測數據(如溫濕度、CO2濃度等)發送到指定的郵箱,確保及時獲取信息。
設備狀態報告與日志記錄:通過定時任務觸發W55MH32每隔一段時間自動發送設備的狀態報告或運行日志到管理人員郵箱。
遠程故障報警與支持:結合傳感器和W55MH32的郵件發送功能,可以實現自動報警,減少人工干預的需要。
工業自動化和遠程監控:使用W55MH32連接到互聯網,并利用SMTP協議將設備狀態、報警等信息發送到指定的郵箱。
遠程控制反饋:通過W55MH32接收郵件,解析郵件命令并執行相應操作,然后通過SMTP將執行結果反饋給發送者。
SMTP發送郵件流程
使用TCP協議連接SMTP服務器
發送握手消息
發送用戶認證消息
設置郵件發送地址
傳輸郵件內容
完成郵件發送
4STMP協議的主要命令
SMTP服務器響應狀態碼
、
5實現過程
接下來,我們在W55MH32上實現SMTP郵件發送功能。
注意:因為本示例需要訪問互聯網,請確保 W55MH32的配置能夠訪問互聯網。
步驟一:SMTP發送內容初始化
發送指令定義:
char hello[50] = "HELO localhost"; // Identity command char hello_reply[] = "250 OK"; // Id successfully responded char AUTH[50] = "AUTH LOGIN"; // Authentication request char AUTH_reply[] = "334 dXNlcm5hbWU6"; // The authentication request was successfully sent char name_126[100] = "[email protected]"; // 126 Login email address char base64name_126[200]; // 126 base64 encoding of the login mailbox name char name_reply[] = "334 UGFzc3dvcmQ6"; // The login name was sent successfully char password_126[50] = "ZPURADLGRUPQLVBK"; // 126 Email login password char base64password_126[100]; // base64 123 Password for logging in to the mailbox char password_reply[] = "235 Authentication successful"; // Login successful response char from[] = "[email protected]"; // Sender email char from_reply[] = "250 Mail OK"; char to[] = "[email protected]"; // Recipient email address char to_reply[] = "250 Mail OK"; char data_init[10] = "data"; // Request data transfer char data_reply[] = "354"; // The request was successfully responded to HEAD char Cc[] = ""; // Cc to email char subject[] = "Hello!WIZnet!"; // subject char content[] = "Hello!WIZnet!"; // text part char mime_reply[] = "250 Mail OK queued as"; // The email was sent successfully char mailfrom[50] = "MAIL FROM:?>"; char rcptto[50] = "rcpt to:?>"; char mime[200] = "From:rn"; char mime1[50] = "To:rn"; char mime2[50] = "Cc:rn"; char mime3[50] = "Subject:rn"; char mime4[50] = "MIME-Version:1.0rnContent-Type:text/plainrnrn"; char mime5[50] = "rn.rn";
步驟二:發送郵件內容初始化:
mailmessage(); // Mail command information processing
mailmessage()函數內容如下:
void mailmessage(void) { uint16_t len_from = strlen(from); uint16_t len_to = strlen(to); uint16_t len_Cc = strlen(Cc); uint16_t len_sub = strlen(subject); strcat(hello, "rn"); strcat(AUTH, "rn"); base64encode(name_126, base64name_126); base64encode(password_126, base64password_126); strcat(base64name_126, "rn"); strcat(base64password_126, "rn"); str_insert(mailfrom, from, 11); strcat(mailfrom, "rn"); str_insert(rcptto, to, 9); strcat(rcptto, "rn"); strcat(data_init, "rn"); str_insert(mime, from, 5); str_insert(mime1, to, 3); str_insert(mime2, Cc, 3); str_insert(mime3, subject, 8); str_insert(mime5, content, 0); strcat(mime, mime1); strcat(mime, mime2); strcat(mime, mime3); strcat(mime, mime4); strcat(mime, mime5); }
步驟三:使用DNS協議解析SMTP服務器地址
if (do_dns(ethernet_buf, smtp_server_name, smtp_server_ip)) { while (1) { } }
步驟四:SMTP發送郵件操作
while (1) { do_smtp(SOCKET_ID, ethernet_buf, smtp_server_ip); // smtp run }
do_smtp()函數內容如下:
void do_smtp(uint8_t sn, uint8_t *buf, uint8_t *smtp_server_ip) { volatile uint8_t ret; uint32_t len = 0; uint16_t anyport = 5000; uint8_t Smtp_PORT = 25; memset(buf, 0, ETHERNET_MAX_BUF_SIZE); switch (getSn_SR(sn)) { case SOCK_INIT: ret = connect(sn, smtp_server_ip, Smtp_PORT); break; case SOCK_ESTABLISHED: if (getSn_IR(sn) & Sn_IR_CON) { setSn_IR(sn, Sn_IR_CON); } while (!Mail_Send_OK) { len = getSn_RX_RSR(sn); if (len > 0) { memset(buf, 0, ETHERNET_MAX_BUF_SIZE); len = recv(sn, (uint8_t *)buf, len); send_mail(sn, buf, smtp_server_ip); } } disconnect(sn); break; case SOCK_CLOSE_WAIT: if ((len = getSn_RX_RSR(sn)) > 0) { while (!Mail_Send_OK) { len = recv(sn, (uint8_t *)buf, len); send_mail(sn, buf, smtp_server_ip); } } disconnect(sn); break; case SOCK_CLOSED: socket(sn, Sn_MR_TCP, anyport++, 0x00); break; default: break; } if (Mail_Send_OK) { while (1) { } } }
在該函數中,程序會執行一個 TCP Client模式的狀態機,詳細講解請參考TCP Client章節,這里不再贅述。當程序處于 SOCK_ESTABLISHED (即成功連接上SMTP服務器)狀態時,SMTP服務器會主動發送一條消息給W55MH32,當接收到這條消息后,進入send_mail()函數進行SMTP發送郵件流程:
send_mail()函數內容如下:
void send_mail(uint8_t sn, uint8_t *buf, uint8_t *smtp_server_ip) { volatile uint8_t ret; switch (SMTP_STATE) { case waitfor220: if (strstr((const char *)buf, "220") != NULL) { ret = send(sn, (uint8_t *)hello, strlen(hello)); SMTP_STATE = waitforHELO250; } else { printf("Connected failed!rn"); } break; case waitforHELO250: if (strstr((const char *)buf, hello_reply) != NULL && strstr((const char *)buf, "Mail") == NULL) { ret = send(sn, (uint8_t *)AUTH, strlen(AUTH)); SMTP_STATE = waitforAUTH334; } else { printf("smtp handshake failed!rn"); } break; case waitforAUTH334: if (strstr((const char *)buf, AUTH_reply) != NULL) { ret = send(sn, (uint8_t *)base64name_126, strlen(base64name_126)); SMTP_STATE = waitforuser334; } else { printf("AUTH authentication request failed!rn"); } break; case waitforuser334: if (strstr((const char *)buf, name_reply) != NULL) { ret = send(sn, (uint8_t *)base64password_126, strlen(base64password_126)); SMTP_STATE = waitforpassword235; } else { printf("username send failed!rn"); } break; case waitforpassword235: if (strstr((const char *)buf, password_reply) != NULL) { ret = send(sn, (uint8_t *)mailfrom, strlen(mailfrom)); SMTP_STATE = waitforsend250; } else { printf("password error!rn"); } break; case waitforsend250: if (strstr((const char *)buf, from_reply) != NULL && strstr((const char *)buf, "queued as") == NULL) { ret = send(sn, (uint8_t *)rcptto, strlen(rcptto)); SMTP_STATE = waitforrcpt250; } else { printf("Send email failed to set up!rn"); } break; case waitforrcpt250: if (strstr((const char *)buf, to_reply) != NULL) { ret = send(sn, (uint8_t *)data_init, strlen(data_init)); SMTP_STATE = waitfordate354; } else { printf("Failed to set the receiving mailbox!rn"); } break; case waitfordate354: if (strstr((const char *)buf, data_reply) != NULL) { ret = send(sn, (uint8_t *)mime, strlen(mime)); SMTP_STATE = waitformime250; } else { printf("Failed to send content setuprn"); } break; case waitformime250: if (strstr((const char *)buf, mime_reply) != NULL) { Mail_Send_OK = 1; printf("mail send OKrn"); } break; default: break; } }
send_mail()中,會執行一個發送郵件的狀態機,流程如下圖所示:
1.SMTP握手:發送HELO命令,等待服務器返回250 OK響應碼,確認握手成功。
2.用戶認證:
(1)請求認證:發送AUTH LOGIN命令,表明客戶端需要認證,等待服務器返回334,請求用戶名。
(2)提交用戶名:發送經過Base64編碼的用戶名(如:base64name_126),等待服務器返回334,請求密碼。
(3)提交密碼:發送經過Base64編碼的密碼(如:base64password_126),等待服務器返回235,確認認證成功。
3.設置郵件發送地址:
(1) 設置發件人:發送MAIL FROM:<發件人郵箱>,等待服務器返回250,確認發件人地址成功設置。
(2) 設置收件人:發送RCPT TO:<收件人郵箱>,等待服務器返回250,確認收件人地址成功設置。
4.傳輸郵件內容:
(1) 請求數據傳輸:發送DATA命令,表明開始傳輸郵件數據,等待服務器返回354,表示已準備接收數據。
(2) 發送郵件數據:按以下格式發送郵件數據:
發件人信息:From:
收件人信息:To:
抄送信息:Cc:
郵件主題:Subject:
郵件內容:實際的文本部分
數據結束用rn.rn表示
等待服務器返回250,確認郵件內容已成功排隊
5.完成郵件發送:
如果服務器返回250,標志郵件成功發送。
設置Mail_Send_OK = 1,并打印提示信息mail send OK
6運行結果
燒錄例程運行后,首先進行了PHY鏈路檢測,接著是通過DHCP獲取網絡地址信息,然后是通過DNS解析SMTP服務器域名,最后是進行郵件發送,如下圖所示:
可以在設置接收郵件的賬號中查找接收到的郵件:
通過wireshark抓包查看,流程與send_mail()函數一致。
7總結
本文講解了如何在 W55MH32芯片上實現 SMTP協議,通過實例詳細展示了在該芯片上使用 SMTP協議發送電子郵件的實現流程,包括 SMTP發送內容初始化、使用 DNS協議解析 SMTP服務器地址、SMTP發送郵件操作等核心步驟。文章還對 SMTP協議的簡介、特點、應用場景,以及主要命令和服務器響應狀態碼進行了分析,幫助讀者理解其在郵件傳輸中的實際應用價值。
下一篇文章將介紹NetBIOS的原理及在網絡通信中的應用,同時講解如何在W55MH32芯片上實現NetBIOS功能,敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
SMTP
+關注
關注
0文章
33瀏覽量
12221
發布評論請先 登錄
第二十六章 W55MH32?上位機搜索和配置示例

第二十一章 W55MH32 PHY配置示例

第十八章 W55MH32 FTP_Server示例

第十七章 W55MH32 ARP示例

第十六章 W55MH32 PING示例

第十五章 W55MH32 SNMP示例

第十四章 W55MH32 TFTP示例

第十三章 W55MH32 UPnP端口轉發示例

第十二章 W55MH32 NetBIOS示例

第十章 W55MH32 SNTP示例

第九章 W55MH32 HTTP Server示例

第五章 W55MH32 UDP示例

第二章 W55MH32 DHCP示例

WIZnet W55MH32以太網單片機開發教程第十一章 通用定時器(下篇)

WIZnet W55MH32以太網單片機開發教程 第十一章 通用定時器(上篇)

評論