單芯片解決方案,開啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來(lái)前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來(lái)說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲(chǔ)與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場(chǎng)景設(shè)計(jì)。它擁有66個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、5個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN、1個(gè)USB2.0以及1個(gè)SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對(duì)工業(yè)控制中多樣化的連接需求,無(wú)論是與各類傳感器、執(zhí)行器的通信,還是對(duì)復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場(chǎng)景,軟件使用方法一致。更多信息和資料請(qǐng)進(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ā)者全面評(píng)估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問官方網(wǎng)頁(yè):http://www.w5500.com/,我們期待與您共同探索W55MH32的無(wú)限可能。
第二十二章 W55MH32 MQTT&Aliyun示例
本篇文章,我們將詳細(xì)介紹如何在W55MH32芯片上面實(shí)現(xiàn)MQTT協(xié)議。并通過實(shí)戰(zhàn)例程,為大家講解如何使用W55MH32的MQTT協(xié)議連接阿里云平臺(tái),實(shí)現(xiàn)與阿里云物模型的數(shù)據(jù)交互。
該例程用到的其他網(wǎng)絡(luò)協(xié)議,例如DHCP和DNS,請(qǐng)參考相關(guān)章節(jié)。有關(guān) W55MH32的初始化過程,請(qǐng)參考Network Install章節(jié),這里將不再贅述。
1 MQTT簡(jiǎn)介
MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測(cè)傳輸協(xié)議)是一種輕量級(jí)的、基于發(fā)布/訂閱模式的消息傳輸協(xié)議,廣泛應(yīng)用于物聯(lián)網(wǎng)(IoT)領(lǐng)域,尤其是在網(wǎng)絡(luò)帶寬受限、設(shè)備資源有限的環(huán)境中。它由IBM在1999年提出,主要用于遠(yuǎn)程監(jiān)控和控制系統(tǒng)中的設(shè)備通信。MQTT協(xié)議具有低帶寬、低功耗、低延遲等優(yōu)點(diǎn),特別適用于嵌入式系統(tǒng)和物聯(lián)網(wǎng)設(shè)備的通信。
2 MQTT特點(diǎn)
輕量級(jí):MQTT協(xié)議采用極簡(jiǎn)的協(xié)議頭,減少了消息頭的大小,適合帶寬有限和計(jì)算資源有限的設(shè)備。
可靠性:MQTT支持三種服務(wù)質(zhì)量(QoS)級(jí)別,能夠確保數(shù)據(jù)可靠送達(dá)。
實(shí)時(shí)性:MQTT適合低延遲應(yīng)用場(chǎng)景,消息會(huì)盡可能地實(shí)時(shí)推送到訂閱者。
保留消息:MQTT支持“保留消息”功能,代理會(huì)保存最后一條發(fā)布的消息,當(dāng)有新設(shè)備訂閱某個(gè)主題時(shí),代理會(huì)立即發(fā)送保留的消息。
持久會(huì)話:MQTT允許客戶端在斷開后恢復(fù)會(huì)話狀態(tài),斷開期間的消息可以在客戶端重新連接后繼續(xù)接收。
3 MQTT應(yīng)用場(chǎng)景
工業(yè)自動(dòng)化:在工業(yè)環(huán)境中,生產(chǎn)設(shè)備、傳感器、控制器等都需要進(jìn)行數(shù)據(jù)交換,MQTT協(xié)議適用于在復(fù)雜的工業(yè)自動(dòng)化系統(tǒng)中提供實(shí)時(shí)通信。
智能電網(wǎng):智能電網(wǎng)應(yīng)用中,電力設(shè)備(如變電站、智能電表、開關(guān)設(shè)備等)通過以太網(wǎng)與控制中心進(jìn)行實(shí)時(shí)數(shù)據(jù)交換,使用MQTT協(xié)議進(jìn)行遠(yuǎn)程監(jiān)控和控制。
遠(yuǎn)程設(shè)備監(jiān)控與管理:適用于需要遠(yuǎn)程監(jiān)控和管理的設(shè)備,如遠(yuǎn)程氣象站、環(huán)境監(jiān)測(cè)設(shè)備等。通過MQTT協(xié)議實(shí)時(shí)獲取設(shè)備的傳感器數(shù)據(jù)。
4 MQTT發(fā)布/訂閱模式
發(fā)布訂閱模式(Publish-Subscribe Pattern)是一種消息傳遞模式,它將發(fā)送消息的客戶端(發(fā)布者)與接收消息的客戶端(訂閱者)解耦,使得兩者不需要建立直接的聯(lián)系也不需要知道對(duì)方的存在。
MQTT發(fā)布/訂閱模式的精髓在于由一個(gè)被稱為代理(Broker)的中間角色負(fù)責(zé)所有消息的路由和分發(fā)工作,發(fā)布者將帶有主題的消息發(fā)送給代理,訂閱者則向代理訂閱主題來(lái)接收感興趣的消息。
在 MQTT中,主題和訂閱無(wú)法被提前注冊(cè)或創(chuàng)建,所以代理也無(wú)法預(yù)知某一個(gè)主題之后是否會(huì)有訂閱者,以及會(huì)有多少訂閱者,所以只能將消息轉(zhuǎn)發(fā)給當(dāng)前的訂閱者,如果當(dāng)前不存在任何訂閱,那么消息將被直接丟棄。
MQTT發(fā)布/訂閱模式有 4個(gè)主要組成部分:發(fā)布者、訂閱者、代理和主題。
發(fā)布者(Publisher):負(fù)責(zé)將消息發(fā)布到主題上,發(fā)布者一次只能向一個(gè)主題發(fā)送數(shù)據(jù),發(fā)布者發(fā)布消息時(shí)也無(wú)需關(guān)心訂閱者是否在線。
訂閱者(Subscriber):訂閱者通過訂閱主題接收消息,且可一次訂閱多個(gè)主題。
代理(Broker):負(fù)責(zé)接收發(fā)布者的消息,并將消息轉(zhuǎn)發(fā)至符合條件的訂閱者。另外,代理也需要負(fù)責(zé)處理客戶端發(fā)起的連接、斷開連接、訂閱、取消訂閱等請(qǐng)求。
主題(Topic):主題是 MQTT進(jìn)行消息路由的基礎(chǔ),它類似 URL路徑,使用斜杠 /進(jìn)行分層,比如sensor/1/temperature。一個(gè)主題可以有多個(gè)訂閱者,代理會(huì)將該主題下的消息轉(zhuǎn)發(fā)給所有訂閱者;一個(gè)主題也可以有多個(gè)發(fā)布者,代理將按照消息到達(dá)的順序轉(zhuǎn)發(fā)。
MQTT協(xié)議的通信流程如下圖:
5 MQTT QoS詳解
QoS 0:消息最多傳遞一次,可能會(huì)丟失,且不做重試。這是最基本的QoS級(jí)別,不保證消息的傳送或順序。
使用場(chǎng)景:實(shí)時(shí)傳輸?shù)母聰?shù)據(jù),如溫度、濕度等,消息丟失對(duì)應(yīng)用的影響較小。
QoS 1:消息至少傳送一次。為了確保消息到達(dá),發(fā)送方會(huì)重復(fù)發(fā)送消息,直到收到接收方的確認(rèn)應(yīng)答(PUBACK)。可能會(huì)導(dǎo)致消息重復(fù)接收。
使用場(chǎng)景:電力監(jiān)測(cè)數(shù)據(jù),或需要確保狀態(tài)信息準(zhǔn)確傳輸?shù)膽?yīng)用場(chǎng)景。
QoS 2:確保消息只能被傳遞一次,且只傳遞一次。該級(jí)別保證了消息的可靠性、唯一性和順序性。通過四次握手過程確保消息不丟失、不會(huì)重復(fù)。
適用場(chǎng)景:高安全要求的應(yīng)用,如支付系統(tǒng)、重要的設(shè)備控制等,不能容忍消息重復(fù)或丟失。
6 MQTT消息
在 MQTT中,客戶端可以在連接時(shí)在服務(wù)端中注冊(cè)一個(gè)遺囑消息,與普通消息類似,我們可以設(shè)置遺囑消息的主題、有效載荷等等。當(dāng)該客戶端意外斷開連接,服務(wù)端就會(huì)向其他訂閱了相應(yīng)主題的客戶端發(fā)送此遺囑消息。這些接收者也因此可以及時(shí)地采取行動(dòng)。這一特性通常用于檢測(cè)和響應(yīng)客戶端故障或掉線事件,特別適合在需要高可靠性的物聯(lián)網(wǎng)系統(tǒng)和實(shí)時(shí)監(jiān)控場(chǎng)景中使用。
有關(guān)MQTT協(xié)議的報(bào)文,可以參考:Introduction · MQTT協(xié)議中文版,本文不再贅述。
7阿里云物聯(lián)網(wǎng)平臺(tái)簡(jiǎn)介
阿里云物聯(lián)網(wǎng)平臺(tái)(Alibaba Cloud IoT Platform)是阿里云推出的一款面向物聯(lián)網(wǎng)(IoT)行業(yè)的綜合性服務(wù)平臺(tái),旨在幫助企業(yè)實(shí)現(xiàn)物聯(lián)網(wǎng)設(shè)備的連接、管理、監(jiān)控和數(shù)據(jù)分析等多種功能。通過該平臺(tái),企業(yè)可以將各種智能設(shè)備接入云端,并進(jìn)行統(tǒng)一的管理和數(shù)據(jù)處理。
在設(shè)備接入上,支持 MQTT、CoAP 等多種協(xié)議,具備直連、網(wǎng)關(guān)代理等接入方式,能實(shí)現(xiàn)全球毫秒級(jí)就近接入。設(shè)備管理方面,覆蓋設(shè)備全生命周期,借助設(shè)備影子保障弱網(wǎng)下狀態(tài)一致,設(shè)備可靈活轉(zhuǎn)移歸屬。數(shù)據(jù)服務(wù)中,實(shí)現(xiàn)冷熱存儲(chǔ)分離,支持可視化數(shù)據(jù)解析與 EB級(jí)離線分析。監(jiān)控運(yùn)維能力強(qiáng),提供近百項(xiàng)監(jiān)控指標(biāo),能一鍵跟蹤消息流轉(zhuǎn),保障 OTA升級(jí)成功率。
8阿里云物模型介紹
阿里云物模型是阿里云物聯(lián)網(wǎng)平臺(tái)(IoT Platform)提供的一種用于描述和管理設(shè)備功能的抽象模型。物模型通過定義設(shè)備的屬性、服務(wù)和事件,幫助開發(fā)者統(tǒng)一描述設(shè)備能力,簡(jiǎn)化設(shè)備管理和數(shù)據(jù)交互流程。阿里云物模型是設(shè)備數(shù)字化管理的核心概念之一,廣泛應(yīng)用于智慧城市、工業(yè)物聯(lián)網(wǎng)、智能家居等領(lǐng)域。
9 MQTT連接阿里云收發(fā)數(shù)據(jù)流程
1.準(zhǔn)備階段
注冊(cè)與實(shí)名認(rèn)證:用戶需要在阿里云平臺(tái)注冊(cè)賬號(hào),并完成實(shí)名認(rèn)證。
創(chuàng)建產(chǎn)品和添加物模型:登錄阿里云物聯(lián)網(wǎng)平臺(tái),創(chuàng)建產(chǎn)品并在產(chǎn)品下添加以下物模型功能。
創(chuàng)建設(shè)備:在剛剛創(chuàng)建的產(chǎn)品下創(chuàng)建一個(gè)設(shè)備。
2.記錄參數(shù)
連接參數(shù):在剛剛創(chuàng)建的設(shè)備詳情頁(yè)中找到MQTT連接參數(shù)。
訂閱主題:/sys/ieojgBm5q2c/${deviceName}/thing/service/property/set(屬性設(shè)置主題)
發(fā)布主題:/sys/ieojgBm5q2c/${deviceName}/thing/event/property/post(上報(bào)消息主題)
注意:上面兩個(gè)主題中的${deviceName}需要替換成設(shè)備名。
3.連接、訂閱和發(fā)布消息
接著我們可以使用上面記錄的連接參數(shù)進(jìn)行連接,當(dāng)連接成功后,訂閱上面的訂閱主題。并通過發(fā)布主題上報(bào)物模型數(shù)據(jù)。
在阿里云平臺(tái),如果產(chǎn)品創(chuàng)建階段選擇的數(shù)據(jù)格式為Alink JSON格式時(shí),接收和發(fā)送數(shù)據(jù)格式都會(huì)遵守下面這個(gè)格式:
{ "method":"thing.event.property.post", "id":"2241348", "params":{ "prop_float":1.25, "prop_int16":4658, "prop_bool":1 }, "version":"1.0" }
method表示該消息的操作類型是上報(bào)設(shè)備屬性事件;id:值為"2241348",這是一個(gè)唯一的標(biāo)識(shí)符;params是一個(gè)包含設(shè)備屬性數(shù)據(jù)的對(duì)象用于上報(bào)物模型數(shù)據(jù);version:值為 "1.0",表示該消息所遵循的協(xié)議版本。
4.接收消息處理
接收消息:當(dāng)接收到消息時(shí),我們只需要按照上面的json格式進(jìn)行解析,然后進(jìn)行相應(yīng)的處理即可。
10實(shí)現(xiàn)過程
接下來(lái),我們看看在W55MH32上如何實(shí)現(xiàn)MQTT連接阿里云,并進(jìn)行訂閱、發(fā)布消息以及接收消息處理。
注意:因?yàn)楸臼纠枰L問互聯(lián)網(wǎng),請(qǐng)確保W55MH32的網(wǎng)絡(luò)環(huán)境及配置能夠正常訪問互聯(lián)網(wǎng)。
步驟1:注冊(cè)MQTT定時(shí)中斷函數(shù)MilliTimer_Handler()到1ms定時(shí)器中斷中
void TIM3_IRQHandler(void) { static uint32_t tim3_1ms_count = 0; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { tim3_1ms_count++; MilliTimer_Handler(); if (tim3_1ms_count >= 1000) { DHCP_time_handler(); DNS_time_handler(); tim3_1ms_count = 0; } TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }
步驟2:mqtt初始化
mqttconn mqtt_params = { .mqttHostUrl = "iot-06z00dbroeg8dx3.mqtt.iothub.aliyuncs.com", .server_ip = { 0, }, /*Define the Connection Server IP*/ .port = 1883, /*Define the connection service port number*/ .clientid = "ieojgBm5q2c.W55MH32|securemode=2,signmethod=hmacsha256,timestamp=1737098648080|", /*Define the client ID*/ .username = "W55MH32&ieojgBm5q2c", /*Define the user name*/ .passwd = "92c427a483f8bc09d20baf445505e319ae4d89ec94360710d23b8ab2f12c58c2", /*Define user passwords*/ .pubtopic = "/sys/ieojgBm5q2c/W55MH32/thing/event/property/post", /*Define the publication message*/ .subtopic = "/sys/ieojgBm5q2c/W55MH32/thing/service/property/set", /*Define subscription messages*/ .pubQoS = QOS0, /*Defines the class of service for publishing 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.will = willdata; 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.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; }
在這個(gè)函數(shù)中,需要傳入使用的socket號(hào)以及收發(fā)緩存數(shù)組。進(jìn)入初始化函數(shù)后,首先會(huì)使用DNS解析MQTT服務(wù)器域名,然后進(jìn)行MQTT參數(shù)初始化,將連接的參數(shù)填充到data結(jié)構(gòu)體中,在這里需要注意的是,當(dāng)data.willFlag=0時(shí),則是關(guān)閉遺囑主題功能,反之則為開啟。
data結(jié)構(gòu)體如下所示:
//data結(jié)構(gòu)體 typedef struct { /** The eyecatcher for this structure. must be MQTC. */ char struct_id[4]; /** The version number of this structure. Must be 0 */ int struct_version; /** Version of MQTT to be used. 3 = 3.1 4 = 3.1.1 */ unsigned char MQTTVersion; MQTTString clientID; unsigned short keepAliveInterval; unsigned char cleansession; unsigned char willFlag; MQTTPacket_willOptions will; MQTTString username; MQTTString password; } MQTTPacket_connectData; //willdata結(jié)構(gòu)體 /** * Defines the MQTT "Last Will and Testament" (LWT) settings for * the connect packet. */ typedef struct { /** The eyecatcher for this structure. must be MQTW. */ char struct_id[4]; /** The version number of this structure. Must be 0 */ int struct_version; /** The LWT topic to which the LWT message will be published. */ MQTTString topicName; /** The LWT payload. */ MQTTString message; /** * The retained flag for the LWT message (see MQTTAsync_message.retained). */ unsigned char retained; /** * The quality of service setting for the LWT message (see * MQTTAsync_message.qos and @ref qos). */ char qos; } MQTTPacket_willOptions;
步驟三:在主循環(huán)中執(zhí)行do_mqtt()函數(shù)
void do_mqtt(void) { uint8_t ret; switch (run_status) { case CONN: { ret = MQTTConnect(&c, &data); /* Connect to the MQTT server */ 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); /* Subscribe to Topics */ 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; } break; } case PUB_MESSAGE: { pubmessage.qos = QOS0; pubmessage.payload = "{"id":"123","version":"1.0","params":{"CurrentTemperature":26.6,},"method":"thing.event.property.post"}"; pubmessage.payloadlen = strlen(pubmessage.payload); ret = MQTTPublish(&c, (char *)&(mqtt_params.pubtopic), &pubmessage); /* Publish message */ if (ret != SUCCESSS) { run_status = ERR; } else { printf("publish:%s,%srnrn", mqtt_params.pubtopic, (char *)pubmessage.payload); run_status = KEEPALIVE; } break; } case KEEPALIVE: { if (MQTTYield(&c, 30) != SUCCESSS) /* keepalive MQTT */ { run_status = ERR; } } case RECV: { if (mqtt_recv_flag) { mqtt_recv_flag = 0; json_decode(mqtt_recv_msg); } break; } case ERR: /* Running error */ printf("system ERROR!"); delay_ms(1000); break; default: break; } }
do_mqtt()函數(shù)會(huì)執(zhí)行一個(gè)狀態(tài)機(jī),按照以下步驟進(jìn)行工作:
CONN:執(zhí)行連接操作,使用我們初始化好的參數(shù)使用MQTTConnect()函數(shù)去執(zhí)行連接服務(wù)器操作,連接成功后進(jìn)入訂閱主題步驟。
SUB:在這一步,我們會(huì)使用MQTTSubscribe()函數(shù)訂閱阿里云的物模型設(shè)置屬性主題,在這個(gè)函數(shù)中,需要傳入客戶端結(jié)構(gòu)體,訂閱的主題名稱,訂閱的QoS等級(jí),以及訂閱主題的回調(diào)函數(shù)messageArrived()。訂閱成功后進(jìn)入發(fā)布消息步驟。
在收到訂閱主題的消息后,會(huì)執(zhí)行回調(diào)函數(shù)messageArrived(),在這里我們打印出接收到的消息主題以及消息內(nèi)容,并將消息拷貝到mqtt_recv_msg數(shù)組中,具體函數(shù)內(nèi)容如下:
void TIM3_IRQHandler(void) { static uint32_t tim3_1ms_count = 0; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { tim3_1ms_count++; MilliTimer_Handler(); if (tim3_1ms_count >= 1000) { DHCP_time_handler(); DNS_time_handler(); tim3_1ms_count = 0; } TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }
PUB_MESSAGE:在這一步,我們會(huì)發(fā)布一個(gè)當(dāng)前溫度到阿里云的物模型中。成功后進(jìn)入?;詈徒邮諗?shù)據(jù)部分。
KEEPALIVE和RECV:在這一步,會(huì)不斷執(zhí)行?;詈捅O(jiān)聽接收操作,當(dāng)收到數(shù)據(jù)之后,會(huì)進(jìn)入json_decode()函數(shù)進(jìn)行處理。
json_decode()函數(shù)主要是使用CJSON將接收到的數(shù)據(jù)進(jìn)行解析,然后執(zhí)行對(duì)應(yīng)的操作,具體內(nèi)容如下:
void TIM3_IRQHandler(void) { static uint32_t tim3_1ms_count = 0; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { tim3_1ms_count++; MilliTimer_Handler(); if (tim3_1ms_count >= 1000) { DHCP_time_handler(); DNS_time_handler(); tim3_1ms_count = 0; } TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }
11運(yùn)行結(jié)果
燒錄例程運(yùn)行后,首先進(jìn)行了PHY鏈路檢測(cè),然后通過DHCP打印設(shè)置網(wǎng)絡(luò)信息,最后連接MQTT服務(wù)器進(jìn)行回環(huán)測(cè)試,如下圖所示:
12總結(jié)
本文講解了如何在 W55MH32芯片上實(shí)現(xiàn) MQTT協(xié)議并連接阿里云平臺(tái),通過實(shí)戰(zhàn)例程展示了從準(zhǔn)備工作、連接配置到消息訂閱、發(fā)布及接收處理的完整過程。文章詳細(xì)介紹了 MQTT協(xié)議的概念、特點(diǎn)、應(yīng)用場(chǎng)景、發(fā)布 /訂閱模式、QoS級(jí)別,以及阿里云物聯(lián)網(wǎng)平臺(tái)和物模型相關(guān)知識(shí),幫助讀者理解其在物聯(lián)網(wǎng)設(shè)備與云端數(shù)據(jù)交互中的實(shí)際應(yīng)用價(jià)值。
下一篇文章將講解如何在W55MH32上實(shí)現(xiàn)MQTT協(xié)議并連接OneNET平臺(tái),并實(shí)現(xiàn)與OneNET物模型的數(shù)據(jù)交互,敬請(qǐng)期待!
WIZnet是一家無(wú)晶圓廠半導(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多家分銷商,在香港、韓國(guó)、美國(guó)設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營(yíng)銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國(guó)和日本除外)。
審核編輯 黃宇
-
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
5866瀏覽量
178598 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2938文章
46924瀏覽量
402488 -
MQTT
+關(guān)注
關(guān)注
5文章
708瀏覽量
24422
發(fā)布評(píng)論請(qǐng)先 登錄
第二十二章 TIM——高級(jí)定時(shí)器

第二十二章 USB 全速設(shè)備接口(USB)

實(shí)時(shí)頻譜儀原理及操作指南
第二十二講 同步時(shí)序邏輯電路的分析方法

模擬電路網(wǎng)絡(luò)課件 第二十二節(jié):功率放大電路的一般問題
第二章 W55MH32 DHCP示例

第九章 W55MH32 HTTP Server示例

第十二章 W55MH32 NetBIOS示例

第二十一章 W55MH32 PHY配置示例

第二十三章 W55MH32 MQTT_OneNET示例

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

第二十七章 W55MH32?Interrupt示例

第二十九章 W55MH32 Modbus_TCP_Server示例

第三十章 W55MH32 HTTP_Server&amp;NetBIOS示例

評(píng)論