單芯片解決方案,開啟全新體驗(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è)計。它擁有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ù)以及價格等,歡迎訪問官方網(wǎng)頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

第十一章 W55MH32 SMTP示例
本篇文章,我們將詳細(xì)介紹如何在W55MH32芯片上面實(shí)現(xiàn)SMTP協(xié)議。并通過實(shí)戰(zhàn)例程,為大家講解如何在W55MH32上使用SMTP協(xié)議給他人發(fā)送電子郵件。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP和DNS,請參考相關(guān)章節(jié)。有關(guān)W55MH32的初始化過程,請參考Network Install 章節(jié),這里將不再贅述。
1 SMTP協(xié)議簡介
SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協(xié)議)是一種用于電子郵件傳輸?shù)耐ㄐ艆f(xié)議。它是互聯(lián)網(wǎng)標(biāo)準(zhǔn)協(xié)議之一,專門設(shè)計用于電子郵件的發(fā)送和路由。SMTP定義了郵件如何從發(fā)件人發(fā)送到收件人的電子郵件服務(wù)器,并規(guī)范了服務(wù)器之間的郵件中繼操作。
2 SMTP協(xié)議特點(diǎn)
面向文本:SMTP協(xié)議使用純文本命令和響應(yīng)(如HELO、MAIL FROM、RCPT TO等)來進(jìn)行通信,郵件內(nèi)容通常是以ASCII碼表示。
請求-響應(yīng)模式:SMTP通信是基于請求-響應(yīng)模型的,客戶端發(fā)送請求,服務(wù)器根據(jù)請求返回響應(yīng)。
基于TCP:SMTP依賴于TCP協(xié)議來提供可靠的數(shù)據(jù)傳輸服務(wù)。SMTP會通過TCP建立連接并發(fā)送郵件。
廣泛兼容性:SMTP是國際標(biāo)準(zhǔn)郵件傳輸協(xié)議,廣泛應(yīng)用于郵件系統(tǒng),確保不同系統(tǒng)間高效互通。
高效性與可靠性:SMTP協(xié)議簡單易用,支持錯誤處理和重試機(jī)制。郵件無法發(fā)送時,可暫存隊列并重試,確保傳輸可靠。
可擴(kuò)展性:通過擴(kuò)展SMTP協(xié)議的命令和響應(yīng)碼,可以支持更多的郵件傳輸特性和功能。
安全性:SMTP本身不處理加密,但可結(jié)合 SSL/TLS(SMTPS)提供加密通道,保障郵件傳輸?shù)陌踩浴?/p>
異步傳輸:SMTP支持異步傳輸,使郵件發(fā)送和接收可在不同時間進(jìn)行,提升效率并支持批量處理。
靈活性:SMTP設(shè)計靈活,可配置郵件路由、優(yōu)先級、大小限制等,以滿足不同需求。
3 SMTP應(yīng)用場景
接下來,我們了解下在W55MH32上,可以使用SMTP協(xié)議完成哪些操作及應(yīng)用呢?
物聯(lián)網(wǎng)(IoT)設(shè)備遠(yuǎn)程監(jiān)控:使用W55MH32實(shí)現(xiàn)SMTP通信,收集傳感器數(shù)據(jù),并發(fā)送定期報告或警報郵件。
環(huán)境監(jiān)測系統(tǒng):W55MH32通過SMTP協(xié)議將監(jiān)測數(shù)據(jù)(如溫濕度、CO2濃度等)發(fā)送到指定的郵箱,確保及時獲取信息。
設(shè)備狀態(tài)報告與日志記錄:通過定時任務(wù)觸發(fā)W55MH32每隔一段時間自動發(fā)送設(shè)備的狀態(tài)報告或運(yùn)行日志到管理人員郵箱。
遠(yuǎn)程故障報警與支持:結(jié)合傳感器和W55MH32的郵件發(fā)送功能,可以實(shí)現(xiàn)自動報警,減少人工干預(yù)的需要。
工業(yè)自動化和遠(yuǎn)程監(jiān)控:使用W55MH32連接到互聯(lián)網(wǎng),并利用SMTP協(xié)議將設(shè)備狀態(tài)、報警等信息發(fā)送到指定的郵箱。
遠(yuǎn)程控制反饋:通過W55MH32接收郵件,解析郵件命令并執(zhí)行相應(yīng)操作,然后通過SMTP將執(zhí)行結(jié)果反饋給發(fā)送者。
SMTP發(fā)送郵件流程
使用TCP協(xié)議連接SMTP服務(wù)器
發(fā)送握手消息
發(fā)送用戶認(rèn)證消息
設(shè)置郵件發(fā)送地址
傳輸郵件內(nèi)容
完成郵件發(fā)送
4STMP協(xié)議的主要命令

SMTP服務(wù)器響應(yīng)狀態(tài)碼

、
5實(shí)現(xiàn)過程
接下來,我們在W55MH32上實(shí)現(xiàn)SMTP郵件發(fā)送功能。
注意:因?yàn)楸臼纠枰L問互聯(lián)網(wǎng),請確保 W55MH32的配置能夠訪問互聯(lián)網(wǎng)。
步驟一:SMTP發(fā)送內(nèi)容初始化
發(fā)送指令定義:
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] = "wiznethk@126.com"; // 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[] = "wiznethk@126.com"; // Sender email char from_reply[] = "250 Mail OK"; char to[] = "2510582273@qq.com"; // 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";
步驟二:發(fā)送郵件內(nèi)容初始化:
mailmessage(); // Mail command information processing
mailmessage()函數(shù)內(nèi)容如下:
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協(xié)議解析SMTP服務(wù)器地址
if (do_dns(ethernet_buf, smtp_server_name, smtp_server_ip)) { while (1) { } }
步驟四:SMTP發(fā)送郵件操作
while (1)
{
do_smtp(SOCKET_ID, ethernet_buf, smtp_server_ip); // smtp run
}
do_smtp()函數(shù)內(nèi)容如下:
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)
{
}
}
}
在該函數(shù)中,程序會執(zhí)行一個 TCP Client模式的狀態(tài)機(jī),詳細(xì)講解請參考TCP Client章節(jié),這里不再贅述。當(dāng)程序處于 SOCK_ESTABLISHED (即成功連接上SMTP服務(wù)器)狀態(tài)時,SMTP服務(wù)器會主動發(fā)送一條消息給W55MH32,當(dāng)接收到這條消息后,進(jìn)入send_mail()函數(shù)進(jìn)行SMTP發(fā)送郵件流程:
send_mail()函數(shù)內(nèi)容如下:
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()中,會執(zhí)行一個發(fā)送郵件的狀態(tài)機(jī),流程如下圖所示:

1.SMTP握手:發(fā)送HELO命令,等待服務(wù)器返回250 OK響應(yīng)碼,確認(rèn)握手成功。
2.用戶認(rèn)證:
(1)請求認(rèn)證:發(fā)送AUTH LOGIN命令,表明客戶端需要認(rèn)證,等待服務(wù)器返回334,請求用戶名。
(2)提交用戶名:發(fā)送經(jīng)過Base64編碼的用戶名(如:base64name_126),等待服務(wù)器返回334,請求密碼。
(3)提交密碼:發(fā)送經(jīng)過Base64編碼的密碼(如:base64password_126),等待服務(wù)器返回235,確認(rèn)認(rèn)證成功。
3.設(shè)置郵件發(fā)送地址:
(1) 設(shè)置發(fā)件人:發(fā)送MAIL FROM:<發(fā)件人郵箱>,等待服務(wù)器返回250,確認(rèn)發(fā)件人地址成功設(shè)置。
(2) 設(shè)置收件人:發(fā)送RCPT TO:<收件人郵箱>,等待服務(wù)器返回250,確認(rèn)收件人地址成功設(shè)置。
4.傳輸郵件內(nèi)容:
(1) 請求數(shù)據(jù)傳輸:發(fā)送DATA命令,表明開始傳輸郵件數(shù)據(jù),等待服務(wù)器返回354,表示已準(zhǔn)備接收數(shù)據(jù)。
(2) 發(fā)送郵件數(shù)據(jù):按以下格式發(fā)送郵件數(shù)據(jù):
發(fā)件人信息:From:
收件人信息:To:
抄送信息:Cc:
郵件主題:Subject:
郵件內(nèi)容:實(shí)際的文本部分
數(shù)據(jù)結(jié)束用rn.rn表示
等待服務(wù)器返回250,確認(rèn)郵件內(nèi)容已成功排隊
5.完成郵件發(fā)送:
如果服務(wù)器返回250,標(biāo)志郵件成功發(fā)送。
設(shè)置Mail_Send_OK = 1,并打印提示信息mail send OK
6運(yùn)行結(jié)果
燒錄例程運(yùn)行后,首先進(jìn)行了PHY鏈路檢測,接著是通過DHCP獲取網(wǎng)絡(luò)地址信息,然后是通過DNS解析SMTP服務(wù)器域名,最后是進(jìn)行郵件發(fā)送,如下圖所示:

可以在設(shè)置接收郵件的賬號中查找接收到的郵件:

通過wireshark抓包查看,流程與send_mail()函數(shù)一致。

7總結(jié)
本文講解了如何在 W55MH32芯片上實(shí)現(xiàn) SMTP協(xié)議,通過實(shí)例詳細(xì)展示了在該芯片上使用 SMTP協(xié)議發(fā)送電子郵件的實(shí)現(xiàn)流程,包括 SMTP發(fā)送內(nèi)容初始化、使用 DNS協(xié)議解析 SMTP服務(wù)器地址、SMTP發(fā)送郵件操作等核心步驟。文章還對 SMTP協(xié)議的簡介、特點(diǎn)、應(yīng)用場景,以及主要命令和服務(wù)器響應(yīng)狀態(tài)碼進(jìn)行了分析,幫助讀者理解其在郵件傳輸中的實(shí)際應(yīng)用價值。
下一篇文章將介紹NetBIOS的原理及在網(wǎng)絡(luò)通信中的應(yīng)用,同時講解如何在W55MH32芯片上實(shí)現(xiàn)NetBIOS功能,敬請期待!
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ū)域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
SMTP
+關(guān)注
關(guān)注
0文章
33瀏覽量
12372
發(fā)布評論請先 登錄
第二十六章 W55MH32?上位機(jī)搜索和配置示例
第二十一章 W55MH32 PHY配置示例
第十八章 W55MH32 FTP_Server示例
第十七章 W55MH32 ARP示例
第十六章 W55MH32 PING示例
第十五章 W55MH32 SNMP示例
第十四章 W55MH32 TFTP示例
第十三章 W55MH32 UPnP端口轉(zhuǎn)發(fā)示例
第十二章 W55MH32 NetBIOS示例
第十章 W55MH32 SNTP示例
第九章 W55MH32 HTTP Server示例
第五章 W55MH32 UDP示例
第二章 W55MH32 DHCP示例
WIZnet W55MH32以太網(wǎng)單片機(jī)開發(fā)教程第十一章 通用定時器(下篇)
WIZnet W55MH32以太網(wǎng)單片機(jī)開發(fā)教程 第十一章 通用定時器(上篇)

第十一章 W55MH32 SMTP示例
評論