MQTT 是當(dāng)前最主流的物聯(lián)網(wǎng)通信協(xié)議,需要物聯(lián)網(wǎng)云平臺(tái),例如華為云、阿里云、移動(dòng) OneNET 都支持 MQTT。而 Hi3861則是一款專為 IoT 應(yīng)用場(chǎng)景打造的芯片。
本節(jié)主要講如何在鴻蒙系統(tǒng)中通過移植第 3 方軟件包 Paho-MQTT 去實(shí)現(xiàn) MQTT 協(xié)議功能,最后會(huì)給出測(cè)試驗(yàn)證。為后續(xù)的物聯(lián)網(wǎng)項(xiàng)目打好基礎(chǔ)。
友情預(yù)告,本節(jié)內(nèi)容較多,源碼也貼出來了,大家最好先看一遍,然后再操作一次。
相關(guān)源碼已經(jīng)打包上傳,順便上傳了一個(gè)測(cè)試 OK 的固件,大家可以直接下載附件直接測(cè)試。解壓后會(huì)得到 5 個(gè)壓縮包,繼續(xù)解壓即可:

MQTT 介紹
MQTT 全稱為 Message Queuing Telemetry Transport(消息隊(duì)列遙測(cè)傳輸)是一種基于發(fā)布/訂閱范式的二進(jìn)制“輕量級(jí)”消息協(xié)議,由 IBM 公司發(fā)布。針對(duì)于網(wǎng)絡(luò)受限和嵌入式設(shè)備而設(shè)計(jì)的一種數(shù)據(jù)傳輸協(xié)議。
MQTT 最大優(yōu)點(diǎn)在于,可以以極少的代碼和有限的帶寬,為連接遠(yuǎn)程設(shè)備提供實(shí)時(shí)可靠的消息服務(wù)。
作為一種低開銷、低帶寬占用的即時(shí)通訊協(xié)議,使其在物聯(lián)網(wǎng)、小型設(shè)備、移動(dòng)應(yīng)用等方面有較廣泛的應(yīng)用。
MQTT 模型如圖所示:

更多 MQTT 協(xié)議的介紹見上篇文章:MQTT 協(xié)議開發(fā)入門。
移植 Paho-MQTT 軟件包
下載 paho mqtt 軟件包,添加到鴻蒙代碼中
paho mqtt-c 是基于 C 語言實(shí)現(xiàn)的 MQTT 客戶端,非常適合用在嵌入式設(shè)備上。
首先下載源碼:
https://github.com/eclipse/paho.mqtt.embedded-c 下載之后解壓,會(huì)得到這么一個(gè)文件夾:

我們?cè)邙櫭上到y(tǒng)源碼的 third_party 文件夾下創(chuàng)建一個(gè) pahomqtt 文件夾,然后把解壓后的所有文件都拷貝到 pahomqtt 文件夾下。
目錄結(jié)構(gòu)大致如下:

下一步,我們?cè)?pahomqtt 文件夾下面新建 BUILD.gn 文件,用來構(gòu)建編譯。
其內(nèi)容如下:
#Copyright(c)2020HuaweiDeviceCo.,Ltd. #LicensedundertheApacheLicense,Version2.0(the"License"); #youmaynotusethisfileexceptincompliancewiththeLicense. #YoumayobtainacopyoftheLicenseat # #http://www.apache.org/licenses/LICENSE-2.0 # #Unlessrequiredbyapplicablelaworagreedtoinwriting,software #distributedundertheLicenseisdistributedonan"ASIS"BASIS, #WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied. #SeetheLicenseforthespecificlanguagegoverningpermissionsand #limitationsundertheLicense. import("http://build/lite/config/component/lite_component.gni") import("http://build/lite/ndk/ndk.gni") config("pahomqtt_config"){ include_dirs=[ "MQTTPacket/src", "MQTTPacket/samples", "http://vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include", "http://kernel/liteos_m/components/cmsis/2.0", ] } pahomqtt_sources=[ "MQTTPacket/samples/transport.c", "MQTTPacket/src/MQTTConnectClient.c", "MQTTPacket/src/MQTTConnectServer.c", "MQTTPacket/src/MQTTDeserializePublish.c", "MQTTPacket/src/MQTTFormat.c", "MQTTPacket/src/MQTTPacket.c", "MQTTPacket/src/MQTTSerializePublish.c", "MQTTPacket/src/MQTTSubscribeClient.c", "MQTTPacket/src/MQTTSubscribeServer.c", "MQTTPacket/src/MQTTUnsubscribeClient.c", "MQTTPacket/src/MQTTUnsubscribeServer.c", ] lite_library("pahomqtt_static"){ target_type="static_library" sources=pahomqtt_sources public_configs=[":pahomqtt_config"] } lite_library("pahomqtt_shared"){ target_type="shared_library" sources=pahomqtt_sources public_configs=[":pahomqtt_config"] } ndk_lib("pahomqtt_ndk"){ if(board_name!="hi3861v100"){ lib_extension=".so" deps=[ ":pahomqtt_shared" ] }else{ deps=[ ":pahomqtt_static" ] } head_files=[ "http://third_party/pahomqtt" ] }
讓 hi3861編譯的時(shí)候,編譯 paho mqtt軟件包
打開 vendorhisihi3861hi3861BUILD.gn 文件。
在 lite_component("sdk") 中增加 "http://third_party/pahomqtt:pahomqtt_static"。
修改后文件內(nèi)容如下:

完成以上修改后,就可以開始編譯了,然而很不幸的...你會(huì)發(fā)現(xiàn)好多編譯報(bào)錯(cuò)。
不過沒事,我們來一個(gè)一個(gè)解決。
移植,修改編譯報(bào)錯(cuò)
打開 third_partypahomqttMQTTPacketsamples ransport.c 文件,這個(gè)文件也是我們主要移植的文件,我們需要實(shí)現(xiàn) socket 相關(guān)的操作,包括發(fā)送、接收數(shù)據(jù)。
其實(shí)移植就 3 步:
①首先我們導(dǎo)入幾個(gè)頭文件:
#include"lwip/ip_addr.h" #include"lwip/netifapi.h" #include"lwip/sockets.h" ②其次修改 transport_sendPacketBuffer 函數(shù),內(nèi)容修改后如下:inttransport_sendPacketBuffer(intsock,unsignedchar*buf,intbuflen) { intrc=0; rc=send(sock,buf,buflen,0); returnrc; }
③后面編譯的時(shí)候會(huì)報(bào)錯(cuò)說 close 函數(shù)不存在,我們修改 transport_close 函數(shù),修改后內(nèi)容如下:
inttransport_close(intsock) { intrc; rc=shutdown(sock,SHUT_WR); rc=recv(sock,NULL,(size_t)0,0); rc=lwip_close(sock); returnrc; }
④修改完 transport.c 文件后,大家編譯的時(shí)候估計(jì)會(huì)遇到很多編譯錯(cuò)誤,都是某個(gè)局部變量未使用那種,大家可以修改就行。
類似于這樣的,提示 buflen 未使用的錯(cuò)誤,大家只需要在代碼中隨便寫個(gè)buflen = buflen; 即可。

編寫測(cè)試代碼
測(cè)試代碼比較好寫。主要是 3 個(gè)文件,內(nèi)容我都貼出來了:

①BUILD.gn 文件內(nèi)容
#Copyright(c)2020HuaweiDeviceCo.,Ltd. #LicensedundertheApacheLicense,Version2.0(the"License"); #youmaynotusethisfileexceptincompliancewiththeLicense. #YoumayobtainacopyoftheLicenseat # #http://www.apache.org/licenses/LICENSE-2.0 # #Unlessrequiredbyapplicablelaworagreedtoinwriting,software #distributedundertheLicenseisdistributedonan"ASIS"BASIS, #WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied. #SeetheLicenseforthespecificlanguagegoverningpermissionsand #limitationsundertheLicense. static_library("mqtt_test_at"){ sources=[ "mqtt_test.c", "at_entry.c" ] include_dirs=[ "http://utils/native/lite/include", "http://kernel/liteos_m/components/cmsis/2.0", "http://base/iot_hardware/interfaces/kits/wifiiot_lite", "http://vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include", "http://foundation/communication/interfaces/kits/wifi_lite/wifiservice", "http://third_party/pahomqtt/MQTTPacket/src", "http://third_party/pahomqtt/MQTTPacket/samples", "http://vendorhisihi3861hi3861componentsatsrc" ] }
②at_entry.c 文件主要是注冊(cè)了一個(gè) AT 指令,后面大家可以使用 AT+MQTTTEST 指令來測(cè)試 MQTT 功能
代碼內(nèi)容如下:
#include
③mqtt_test.c 文件則是編寫了一個(gè)簡(jiǎn)單的 MQTT 測(cè)試代碼,具體代碼講解,后面會(huì)重新開一篇
其中測(cè)試用的 mqtt 服務(wù)器是我自己的服務(wù)器:106.13.62.194,大家也可以改成自己的,也可以直接用我個(gè)人的 mqtt 服務(wù)器。
#include
mqtt_test.h 文件內(nèi)容:
#ifndef__MQTT_TEST_H__ #define__MQTT_TEST_H__ voidmqtt_test(void); #endif/*__MQTT_TEST_H__*/
到這里就完成了代碼部分,可以開始編譯了。
MQTT 實(shí)驗(yàn)
這里我們需要先下載一個(gè) Windows 電腦端的 MQTT 客戶端,這樣我們就可以用電腦訂閱開發(fā)板的 MQTT 主題信息了。
電腦版的 mqtt 客戶端下載鏈接:
https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.ui.app/1.1.1/ 我們選擇這一個(gè):

弄完后打開軟件,按圖操作:

操作完后,我們把編譯后程序燒寫到開發(fā)板,輸入如下串口指令,讓開發(fā)板連接上網(wǎng)絡(luò),因?yàn)?MQTT 功能需要網(wǎng)絡(luò)支持。
輸入如下串口指令:
AT+STARTSTA開啟STA模式 AT+CONN="12-203",,2,"07686582488"連接到路由器,注意wifi熱點(diǎn)名和密碼用自己的 AT+DHCP=wlan0,1獲取IP地址 AT+IFCFG打印查看IP地址 串口指令的應(yīng)答應(yīng)該如下:

成功連接上路由器后,請(qǐng)確保路由器是可以上網(wǎng)的。然后我們輸入我們的 MQTT 測(cè)試的 AT 指令:AT+MQTTTEST。
應(yīng)該可以看到如下打印:

此時(shí)我們?nèi)ゲ榭?我們電腦端的 MQTT 客戶端軟件,可以看到右邊已經(jīng)有接收 MQTT 信息了,主題未 pubtopic,消息內(nèi)容為 hello HarmonyOS ! 說明實(shí)驗(yàn)成功。

總結(jié)
這一次的內(nèi)容比較多,其中總結(jié)起來就 4 步:
添加第三方軟件包 paho mqtt,關(guān)于如何添加第3方軟件包,我之前有一篇文章已經(jīng)講了。可以參考:如何往鴻蒙系統(tǒng)源碼中添加第三方軟件包。
移植 paho mqtt。
編寫測(cè)試代碼,這里我們用的是注冊(cè) AT 指令的方式,方便大家使用AT指令測(cè)試。
測(cè)試,這里用電腦裝 mqtt 客戶端程序,去驗(yàn)證。
責(zé)任編輯:PSY
原文標(biāo)題:如何在鴻蒙系統(tǒng)中移植Paho-MQTT實(shí)現(xiàn)MQTT協(xié)議
文章出處:【微信公眾號(hào):HarmonyOS技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
MQTT
+關(guān)注
關(guān)注
5文章
733瀏覽量
25062 -
MQTT協(xié)議
+關(guān)注
關(guān)注
0文章
104瀏覽量
6531 -
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2642瀏覽量
69828
原文標(biāo)題:如何在鴻蒙系統(tǒng)中移植Paho-MQTT實(shí)現(xiàn)MQTT協(xié)議
文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于LuatOS的MQTT物聯(lián)網(wǎng)通信全解
MQTT協(xié)議為什么成為物聯(lián)網(wǎng)協(xié)議
MQTT網(wǎng)關(guān)支持5G通信嗎
paho-mqtt pipe和socket同時(shí)發(fā)送會(huì)導(dǎo)致pipe數(shù)據(jù)丟失怎么解決?
使用paho-mqtt里例程連接服務(wù)器失敗怎么解決?
Vision Board開發(fā)板使用paho_mqtt連接阿里云失敗是什么原因呢?
【HZ-RK3568開發(fā)板免費(fèi)體驗(yàn)】MQTT服務(wù)搭建與客戶端移植
物聯(lián)網(wǎng)MQTT網(wǎng)關(guān)是什么
GraniStudio :MQTT 協(xié)議的深度剖析
精通 MQTT:消息隊(duì)列遙測(cè)傳輸指南!
在 MQTT 回調(diào)處理程序中遇到了隨機(jī) MQTT 斷開連接的問題,怎么解決?
MQTT為何成為物聯(lián)網(wǎng)協(xié)議
KaihongOS操作系統(tǒng):MQTT物聯(lián)網(wǎng)通訊協(xié)議
MQTT物聯(lián)網(wǎng)平臺(tái)有哪些?有哪些功能?
在鴻蒙系統(tǒng)中移植Paho-MQTT實(shí)現(xiàn)MQTT協(xié)議的詳細(xì)教程
評(píng)論