0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony開發(fā)之MQTT講解

OpenAtom OpenHarmony ? 來源:未知 ? 2022-11-15 22:50 ? 次閱讀

點擊藍字 ╳ 關注我們


開源項目 OpenHarmony
是每個人的 OpenHarmony

王維平

OpenHarmony知識體系工作組


以下內(nèi)容來自嘉賓分享,不代表開放原子開源基金會觀點
相信MQTT這個名稱大家都不陌生,物聯(lián)網(wǎng)的開發(fā)必然會遇到MQTT相關知識的應用。那么什么是MQTT?它有什么特點?它能解決什么問題?它是如何工作的?OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)的物聯(lián)網(wǎng)開發(fā)者要如何使用及驗證MQTT功能?接下來的內(nèi)容將一一為你解答。下圖為MQTT通信模型。


什么是MQTT

MQTT(Message Queuing Telemetry Transport消息隊列遙測傳輸)是一種物聯(lián)網(wǎng)協(xié)議,是一種客戶端與服務端架構的發(fā)布/訂閱模式的消息傳輸協(xié)議,旨在為低帶寬和不穩(wěn)定的網(wǎng)絡環(huán)境中的物聯(lián)網(wǎng)設備提供可靠的網(wǎng)絡服務。MQTT是專門針對物聯(lián)網(wǎng)開發(fā)的輕量級傳輸協(xié)議。MQTT協(xié)議針對低帶寬網(wǎng)絡,低計算能力的設備,做了特殊的優(yōu)化,使得其能適應各種物聯(lián)網(wǎng)應用場景。目前它已廣泛應用于車聯(lián)網(wǎng)、智能家居、即時聊天應用和工業(yè)互聯(lián)網(wǎng)等領域。

MQTT的基本原理

在MQTT通訊中,有兩個最為重要的角色。它們分別是服務端和客戶端。

MQTT服務端
MQTT服務端通常是一臺服務器。它是MQTT信息傳輸?shù)臉屑~,負責將MQTT客戶端發(fā)送來的信息傳遞給MQTT客戶端。MQTT服務端還負責管理MQTT客戶端。確??蛻舳酥g的通訊順暢,保證MQTT消息得以正確接收和準確投遞。

MQTT客戶端
MQTT客戶端可以向服務端發(fā)布信息,也可以從服務端收取信息。我們把客戶端發(fā)送信息的行為稱為“發(fā)布”信息。而客戶端要想從服務端收取信息,則首先要向服務端“訂閱”信息?!坝嗛啞毙畔⑦@一操作很像我們在視頻網(wǎng)站訂閱某一部電視劇。當這部電視劇上新后,視頻網(wǎng)站會向訂閱了該劇的用戶發(fā)送信息,告訴他們有新劇上線了。

MQTT主題
剛剛我們在講解MQTT客戶端訂閱信息時,使用了用戶在視頻網(wǎng)站訂閱電視劇這個例子。在MQTT通訊中,客戶端所訂閱的肯定不是一部部電視劇,而是一個個“主題”。MQTT服務端在管理MQTT信息通訊時,就是使用“主題”來控制的。
為了便于您更好理解服務端是如何通過主題來控制客戶端之間的信息通訊,我們來看看下圖示例:


以上圖示中一共有三個MQTT客戶端。它們分別是汽車、手機電腦。在管理MQTT通訊時,MQTT服務端使用了“主題”來對信息進行管理。比如上圖所示,假設我們需要利用手機和電腦獲取汽車的速度,那么我們首先要利用電腦和手機向MQTT服務器訂閱主題“汽車速度”。接下來,當汽車客戶端向服務端的“汽車速度”主題發(fā)布信息后,服務端就會首先檢查以下都有哪些客戶端訂閱了“汽車速度”這一主題的信息。當它發(fā)現(xiàn)訂閱了該主題的客戶端有一個手機和一臺電腦,于是服務端就會將剛剛收到的“汽車速度”信息轉發(fā)給訂閱了該主題的手機和電腦客戶端。
以上實例中,汽車是“汽車速度”主題的發(fā)布者,而手機和電腦則是該主題的訂閱者。
值得注意的是,MQTT客戶端在通訊時,往往角色不是單一的。它既可以作為信息發(fā)布者也可以同時作為信息訂閱者。如下圖所示:


上圖中的所有客戶端都是圍繞“空調(diào)溫度”這一主題進行通訊的。對于“空調(diào)溫度”這一主題,手機和電腦客戶端成為了MQTT信息的發(fā)布者而汽車則成為了MQTT信息的訂閱者(接收者)。
(以上講解參考鏈接:太極創(chuàng)客http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-tutorial/2-mqtt-basics/)
可以看到,針對不同的主題,MQTT客戶端可以切換自己的角色。它們可能對主題A來說是信息發(fā)布者,但是對于主題B就成了信息訂閱者。

MQTT客戶端開發(fā)流程

以下采用小熊派的Paho MQTT樣例,簡要說明MQTT的開發(fā)流程。
樣例代碼在OpenHarmony源碼目錄/device/board/bearpi/bearpi_hm_nano/app/D5_iot_mqtt,源碼下載路徑參考文章末尾。開發(fā)應用主要涉及以下幾個API應用:


MQTT的流程主要由四個步驟組成:
1、創(chuàng)建客戶端對象;
2、連接服務器;
3、訂閱主題;
4、發(fā)布主題。
//訂閱的回調(diào)函數(shù)
void messageArrived(MessageData *data)
{
printf("Message arrived on topic %.*s: %.*s ", data->topicName->lenstring.len,
data->topicName->lenstring.data, data->message->payloadlen, data->message->payload);
}
//主流程函數(shù)
static void MQTTDemoTask(void)
{
WifiConnect("BearPi", "123456789");
printf("Starting ... ");
int rc, count = 0;
MQTTClient client;


NetworkInit(&network);
printf("NetworkConnect ... ");


NetworkConnect(&network, MQTT_SERVERIP, MQTT_SERVERPORT);//本地電腦作為消息代理 此處為電腦IP
printf("MQTTClientInit ... ");
//1-------------創(chuàng)建客戶端對象
MQTTClientInit(&client, &network, MQTT_CMD_TIMEOUT_MS, sendBuf, sizeof(sendBuf), readBuf, sizeof(readBuf));


MQTTString clientId = MQTTString_initializer;
clientId.cstring = "bearpi";


MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.clientID = clientId;
data.willFlag = 0;
data.MQTTVersion = MQTT_VERSION;
data.keepAliveInterval = MQTT_KEEP_ALIVE_MS;
data.cleansession = 1;


printf("MQTTConnect ... ");
//2-------------連接服務端
rc = MQTTConnect(&client, &data);
if (rc != 0) {
printf("MQTTConnect: %d ", rc);
NetworkDisconnect(&network);
MQTTDisconnect(&client);
osDelay(MQTT_DELAY_2S);
}


printf("MQTTSubscribe ... ");
//3-------------訂閱主題substopic
rc = MQTTSubscribe(&client, "substopic", MQTT_QOS, messageArrived);
if (rc != 0) {
printf("MQTTSubscribe: %d ", rc);
osDelay(MQTT_DELAY_2S);
}
while (++count) {
MQTTMessage message;
char payload[30];


message.qos = MQTT_QOS;
message.retained = 0;
message.payload = payload;
(void)sprintf_s(payload, sizeof(payload), "message number %d", count);
message.payloadlen = strlen(payload);
//4------------發(fā)布pubtopic主題
if ((rc = MQTTPublish(&client, "pubtopic", &message)) != 0) {
printf("Return code from MQTT publish is %d ", rc);
NetworkDisconnect(&network);
MQTTDisconnect(&client);
}
osDelay(MQTT_DELAY_500_MS);
}
}
小熊派開發(fā)板MQTT客戶端代碼一直循環(huán)發(fā)送主題為pubtopic的信息,信息內(nèi)容為("message number %d", count),每次信息count++;
同時開發(fā)板客戶端也在訂閱主題為substopic的信息,一旦接收到substopic信息就會調(diào)用回調(diào)函數(shù),串口打印出substopic主題的內(nèi)容。

MQTT實操驗證

如何驗證MQTT客戶端代碼是否正常?驗證過程主要涉及以下幾點:
1、下載消息代理Mosquitto軟件,并配置Mosquitto;
2、下載EclipsePahoMQTT工具,并用該工具創(chuàng)建一個客戶端,我們簡稱客戶A;
3、修改小熊派客戶端MQTT代碼相關配置,與第一步配置Mosquitto相匹配,小熊派客戶端我們簡稱客戶B。
簡要說明下本次驗證中涉及的各個模塊的作用:

1、消息代理Mosquitto:可以理解為它就是MQTT服務器,所有客戶端的消息(發(fā)布/訂閱)都是與它通信;它負責接收及分發(fā)所有信息;
2、EclipsePahoMQTT工具創(chuàng)建的客戶端A:我們用來與小熊派創(chuàng)建的客戶端B進行信息交互(發(fā)布/訂閱)。

詳細細節(jié):
1、下載消息代理Mosquitto軟件,并配置Mosquitto:
(1)點擊下載網(wǎng)址(https://mosquitto.org/download/),選擇合適的版本,并安裝(記錄安裝路徑);


(2)安裝好后,配置Mosquitto,并開啟Mosquitto服務:

在Mosquitto軟件的安裝路徑找到mosquitto.conf,打開并作如下修改:

192.168.120.137是本電腦的IP;1883指本次用來驗證的服務端口號(本電腦IP192.168.120.137可以有多個服務端口);allow_anonymous true指允許客戶端匿名登錄;
修改配置后,在安裝目錄打開命令窗口,輸入.mosquitto -c .mosquitto.conf -v。服務器啟動成功后,如下圖顯示mosquitto version 2.0.11 starting.


2、下載EclipsePahoMQTT工具,創(chuàng)建客戶端A,并連接服務器:


3、修改小熊派客戶端MQTT代碼相關配置,與第一步配置Mosquitto相匹配,小熊派客戶端我們簡稱客戶B:

修改連接端代碼:
NetworkConnect(&network, 192.168.120.137, 1883);//本地電腦作為消息代理 此處為電腦IP Mosquitto相匹配

4、燒錄代碼,并操作(發(fā)布訂閱)通信:
客戶端B做了兩件事情:1、一直循環(huán)發(fā)送主題為pubtopic的信息,信息內(nèi)容是("message number %d", count);2、訂閱了主題為substopic的信息,一旦服務器有該主題信息就會發(fā)送給客戶端B,客戶端B會把substopic的內(nèi)容打印。
客戶端A也做了兩件事:1、訂閱主題為pubtopic的信息;2、發(fā)布一條主題為substopic的信息,內(nèi)容為“Hello OpenHarmony!”。
結合客戶端B(小熊派開發(fā)板)部分代碼:
printf("Starting ...
");
NetworkInit(&network);
printf("NetworkConnect ... ");
NetworkConnect(&network, MQTT_SERVERIP, MQTT_SERVERPORT);//本地電腦作
printf("MQTTClientInit ... ");
//1-------------創(chuàng)建客戶端對象
MQTTClientInit(&client, &network, MQTT_CMD_TIMEOUT_MS, sendBuf, sizeof(sendBuf), readBuf, sizeof(readBuf));


printf("MQTTConnect ... ");
//2-------------連接服務端
rc = MQTTConnect(&client, &data);

printf("MQTTSubscribe ... ");
//3-------------訂閱主題substopic
rc = MQTTSubscribe(&client, "substopic", MQTT_QOS, messageArrived);
(void)sprintf_s(payload, sizeof(payload), "message number %d", count);
//4------------循環(huán)發(fā)布pubtopic主題 內(nèi)容為message number+connt的計數(shù)值
MQTTPublish(&client, "pubtopic", &message)
//訂閱的回調(diào)函數(shù)輸出以下內(nèi)容
printf("Message arrived on topic %.*s: %.*s ", data->topicName->lenstring.len,
data->topicName->lenstring.data,data->message->payloadlen,data->message->payload);

客戶B:開發(fā)板燒錄好代碼后,電腦串口工具連接開發(fā)板,會有連接MQTT及訂閱的信息(參照以上代碼),如下圖:


客戶A:顯示如下圖:


總結

本文從講解MQTT它是什么?原理是什么?到MQTT的應用開發(fā)(API函數(shù)接口調(diào)用例程),再到MQTT的驗證(Mosquitto軟件及EclipsePahoMQTT工具的使用)三個方面介紹了MQTT。希望通過本文介紹讓大家對MQTT有個感性認識。
需要說明的是通常我們使用的是MQTT的解決方案,即MQTT的一系列操作被封裝了,例如知識體系的智慧家居樣例,在與華為IOT平臺通信中,它們內(nèi)部實現(xiàn)是基于MQTT協(xié)議搭建的。(智慧家居與華為IOT平臺的相關介紹,請查看文末鏈接)
本文章是OpenHarmony知識體系工作組(相關鏈接在文章末尾)為廣大開發(fā)者分享的文章。同時知識體系工作組結合日常生活,給開發(fā)者規(guī)劃了各種場景的Demo樣例,如智能家居場景、影音娛樂場景、運動健康場景等;歡迎廣大開發(fā)者一同參與OpenHarmony的開發(fā),一起完善樣例,相互學習,相互進步。

相關鏈接

小熊派開發(fā)板學習路徑:

https://growing.openharmony.cn/mainPlay/learnPathMaps?id=19

小熊派開發(fā)板MQTT文檔:

https://gitee.com/bearpi/bearpi-hm_nano/blob/master/applications/BearPi/BearPi-HM_Nano/sample/D5_iot_mqtt/README.md

Windows + mosquitto搭建MQTT Broker:

https://blog.csdn.net/wallace89/article/details/125617330

OpenHarmony源碼獲?。?/p>

https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md

OpenHarmony三方庫MQTT:

https://gitee.com/openharmony-tpc/talkweb_mqtt

OpenHarmony知識體系工作組智慧家居開發(fā)樣例

https://gitee.com/openharmony-sig/knowledge_demo_smart_home

使用MQTT協(xié)議連華為IOT平臺

https://gitee.com/bearpi/bearpi-hm_nano/blob/master/applications/BearPi/BearPi-HM_Nano/sample/D6_iot_cloud_oc/README.md





原文標題:OpenHarmony開發(fā)之MQTT講解

文章出處:【微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 鴻蒙
    +關注

    關注

    57

    文章

    2295

    瀏覽量

    42646
  • OpenHarmony
    +關注

    關注

    25

    文章

    3614

    瀏覽量

    15997

原文標題:OpenHarmony開發(fā)之MQTT講解

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MQTT應用:Air780EP低功耗4G模組AT開發(fā)

    本文應各位大佬邀請,詳細講解Air780EP模組MQTT應用的多個AT命令。
    的頭像 發(fā)表于 10-25 17:27 ?103次閱讀
    <b class='flag-5'>MQTT</b>應用:Air780EP低功耗4G模組AT<b class='flag-5'>開發(fā)</b>

    觸覺智能Purple Pi OH鴻蒙開發(fā)板成功適配OpenHarmony5.0 Release,開啟新征程

    觸覺智能Purple Pi OH鴻蒙開發(fā)板,成功適配OpenHarmony5.0 Release版本!為大家?guī)?b class='flag-5'>OpenHarmony5.0特性講解!關注觸覺智能,為大家?guī)砀?/div>
    的頭像 發(fā)表于 10-25 10:51 ?144次閱讀
    觸覺智能Purple Pi OH鴻蒙<b class='flag-5'>開發(fā)</b>板成功適配<b class='flag-5'>OpenHarmony</b>5.0 Release,開啟新征程

    MQTT調(diào)試助手中文版(物聯(lián)網(wǎng)開發(fā)必備)

    MQTT調(diào)試助手中文版(物聯(lián)網(wǎng)開發(fā)必備)。?支持模擬設備鏈接各種MQTT云服務器、 ?阿里云、騰訊云、華為云、原子云、onenet等等。
    發(fā)表于 10-12 14:23 ?1次下載

    基于ArkTS語言的OpenHarmony APP應用開發(fā):HelloOpenharmony

    1、程序簡介該程序是基于OpenHarmony標準系統(tǒng)編寫的UI應用類:HelloOpenHarmony。本案例是基于API9接口開發(fā)。本案例已在OpenHarmony凌蒙派-RK35
    的頭像 發(fā)表于 09-15 08:09 ?231次閱讀
    基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應用<b class='flag-5'>開發(fā)</b>:Hello<b class='flag-5'>Openharmony</b>

    合宙Air780EP模塊——AT指令MQTT接入OneNET開發(fā)指南

    過程,Air780EP和MQTT是最佳拍檔,讓設備互聯(lián)變得輕松又靠譜。想不想試試這簡單又神奇的操作?那就來吧!本文詳細講解了基于合宙的Air80EP開發(fā)板,使用AT
    的頭像 發(fā)表于 08-19 16:40 ?1846次閱讀
    合宙Air780EP模塊——AT指令<b class='flag-5'>MQTT</b>接入OneNET<b class='flag-5'>開發(fā)</b>指南

    MQTT應用看這篇!合宙Air780EP_LuatOS_MQTT應用指南

    Air780EP 是合宙的低功耗4G模組之一,支持LuatOS的腳本二次開發(fā),即使是不太懂技術的老板,也能輕松使用 Air780EP開發(fā)產(chǎn)品。 本文應各位大佬邀請,詳細講解了Air780EP 的
    的頭像 發(fā)表于 08-08 17:13 ?1488次閱讀
    <b class='flag-5'>MQTT</b>應用看這篇!合宙Air780EP_LuatOS_<b class='flag-5'>MQTT</b>應用指南

    OpenHarmony開機優(yōu)化

    、磁盤I/O等,并以圖表形式展示出來。 使用方法 參考文檔:OpenHarmony性能調(diào)優(yōu)工具—boochart_小~Q-Laval社區(qū) 通過Bootchart工具,開發(fā)者可以深入了解系統(tǒng)的啟動過程,并
    發(fā)表于 07-01 16:39

    鴻蒙開發(fā)實例:【配置OpenHarmony SDK】

    在設置OpenHarmony應用開發(fā)環(huán)境時,需要開發(fā)者在DevEco Studio中配置對應的SDK信息。
    的頭像 發(fā)表于 04-22 15:24 ?1615次閱讀
    鴻蒙<b class='flag-5'>開發(fā)</b>實例:【配置<b class='flag-5'>OpenHarmony</b> SDK】

    OpenHarmony南向開發(fā)案例:【智能油煙機】

    基于Hi3516開發(fā)板,使用開源OpenHarmony開發(fā)的應用。
    的頭像 發(fā)表于 04-18 15:54 ?956次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開發(fā)</b>案例:【智能油煙機】

    OpenHarmony南向開發(fā)案例:【分布式畫板】

    使用OpenHarmony3.1-Release開發(fā)的應用。通過OpenHarmony的分布式技術,使多人能夠一起畫畫。
    的頭像 發(fā)表于 04-12 14:40 ?947次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開發(fā)</b>案例:【分布式畫板】

    OpenHarmony NAPI 框架介紹

    環(huán)境中的 JS 變量與方法。 OpenHarmony 中的 NAPI OpenAtom OpenHarmony(以下簡稱 “OpenHarmony”)應用層基于 javascript 語言開發(fā)
    的頭像 發(fā)表于 02-01 17:34 ?598次閱讀
    <b class='flag-5'>OpenHarmony</b> <b class='flag-5'>之</b> NAPI 框架介紹

    鴻蒙next開發(fā)-OpenHarmony的NDK開發(fā)

    Native API是OpenHarmony SDK上提供的一組native開發(fā)接口與工具集合(也稱為NDK),方便開發(fā)者使用C或者C++語言實現(xiàn)應用的關鍵功能。
    的頭像 發(fā)表于 01-20 11:35 ?1663次閱讀
    鴻蒙next<b class='flag-5'>開發(fā)</b>-<b class='flag-5'>OpenHarmony</b>的NDK<b class='flag-5'>開發(fā)</b>

    openharmony開發(fā)應用

    隨著智能設備的普及和多樣化,開發(fā)者們對于更加靈活、高效的操作系統(tǒng)需求與日俱增。在這個背景下,華為推出了OpenHarmony,一個全場景智能終端操作系統(tǒng)和生態(tài)平臺。本文將詳細探討
    的頭像 發(fā)表于 12-19 09:42 ?591次閱讀

    教程分享!OpenHarmonyNAPI框架介紹

    是 C++語言實現(xiàn)的,這些接口可以幫助 C++代碼創(chuàng)建 JS 變量,或訪問 JavaScript 運行環(huán)境中的 JS 變量與方法。 OpenHarmony 中的 NAPI OpenAtom OpenHarmony(以下簡稱“OpenHa
    的頭像 發(fā)表于 11-30 12:15 ?1248次閱讀
    教程分享!<b class='flag-5'>OpenHarmony</b><b class='flag-5'>之</b>NAPI框架介紹

    MQTT是什么 MQTT特點

    MQTT 是 Message Queuing Telemetry Transport 的縮寫,是一種輕量級的、基于發(fā)布/訂閱模式的物聯(lián)網(wǎng)通信協(xié)議。 它具有以下特點: ?簡單易用:MQTT 的協(xié)議規(guī)范
    的頭像 發(fā)表于 11-09 15:20 ?2266次閱讀