MQTT 是當(dāng)前最主流的物聯(lián)網(wǎng)通信協(xié)議,需要物聯(lián)網(wǎng)云平臺(tái),例如華為云、阿里云、移動(dòng) OneNET 都支持 MQTT。而 Hi3861則是一款專(zhuān)為 IoT 應(yīng)用場(chǎng)景打造的芯片。
本節(jié)主要講如何在鴻蒙系統(tǒng)中通過(guò)移植第 3 方軟件包 Paho-MQTT 去實(shí)現(xiàn) MQTT 協(xié)議功能,最后會(huì)給出測(cè)試驗(yàn)證。為后續(xù)的物聯(lián)網(wǎng)項(xiàng)目打好基礎(chǔ)。
友情預(yù)告,本節(jié)內(nèi)容較多,源碼也貼出來(lái)了,大家最好先看一遍,然后再操作一次。
相關(guān)源碼已經(jīng)打包上傳,順便上傳了一個(gè)測(cè)試 OK 的固件,大家可以直接下載附件直接測(cè)試。解壓后會(huì)得到 5 個(gè)壓縮包,繼續(xù)解壓即可:
MQTT 介紹
MQTT 全稱(chēng)為 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ù)。
作為一種低開(kāi)銷(xiāo)、低帶寬占用的即時(shí)通訊協(xié)議,使其在物聯(lián)網(wǎng)、小型設(shè)備、移動(dòng)應(yīng)用等方面有較廣泛的應(yīng)用。
MQTT 模型如圖所示:
更多 MQTT 協(xié)議的介紹見(jiàn)上篇文章:MQTT 協(xié)議開(kāi)發(fā)入門(mén)。
移植 Paho-MQTT 軟件包
下載 paho mqtt 軟件包,添加到鴻蒙代碼中
paho mqtt-c 是基于 C 語(yǔ)言實(shí)現(xiàn)的 MQTT 客戶(hù)端,非常適合用在嵌入式設(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 文件,用來(lái)構(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軟件包
打開(kāi) vendorhisihi3861hi3861BUILD.gn 文件。
在 lite_component("sdk") 中增加 "http://third_party/pahomqtt:pahomqtt_static"。
修改后文件內(nèi)容如下:
完成以上修改后,就可以開(kāi)始編譯了,然而很不幸的...你會(huì)發(fā)現(xiàn)好多編譯報(bào)錯(cuò)。
不過(guò)沒(méi)事,我們來(lái)一個(gè)一個(gè)解決。
移植,修改編譯報(bào)錯(cuò)
打開(kāi) 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ò)說(shuō) 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è)局部變量未使用那種,大家可以修改就行。
類(lèi)似于這樣的,提示 buflen 未使用的錯(cuò)誤,大家只需要在代碼中隨便寫(xiě)個(gè)buflen = buflen; 即可。
編寫(xiě)測(cè)試代碼
測(cè)試代碼比較好寫(xiě)。主要是 3 個(gè)文件,內(nèi)容我都貼出來(lá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 指令來(lái)測(cè)試 MQTT 功能
代碼內(nèi)容如下:
#include
③mqtt_test.c 文件則是編寫(xiě)了一個(gè)簡(jiǎn)單的 MQTT 測(cè)試代碼,具體代碼講解,后面會(huì)重新開(kāi)一篇
其中測(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__*/
到這里就完成了代碼部分,可以開(kāi)始編譯了。
MQTT 實(shí)驗(yàn)
這里我們需要先下載一個(gè) Windows 電腦端的 MQTT 客戶(hù)端,這樣我們就可以用電腦訂閱開(kāi)發(fā)板的 MQTT 主題信息了。
電腦版的 mqtt 客戶(hù)端下載鏈接:
https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.ui.app/1.1.1/ 我們選擇這一個(gè):
弄完后打開(kāi)軟件,按圖操作:
操作完后,我們把編譯后程序燒寫(xiě)到開(kāi)發(fā)板,輸入如下串口指令,讓開(kāi)發(fā)板連接上網(wǎng)絡(luò),因?yàn)?MQTT 功能需要網(wǎng)絡(luò)支持。
輸入如下串口指令:
AT+STARTSTA開(kāi)啟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 客戶(hù)端軟件,可以看到右邊已經(jīng)有接收 MQTT 信息了,主題未 pubtopic,消息內(nèi)容為 hello HarmonyOS ! 說(shuō)明實(shí)驗(yàn)成功。
總結(jié)
這一次的內(nèi)容比較多,其中總結(jié)起來(lái)就 4 步:
添加第三方軟件包 paho mqtt,關(guān)于如何添加第3方軟件包,我之前有一篇文章已經(jīng)講了。可以參考:如何往鴻蒙系統(tǒng)源碼中添加第三方軟件包。
移植 paho mqtt。
編寫(xiě)測(cè)試代碼,這里我們用的是注冊(cè) AT 指令的方式,方便大家使用AT指令測(cè)試。
測(cè)試,這里用電腦裝 mqtt 客戶(hù)端程序,去驗(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文章
651瀏覽量
22507 -
MQTT協(xié)議
+關(guān)注
關(guān)注
0文章
97瀏覽量
5379 -
鴻蒙系統(tǒng)
+關(guān)注
關(guān)注
183文章
2634瀏覽量
66348
原文標(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)先 登錄
相關(guān)推薦
評(píng)論