當前位置:首頁 > 單片機 > 單片機
[導讀]最近項目需要,stm32上面使用到mqtt了,百度了下,發(fā)現(xiàn)網(wǎng)上資料還是挺少的,雖然有幾份相關(guān)的資料,下載下來之后,看到了mqtt的底層代碼竟然還有錯誤,這個問題導致了我后面一直調(diào)試不通,后來,我直接從官方下載了m

最近項目需要,stm32上面使用到mqtt了,百度了下,發(fā)現(xiàn)網(wǎng)上資料還是挺少的,雖然有幾份相關(guān)的資料,下載下來之后,看到了mqtt的底層代碼竟然還有錯誤,這個問題導致了我后面一直調(diào)試不通,后來,我直接從官方下載了mqtt的源碼用比較器比較后找到了原因,最后果斷將官方的mqtt底層代碼移植上來,mqtt的發(fā)布還是比較順利,訂閱雖然可以收到消息,但是由于沒有移植os,發(fā)布消息時,訂閱接受有時無法收到消息,這個還在優(yōu)化,我使用的是stm32f103c8t6平臺+w5500.其實只要帶以太網(wǎng)接口就行。首先我們從mqtt官方下載源碼
http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.embedded-c.git/refs/
下載后將MQTTPacket下面的src文件都加入到自己的MDK工程中。


如果采用W5500的話,最好先用官方的TCP例子將TCP調(diào)試通,而且能保證訪問外網(wǎng),可以借鑒下網(wǎng)上那個STM32F405+W5500的例子,我覺得那個還是挺好的,我也是主要借鑒了那個例子,不過我還是不太喜歡他把TCP的建立封裝到mqtt里面,一開始我也是采用他那種方法,不過一直出錯,后來我采用了狀態(tài)機實現(xiàn),先讓TCP和mqtt服務(wù)器建立TCP連接在調(diào)用mqtt的連接,發(fā)布等API,這樣比較好調(diào)試。調(diào)試的話,我采用的是下面那個頁面調(diào)試的http://m2m.demos.ibm.com/mqttclient/#log

其實真正要你實現(xiàn)的mqtt接口,主要是transport.c里面的幾個API
int transport_sendPacketBuffer(unsigned char* buf, int buflen)
{
return send(SOCK_MQTT,buf,buflen);
}
/**
* @brief×èè?·?ê??óê?TCP·t???÷·¢?íμ?êy?Y
* @parambuf êy?Y′?′¢ê×μ??·
* @paramcount êy?Y?o3???3¤?è
* @retval D?óú0±íê??óê?êy?Y꧰ü
*/
int transport_getdata(unsigned char* buf, int count)
{
return recv(SOCK_MQTT,buf,count);
}


/**
* @brief′ò?aò???socket2¢á??óμ?·t???÷
* @param?T
* @retval D?óú0±íê?′ò?a꧰ü
*/
int transport_open(void)
{
int32_t ret;
//D??¨ò???Socket2¢°ó?¨±?μ????ú5000
ret = socket(SOCK_MQTT,Sn_MR_TCP,4500,Sn_MR_ND);
if(ret != SOCK_OK){
printf("%d:Socket Errorrn",SOCK_MQTT);
}else{
printf("%d:Openedrn",SOCK_MQTT);
}

//á??óTCP·t???÷
ret = connect(SOCK_MQTT,domain_ip,1883);//???ú±?D??a1883
if(ret != SOCK_OK){
printf("%d:Socket Connect Errorrn",SOCK_MQTT);
}else{
printf("%d:Connectedrn",SOCK_MQTT);
}
return ret;
}
/**
* @brief1?±?socket
* @param?T
* @retval D?óú0±íê?1?±?꧰ü
*/
int transport_close(void)
{
close(SOCK_MQTT);
return 0;
}

以上的其實transport_open(void)我沒調(diào)用,讓狀態(tài)機來實現(xiàn)了這步。
int mqtt_publish(char *pTopic,char *pMessage)
{
int32_t len,rc;
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
unsigned char buf[200];
MQTTString topicString = MQTTString_initializer;
int msglen = strlen(pMessage);
int buflen = sizeof(buf);
data.clientID.cstring = "Client74925";
data.keepAliveInterval = 15;
data.cleansession = 1;
len = MQTTSerialize_connect(buf, buflen, &data); /* 1 */
topicString.cstring = pTopic;
len += MQTTSerialize_publish(buf + len, buflen - len, 0, 0, 0, 0, topicString, (unsigned char*)pMessage, msglen); /* 2 */
len += MQTTSerialize_disconnect(buf + len, buflen - len); /* 3 */
rc = transport_sendPacketBuffer(buf,len);
if (rc == len)
printf("Successfully publishednr");
else
printf("Publish failednr");
return 0;
}

=========================================

void do_tcp_client(void)
{
uint8 connect_State = 0;
uint16 len1;
switch(getSn_SR(SOCK_MQTT)) /*??è?socketμ?×′ì?*/
{
case SOCK_CLOSED: /*socket′|óú1?±?×′ì?*/
socket(SOCK_MQTT,Sn_MR_TCP,local_port++,Sn_MR_ND);
break;
case SOCK_INIT: /*socket′|óú3?ê??ˉ×′ì?*/
connect(SOCK_MQTT,domain_ip,1883); /*socketá??ó·t???÷*/
break;
case SOCK_ESTABLISHED: /*socket′|óúá??ó?¨á¢×′ì?*/
memset(buff,0,500);
#if 0
connect_State=mqtt_subscrib("planets/earth",buff);
if(connect_State)
{
printf("%s",buff);

}
#endif
if(heartbeatflag>=TIME_5S)
{
heartbeatflag=0;
mqtt_publish("planets/earth","firstName: Brett, lastName:McLaughlin,email:aaaa");
}
break;
case SOCK_CLOSE_WAIT: /*socket′|óúμè′y1?±?×′ì?*/
close(SOCK_MQTT);
break;

}
}
上面的發(fā)布我每5s發(fā)送一條消息,公司的電腦加密了,無法截圖,只能copy下網(wǎng)頁測試的數(shù)據(jù)
============================================================================
(06:23:57.487) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:02.492) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:02.810) >> [planets/earth][retained] Hello world!(06:24:02.810) Subscribed to [planets/earth][qos 0](06:24:07.501) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:12.497) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:17.490) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:22.490) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:27.491) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:32.481) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:37.490) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:42.497) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa(06:24:47.491) >> [planets/earth] firstName: Brett, lastName:McLaughlin,email:aaaa
訂閱消息的函數(shù)目前暫且不公布,主要是還在優(yōu)化,其次我覺得有點雞肋,以其誤導大伙,還不如不公開~~~~~~~~~~~~,如果大伙覺得有意思,可以把mqtt的ping也加上去,如果實用的話,這個還需要加入很多容錯機制~~~~~~~~~~~~

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉