MQTT 是當(dāng)前最主流的物聯(lián)網(wǎng)通信協(xié)議,需要物聯(lián)網(wǎng)云平臺,例如華為云、阿里云、移動 OneNET 都支持 MQTT。而 Hi3861則是一款專為 IoT 應(yīng)用場景打造的芯片。
本節(jié)主要講如何在鴻蒙系統(tǒng)中通過移植第 3 方軟件包 Paho-MQTT 去實(shí)現(xiàn) MQTT 協(xié)議功能,最后會給出測試驗(yàn)證。為后續(xù)的物聯(lián)網(wǎng)項(xiàng)目打好基礎(chǔ)。
友情預(yù)告,本節(jié)內(nèi)容較多,源碼也貼出來了,大家最好先看一遍,然后再操作一次。
相關(guān)源碼已經(jīng)打包上傳,順便上傳了一個測試 OK 的固件,大家可以直接下載附件直接測試。解壓后會得到 5 個壓縮包,繼續(xù)解壓即可:
MQTT 介紹
MQTT 全稱為 Message Queuing Telemetry Transport(消息隊(duì)列遙測傳輸)是一種基于發(fā)布/訂閱范式的二進(jìn)制“輕量級”消息協(xié)議,由 IBM 公司發(fā)布。針對于網(wǎng)絡(luò)受限和嵌入式設(shè)備而設(shè)計(jì)的一種數(shù)據(jù)傳輸協(xié)議。
MQTT 最大優(yōu)點(diǎn)在于,可以以極少的代碼和有限的帶寬,為連接遠(yuǎn)程設(shè)備提供實(shí)時可靠的消息服務(wù)。
作為一種低開銷、低帶寬占用的即時通訊協(xié)議,使其在物聯(lián)網(wǎng)、小型設(shè)備、移動應(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 下載之后解壓,會得到這么一個文件夾:
我們在鴻蒙系統(tǒng)源碼的 third_party 文件夾下創(chuàng)建一個 pahomqtt 文件夾,然后把解壓后的所有文件都拷貝到 pahomqtt 文件夾下。
目錄結(jié)構(gòu)大致如下:
下一步,我們在 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編譯的時候,編譯 paho mqtt軟件包
打開 vendorhisihi3861hi3861BUILD.gn 文件。
在 lite_component("sdk") 中增加 "http://third_party/pahomqtt:pahomqtt_static"。
修改后文件內(nèi)容如下:
完成以上修改后,就可以開始編譯了,然而很不幸的...你會發(fā)現(xiàn)好多編譯報錯。
不過沒事,我們來一個一個解決。
移植,修改編譯報錯
打開 third_partypahomqttMQTTPacketsamples ransport.c 文件,這個文件也是我們主要移植的文件,我們需要實(shí)現(xiàn) socket 相關(guān)的操作,包括發(fā)送、接收數(shù)據(jù)。
其實(shí)移植就 3 步:
①首先我們導(dǎo)入幾個頭文件:
#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; }
③后面編譯的時候會報錯說 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 文件后,大家編譯的時候估計(jì)會遇到很多編譯錯誤,都是某個局部變量未使用那種,大家可以修改就行。
類似于這樣的,提示 buflen 未使用的錯誤,大家只需要在代碼中隨便寫個buflen = buflen; 即可。
編寫測試代碼
測試代碼比較好寫。主要是 3 個文件,內(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 文件主要是注冊了一個 AT 指令,后面大家可以使用 AT+MQTTTEST 指令來測試 MQTT 功能
代碼內(nèi)容如下:
#include
③mqtt_test.c 文件則是編寫了一個簡單的 MQTT 測試代碼,具體代碼講解,后面會重新開一篇
其中測試用的 mqtt 服務(wù)器是我自己的服務(wù)器:106.13.62.194,大家也可以改成自己的,也可以直接用我個人的 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)
這里我們需要先下載一個 Windows 電腦端的 MQTT 客戶端,這樣我們就可以用電腦訂閱開發(fā)板的 MQTT 主題信息了。
電腦版的 mqtt 客戶端下載鏈接:
https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.ui.app/1.1.1/ 我們選擇這一個:
弄完后打開軟件,按圖操作:
操作完后,我們把編譯后程序燒寫到開發(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)該如下:
成功連接上路由器后,請確保路由器是可以上網(wǎng)的。然后我們輸入我們的 MQTT 測試的 AT 指令:AT+MQTTTEST。
應(yīng)該可以看到如下打印:
此時我們?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。
編寫測試代碼,這里我們用的是注冊 AT 指令的方式,方便大家使用AT指令測試。
測試,這里用電腦裝 mqtt 客戶端程序,去驗(yàn)證。
責(zé)任編輯:PSY
原文標(biāo)題:如何在鴻蒙系統(tǒng)中移植Paho-MQTT實(shí)現(xiàn)MQTT協(xié)議
文章出處:【微信公眾號:HarmonyOS技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
MQTT
+關(guān)注
關(guān)注
5文章
651瀏覽量
22522 -
MQTT協(xié)議
+關(guān)注
關(guān)注
0文章
97瀏覽量
5400 -
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2634瀏覽量
66365
原文標(biāo)題:如何在鴻蒙系統(tǒng)中移植Paho-MQTT實(shí)現(xiàn)MQTT協(xié)議
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論