單芯片解決方案,開啟全新體驗——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 MQTT_OneNET示例
本篇文章,我們將詳細介紹如何在W55MH32芯片上面實現MQTT協議。并通過實戰例程,為大家講解如何使用W55MH32的MQTT協議連接OneNET平臺,實現與OneNET物模型的數據交互。
該例程用到的其他網絡協議,例如DHCP和DNS,請參考相關章節。有關W55MH32的初始化過程,請參考Network Install章節,這里將不再贅述。
1 MQTT簡介
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議)是一種輕量級的、基于發布/訂閱模式的消息傳輸協議,廣泛應用于物聯網(IoT)領域,尤其是在網絡帶寬受限、設備資源有限的環境中。它由IBM在1999年提出,主要用于遠程監控和控制系統中的設備通信。MQTT協議具有低帶寬、低功耗、低延遲等優點,特別適用于嵌入式系統和物聯網設備的通信。
2 MQTT特點
輕量級:MQTT協議采用極簡的協議頭,減少了消息頭的大小,適合帶寬有限和計算資源有限的設備。
可靠性:MQTT支持三種服務質量(QoS)級別,能夠確保數據可靠送達。
實時性:MQTT適合低延遲應用場景,消息會盡可能地實時推送到訂閱者。
保留消息:MQTT支持“保留消息”功能,代理會保存最后一條發布的消息,當有新設備訂閱某個主題時,代理會立即發送保留的消息。
持久會話:MQTT允許客戶端在斷開后恢復會話狀態,斷開期間的消息可以在客戶端重新連接后繼續接收。
3 MQTT應用場景
工業自動化:在工業環境中,生產設備、傳感器、控制器等都需要進行數據交換,MQTT協議適用于在復雜的工業自動化系統中提供實時通信。
智能電網:智能電網應用中,電力設備(如變電站、智能電表、開關設備等)通過以太網與控制中心進行實時數據交換,使用MQTT協議進行遠程監控和控制。
遠程設備監控與管理:適用于需要遠程監控和管理的設備,如遠程氣象站、環境監測設備等。通過MQTT協議實時獲取設備的傳感器數據。
4 MQTT發布/訂閱模式
發布訂閱模式(Publish-Subscribe Pattern)是一種消息傳遞模式,它將發送消息的客戶端(發布者)與接收消息的客戶端(訂閱者)解耦,使得兩者不需要建立直接的聯系也不需要知道對方的存在。
MQTT發布/訂閱模式的精髓在于由一個被稱為代理(Broker)的中間角色負責所有消息的路由和分發工作,發布者將帶有主題的消息發送給代理,訂閱者則向代理訂閱主題來接收感興趣的消息。
在 MQTT中,主題和訂閱無法被提前注冊或創建,所以代理也無法預知某一個主題之后是否會有訂閱者,以及會有多少訂閱者,所以只能將消息轉發給當前的訂閱者,如果當前不存在任何訂閱,那么消息將被直接丟棄。
MQTT發布/訂閱模式有 4個主要組成部分:發布者、訂閱者、代理和主題。
發布者(Publisher):負責將消息發布到主題上,發布者一次只能向一個主題發送數據,發布者發布消息時也無需關心訂閱者是否在線。
訂閱者(Subscriber):訂閱者通過訂閱主題接收消息,且可一次訂閱多個主題。
代理(Broker):負責接收發布者的消息,并將消息轉發至符合條件的訂閱者。另外,代理也需要負責處理客戶端發起的連接、斷開連接、訂閱、取消訂閱等請求。
主題(Topic):主題是 MQTT進行消息路由的基礎,它類似 URL路徑,使用斜杠/進行分層,比如sensor/1/temperature。一個主題可以有多個訂閱者,代理會將該主題下的消息轉發給所有訂閱者;一個主題也可以有多個發布者,代理將按照消息到達的順序轉發。
MQTT協議的通信流程如下圖:

5 MQTT QoS詳解
QoS 0:消息最多傳遞一次,可能會丟失,且不做重試。這是最基本的QoS級別,不保證消息的傳送或順序。
使用場景:實時傳輸的更新數據,如溫度、濕度等,消息丟失對應用的影響較小。
QoS 1:消息至少傳送一次。為了確保消息到達,發送方會重復發送消息,直到收到接收方的確認應答(PUBACK)。可能會導致消息重復接收。
使用場景:電力監測數據,或需要確保狀態信息準確傳輸的應用場景。
QoS 2:確保消息只能被傳遞一次,且只傳遞一次。該級別保證了消息的可靠性、唯一性和順序性。通過四次握手過程確保消息不丟失、不會重復。
適用場景:高安全要求的應用,如支付系統、重要的設備控制等,不能容忍消息重復或丟失。
6 MQTT消息
在 MQTT中,客戶端可以在連接時在服務端中注冊一個遺囑消息,與普通消息類似,我們可以設置遺囑消息的主題、有效載荷等等。當該客戶端意外斷開連接,服務端就會向其他訂閱了相應主題的客戶端發送此遺囑消息。這些接收者也因此可以及時地采取行動。這一特性通常用于檢測和響應客戶端故障或掉線事件,特別適合在需要高可靠性的物聯網系統和實時監控場景中使用。
有關MQTT協議的報文,可以參考:Introduction · MQTT協議中文版,本文不再贅述。
7 OneNET物聯網平臺簡介
OneNET是由中國移動打造的物聯網開放平臺,在物聯網應用和真實設備之間搭建高效、穩定安全的應用平臺。該平臺支持適配各種網絡環境和協議類型,可實現各種傳感器和智能硬件的快速接提供豐富的 API和應用模板以支撐各類行業應用和智能硬件的開發。
8 OneNET物模型介紹
物模型是物聯網平臺中用于描述和管理設備能力的抽象模型,它定義了設備的屬性、行為和事件,使設備與平臺、應用之間的交互更加標準化和統一。在OneNET平臺中,物模型是設備管理與數據交互的核心概念,通過物模型,開發者可以方便地對設備進行建模、管理和使用。
9 MQTT連接OneNET收發數據流程
1.準備階段
注冊與實名認證:用戶需要在OneNET平臺注冊賬號,并完成實名認證。
創建產品和添加物模型:登錄阿里云物聯網平臺,創建產品并在產品下添加以下物模型功能。

創建設備:在剛剛創建的產品下創建一個設備。
2.記錄參數
連接參數:可在OneNET - 中國移動物聯網開放平臺官方文檔中找到MQTT協議所需的連接參數,從中可得:
服務器地址及端口和安全認證三要素:


clientld為我們創建的設備名,usemame為我們創建產品后平臺分配的產品ID,password則需使用token生成工具生成,工具說明及下載鏈接:OneNET - 中國移動物聯網開放平臺。
發布主題:$sys/{pid}/{device-name}/thing/property/post(屬性上報消息主題)
訂閱主題:$sys/{pid}/{device-name}/thing/property/post/reply(屬性上報響應主題)
訂閱主題:$sys/{pid}/{device-name}/thing/property/set(設置主題)
注意:上面兩個主題中的{pid}需要替換成產品ID,{device-name}替換成設備名。

3.連接、訂閱和發布消息
接著我們可以使用上面記錄的連接參數進行連接,當連接成功后,訂閱上面的訂閱主題。并通過發布主題上報物模型數據。
在OneNET平臺,如果產品創建階段選擇的數據格式為OneJson格式時,接收和發送數據格式都會遵守下面這個格式:
{
"id":"123",
"version":"1.0",
"params":{
"Power":{
"value":"on",
"time":1524448722123
},
"WF":{
"value":23.6,
"time":1524448722123
}
},
"method":"thing.{功能類型}.{方法}"
}
字段id是請求的唯一標識符,值為"123",用于跟蹤請求的響應;version表示OneJSON數據格式的版本號,這里為"1.0";params字段包含設備的屬性數據,包含了屬性標識符、對應的值和時間戳;method字段指定設備執行的操作類型,這里是thing.{功能類型}.{方法},用于指明設備進行的操作。
4.接收消息處理
接收消息:當接收到消息時,我們只需要按照上面的json格式進行解析,然后進行相應的處理即可。
10實現過程
接下來,我們看看在W55MH32上如何實現MQTT連接OneNET,并進行訂閱、發布消息以及接收消息處理。
注意:因為本示例需要訪問互聯網,請確保W55MH32的網絡環境及配置能夠正常訪問互聯網。
步驟一:初始化MQTT客戶端
mqttconn mqtt_params = {
.mqttHostUrl = "mqtts.heclouds.com",
.server_ip = {
0,
}, /*Define the Connection Server IP*/
.port = 1883, /*Define the connection service port number*/
.clientid = "W5100S_W5500", /*Define the client ID*/
.username = "70TwP2gxl5", /*Define the user name*/
.passwd = "version=2018-10-31&res=products%2F70TwP2gxl5%2Fdevices%2FW5100S_W5500&et=1791400694&method=sha1&sign=0SchVg6Y2MRYn%2B9zItNZwt%2F%2FN4Y%3D", /*Define user passwords*/
.pubtopic = "$sys/70TwP2gxl5/W5100S_W5500/thing/property/post", /*Define the publication message*/
.pubtopic_reply = "$sys/70TwP2gxl5/W5100S_W5500/thing/property/post/reply",
.subtopic = "$sys/70TwP2gxl5/W5100S_W5500/thing/property/set", /*Define subscription messages*/
.subtopic_reply = "$sys/70TwP2gxl5/W5100S_W5500/thing/property/set_reply",
.pubQoS = QOS0, /*Defines the class of service for publishing messages*/
.willtopic = "/wizchip/will", /*Define the topic of the will*/
.willQoS = QOS0, /*Defines the class of service for Will messages*/
.willmsg = "wizchip offline!", /*Define a will message*/
.subQoS = QOS0, /*Defines the class of service for subscription messages*/
};
/**
* @brief Initializing the MQTT client side
*
* Initialize the MQTT client side with the given parameters, including network configuration and MQTT connection parameters.
*
* @param sn socket number
* @param send_buf send buffer pointer
* @param recv_buf recv buffer pointer
*/
void mqtt_init(uint8_t sn, uint8_t *send_buf, uint8_t *recv_buf)
{
wiz_NetInfo get_info = {0};
wizchip_getnetinfo(&get_info);
/* DNS parsing */
if (do_dns(send_buf, (uint8_t *)mqtt_params.mqttHostUrl, mqtt_params.server_ip))
{
while (1)
{
}
}
NewNetwork(&n, sn); /*Obtain network configuration information*/
ConnectNetwork(&n, mqtt_params.server_ip, mqtt_params.port); /*Connect to the MQTT server*/
MQTTClientInit(&c, &n, 1000, send_buf, MQTT_ETHERNET_MAX_SIZE, recv_buf, MQTT_ETHERNET_MAX_SIZE);
data.willFlag = 0; /* will flag: If the will annotation bit is 0, the following will-related settings are invalid*/
willdata.qos = mqtt_params.willQoS; /* will QoS */
willdata.topicName.lenstring.data = mqtt_params.willtopic; /* will topic */
willdata.topicName.lenstring.len = strlen(willdata.topicName.lenstring.data); /* will topic len */
willdata.message.lenstring.data = mqtt_params.willmsg; /* will message */
willdata.message.lenstring.len = strlen(willdata.message.lenstring.data); /* will message len */
willdata.retained = 0;
willdata.struct_version = 3;
data.will = willdata;
data.MQTTVersion = 4;
data.clientID.cstring = mqtt_params.clientid;
data.username.cstring = mqtt_params.username;
data.password.cstring = mqtt_params.passwd;
data.keepAliveInterval = 30;
data.cleansession = 1;
}
修改為自己平臺的clientid和username以及passwd,還包括pubtopic和subtopic的產品和設備名的更改。
步驟二:主循環,處理MQTT相關操作(連接、發送、接收等)
while(1)
{
do_mqtt();
}
步驟三:進入do_mqtt()函數
void do_mqtt(void)
{
uint8_t ret;
switch (run_status)
{
case CONN:
{
// 連接到MQTT服務器
ret = MQTTConnect(&c, &data);
printf("Connect to the MQTT server: %d.%d.%d.%d:%drn",
mqtt_params.server_ip[0], mqtt_params.server_ip[1],
mqtt_params.server_ip[2], mqtt_params.server_ip[3],
mqtt_params.port);
printf("Connected:%srnrn", ret == SUCCESSS ? "success" : "failed");
if (ret != SUCCESSS)
{
run_status = ERR;
}
else
{
run_status = SUB;
}
break;
}
case SUB:
{
// 訂閱第一個主題
ret = MQTTSubscribe(&c, mqtt_params.subtopic, mqtt_params.subQoS, messageArrived);
printf("Subscribing to %srn", mqtt_params.subtopic);
printf("Subscribed:%srnrn", ret == SUCCESSS ? "success" : "failed");
if (ret != SUCCESSS)
{
run_status = ERR;
}
else
{
run_status = PUB_MESSAGE;
}
// 訂閱第二個主題(回復主題)
ret = MQTTSubscribe(&c, mqtt_params.pubtopic_reply, mqtt_params.subQoS, messageArrived);
printf("Subscribing to %srn", mqtt_params.pubtopic_reply);
printf("Subscribed:%srnrn", ret == SUCCESSS ? "success" : "failed");
if (ret != SUCCESSS)
{
run_status = ERR;
}
else
{
run_status = PUB_MESSAGE;
}
break;
}
case PUB_MESSAGE:
{
// 配置發布消息參數
pubmessage.qos = QOS0;
pubmessage.payload = "{"id":"123","version":"1.0","params":{"CurrentTemperature":{"value":26.6}}}";
pubmessage.payloadlen = strlen(pubmessage.payload);
// 發布消息
ret = MQTTPublish(&c, (char *)&(mqtt_params.pubtopic), &pubmessage);
if (ret != SUCCESSS)
{
run_status = ERR;
}
else
{
printf("publish:%s,%srnrn", mqtt_params.pubtopic, (char *)pubmessage.payload);
run_status = KEEPALIVE;
}
break;
}
case KEEPALIVE:
{
// 維持MQTT連接(心跳)
if (MQTTYield(&c, 30) != SUCCESSS)
{
run_status = ERR;
}
delay_ms(100);
break;
}
case RECV:
{
// 處理接收到的消息
if (mqtt_recv_flag)
{
mqtt_recv_flag = 0;
json_decode(mqtt_recv_msg); // 解析接收到的JSON消息
}
delay_ms(100);
break;
}
case ERR: /* 運行錯誤狀態 */
printf("system ERROR!");
delay_ms(1000);
break;
default:
break;
}
}
進入該函數后,程序首先嘗試連接到指定的MQTT服務器。如果連接成功,則進入訂閱狀態;如果連接失敗,則直接進入錯誤狀態并打印錯誤信息。
在訂閱狀態中,訂閱兩個主題:一個是用于接收消息的訂閱主題,另一個是用于發布回復的發布主題。如果這兩個主題都成功訂閱,則進入發布消息狀態;如果訂閱過程中出現失敗,則進入錯誤狀態并打印錯誤信息。
進入發布消息狀態后,構建一條消息并嘗試發布。如果發布成功,則進入保持連接狀態;如果發布失敗,則進入錯誤狀態并打印錯誤信息。
在保持連接狀態中,持續接收消息并檢查是否有需要處理的消息。如果有接收到需要處理的消息,則進行相應的處理。
在任何步驟中,如果發生錯誤,都會立即進入錯誤狀態,并打印出詳細的錯誤信息。
11運行結果
燒錄例程運行后,首先進行了PHY鏈路檢測,接著是通過DHCP獲取網絡地址信息和DNS解析服務器域名,然后連接服務器和訂閱主題,最后發送物模型數據,隨后就接收到OneNET平臺響應的上報成功的信息,此時查看平臺物模型數據已經得到更新顯示。如下圖所示:

然后我們使用ONENET平臺的在線設備調試功能,調試LWDSwish狀態,下發數據,此時W55MH32就接收到下發的消息并進行響應操作了,如下執行LED OFF:

12總結
本文講解了如何在 W55MH32芯片上實現 MQTT協議并連接 OneNET平臺,通過實戰例程展示了從準備工作、連接配置到消息訂閱、發布及接收處理的完整過程。文章詳細介紹了 MQTT協議的概念、特點、應用場景、發布 /訂閱模式、QoS級別,以及 OneNET物聯網平臺和物模型相關知識,幫助讀者理解其在物聯網設備與云端數據交互中的實際應用價值。
下一篇文章將講解如何在 W55MH32上實現多路 Socket設置為 TCP客戶端模式,并進行連接同一個服務器測試,解析多路 Socket連接的核心原理及應用,同時講解在 W55MH32上實現該功能的具體步驟與要點,敬請期待!
WIZnet是一家無晶圓廠半導體公司,成立于 1998年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU?面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有 70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
嵌入式
+關注
關注
5189文章
20192瀏覽量
329548 -
以太網
+關注
關注
41文章
5936瀏覽量
179763 -
MQTT
+關注
關注
5文章
726瀏覽量
24826
發布評論請先 登錄
科技賦能推動綠色低碳發展 第二十三屆高交會“環保”亮點看這里!
第二十三章 IWDG——獨立看門狗
火力發電廠水汽分析方法 第二十三部分:化學耗氧量的測定(重鉻
第二十三講 異步計數器
【正點原子FPGA連載】第二十三章RGB-LCD字符和圖片顯示實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1
烽火通信光纖技術獲“第二十三屆中國專利獎”銀獎
中國電子科技集團公司第二十三研究所選購我司炭黑含量測試儀
第十三章 W55MH32 UPnP端口轉發示例
第二十一章 W55MH32 PHY配置示例
第二十二章 W55MH32 MQTT&Aliyun示例
第二十六章 W55MH32?上位機搜索和配置示例
第二十七章 W55MH32?Interrupt示例
第二十九章 W55MH32 Modbus_TCP_Server示例

第二十三章 W55MH32 MQTT_OneNET示例
評論