MQTT 是當前最主流的物聯網通信協議,需要物聯網云平臺,例如華為云、阿里云、移動 OneNET 都支持 MQTT。而 Hi3861則是一款專為 IoT 應用場景打造的芯片。
本節主要講如何在鴻蒙系統中通過移植第 3 方軟件包 Paho-MQTT 去實現 MQTT 協議功能,最后會給出測試驗證。為后續的物聯網項目打好基礎。
友情預告,本節內容較多,源碼也貼出來了,大家最好先看一遍,然后再操作一次。
相關源碼已經打包上傳,順便上傳了一個測試 OK 的固件,大家可以直接下載附件直接測試。解壓后會得到 5 個壓縮包,繼續解壓即可:
MQTT 介紹
MQTT 全稱為 Message Queuing Telemetry Transport(消息隊列遙測傳輸)是一種基于發布/訂閱范式的二進制“輕量級”消息協議,由 IBM 公司發布。針對于網絡受限和嵌入式設備而設計的一種數據傳輸協議。
MQTT 最大優點在于,可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。
作為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。
MQTT 模型如圖所示:
更多 MQTT 協議的介紹見上篇文章:MQTT 協議開發入門。
移植 Paho-MQTT 軟件包
下載 paho mqtt 軟件包,添加到鴻蒙代碼中
paho mqtt-c 是基于 C 語言實現的 MQTT 客戶端,非常適合用在嵌入式設備上。
首先下載源碼:
https://github.com/eclipse/paho.mqtt.embedded-c 下載之后解壓,會得到這么一個文件夾:
我們在鴻蒙系統源碼的 third_party 文件夾下創建一個 pahomqtt 文件夾,然后把解壓后的所有文件都拷貝到 pahomqtt 文件夾下。
目錄結構大致如下:
下一步,我們在 pahomqtt 文件夾下面新建 BUILD.gn 文件,用來構建編譯。
其內容如下:
#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"。
修改后文件內容如下:
完成以上修改后,就可以開始編譯了,然而很不幸的...你會發現好多編譯報錯。
不過沒事,我們來一個一個解決。
移植,修改編譯報錯
打開 third_partypahomqttMQTTPacketsamples ransport.c 文件,這個文件也是我們主要移植的文件,我們需要實現 socket 相關的操作,包括發送、接收數據。
其實移植就 3 步:
①首先我們導入幾個頭文件:
#include"lwip/ip_addr.h" #include"lwip/netifapi.h" #include"lwip/sockets.h" ②其次修改 transport_sendPacketBuffer 函數,內容修改后如下:inttransport_sendPacketBuffer(intsock,unsignedchar*buf,intbuflen) { intrc=0; rc=send(sock,buf,buflen,0); returnrc; }
③后面編譯的時候會報錯說 close 函數不存在,我們修改 transport_close 函數,修改后內容如下:
inttransport_close(intsock) { intrc; rc=shutdown(sock,SHUT_WR); rc=recv(sock,NULL,(size_t)0,0); rc=lwip_close(sock); returnrc; }
④修改完 transport.c 文件后,大家編譯的時候估計會遇到很多編譯錯誤,都是某個局部變量未使用那種,大家可以修改就行。
類似于這樣的,提示 buflen 未使用的錯誤,大家只需要在代碼中隨便寫個buflen = buflen; 即可。
編寫測試代碼
測試代碼比較好寫。主要是 3 個文件,內容我都貼出來了:
①BUILD.gn 文件內容
#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 功能
代碼內容如下:
#include
③mqtt_test.c 文件則是編寫了一個簡單的 MQTT 測試代碼,具體代碼講解,后面會重新開一篇
其中測試用的 mqtt 服務器是我自己的服務器:106.13.62.194,大家也可以改成自己的,也可以直接用我個人的 mqtt 服務器。
#include
mqtt_test.h 文件內容:
#ifndef__MQTT_TEST_H__ #define__MQTT_TEST_H__ voidmqtt_test(void); #endif/*__MQTT_TEST_H__*/
到這里就完成了代碼部分,可以開始編譯了。
MQTT 實驗
這里我們需要先下載一個 Windows 電腦端的 MQTT 客戶端,這樣我們就可以用電腦訂閱開發板的 MQTT 主題信息了。
電腦版的 mqtt 客戶端下載鏈接:
https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.ui.app/1.1.1/ 我們選擇這一個:
弄完后打開軟件,按圖操作:
操作完后,我們把編譯后程序燒寫到開發板,輸入如下串口指令,讓開發板連接上網絡,因為 MQTT 功能需要網絡支持。
輸入如下串口指令:
AT+STARTSTA開啟STA模式 AT+CONN="12-203",,2,"07686582488"連接到路由器,注意wifi熱點名和密碼用自己的 AT+DHCP=wlan0,1獲取IP地址 AT+IFCFG打印查看IP地址 串口指令的應答應該如下:
成功連接上路由器后,請確保路由器是可以上網的。然后我們輸入我們的 MQTT 測試的 AT 指令:AT+MQTTTEST。
應該可以看到如下打印:
此時我們去查看 我們電腦端的 MQTT 客戶端軟件,可以看到右邊已經有接收 MQTT 信息了,主題未 pubtopic,消息內容為 hello HarmonyOS ! 說明實驗成功。
總結
這一次的內容比較多,其中總結起來就 4 步:
添加第三方軟件包 paho mqtt,關于如何添加第3方軟件包,我之前有一篇文章已經講了。可以參考:如何往鴻蒙系統源碼中添加第三方軟件包。
移植 paho mqtt。
編寫測試代碼,這里我們用的是注冊 AT 指令的方式,方便大家使用AT指令測試。
測試,這里用電腦裝 mqtt 客戶端程序,去驗證。
責任編輯:PSY
原文標題:如何在鴻蒙系統中移植Paho-MQTT實現MQTT協議
文章出處:【微信公眾號:HarmonyOS技術社區】歡迎添加關注!文章轉載請注明出處。
-
MQTT
+關注
關注
5文章
653瀏覽量
22691 -
MQTT協議
+關注
關注
0文章
98瀏覽量
5484 -
鴻蒙系統
+關注
關注
183文章
2638瀏覽量
66705
原文標題:如何在鴻蒙系統中移植Paho-MQTT實現MQTT協議
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論