吴忠躺衫网络科技有限公司

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

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

3天內不再提示

OpenHarmony開發之MQTT講解

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

點擊藍字 ╳ 關注我們


開源項目 OpenHarmony
是每個人的 OpenHarmony

王維平

OpenHarmony知識體系工作組


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


什么是MQTT

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

MQTT的基本原理

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

MQTT服務端
MQTT服務端通常是一臺服務器。它是MQTT信息傳輸的樞紐,負責將MQTT客戶端發送來的信息傳遞給MQTT客戶端。MQTT服務端還負責管理MQTT客戶端。確保客戶端之間的通訊順暢,保證MQTT消息得以正確接收和準確投遞。

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

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


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


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

MQTT客戶端開發流程

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


MQTT的流程主要由四個步驟組成:
1、創建客戶端對象;
2、連接服務器;
3、訂閱主題;
4、發布主題。
//訂閱的回調函數
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);
}
//主流程函數
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-------------創建客戶端對象
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------------發布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);
}
}
小熊派開發板MQTT客戶端代碼一直循環發送主題為pubtopic的信息,信息內容為("message number %d", count),每次信息count++;
同時開發板客戶端也在訂閱主題為substopic的信息,一旦接收到substopic信息就會調用回調函數,串口打印出substopic主題的內容。

MQTT實操驗證

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

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

詳細細節:
1、下載消息代理Mosquitto軟件,并配置Mosquitto:
(1)點擊下載網址(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工具,創建客戶端A,并連接服務器:


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

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

4、燒錄代碼,并操作(發布訂閱)通信:
客戶端B做了兩件事情:1、一直循環發送主題為pubtopic的信息,信息內容是("message number %d", count);2、訂閱了主題為substopic的信息,一旦服務器有該主題信息就會發送給客戶端B,客戶端B會把substopic的內容打印。
客戶端A也做了兩件事:1、訂閱主題為pubtopic的信息;2、發布一條主題為substopic的信息,內容為“Hello OpenHarmony!”。
結合客戶端B(小熊派開發板)部分代碼:
printf("Starting ...
");
NetworkInit(&network);
printf("NetworkConnect ... ");
NetworkConnect(&network, MQTT_SERVERIP, MQTT_SERVERPORT);//本地電腦作
printf("MQTTClientInit ... ");
//1-------------創建客戶端對象
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------------循環發布pubtopic主題 內容為message number+connt的計數值
MQTTPublish(&client, "pubtopic", &message)
//訂閱的回調函數輸出以下內容
printf("Message arrived on topic %.*s: %.*s ", data->topicName->lenstring.len,
data->topicName->lenstring.data,data->message->payloadlen,data->message->payload);

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


客戶A:顯示如下圖:


總結

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

相關鏈接

小熊派開發板學習路徑:

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

小熊派開發板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源碼獲取:

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知識體系工作組智慧家居開發樣例

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

使用MQTT協議連華為IOT平臺

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





原文標題:OpenHarmony開發之MQTT講解

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

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

    關注

    57

    文章

    2392

    瀏覽量

    43059
  • OpenHarmony
    +關注

    關注

    25

    文章

    3747

    瀏覽量

    16592

原文標題:OpenHarmony開發之MQTT講解

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

收藏 人收藏

    評論

    相關推薦

    MQTT協議深度應用:Air780E模組AT指令的創新實踐

    今天我講解的是關于4G模組AT指令MQTT應用,有興趣的朋友可以閱讀本文深度學習。
    的頭像 發表于 11-11 09:30 ?1216次閱讀
    <b class='flag-5'>MQTT</b>協議深度應用:Air780E模組AT指令的創新實踐

    OpenHarmony應用開發精品課程重磅來襲

    第一階段為期兩個月的10期課程,多位資深技術專家為你講解原理、分享經驗,帶領你一塊進行代碼實操,助力你從小白進階成為OpenHarmony應用開發高手。
    的頭像 發表于 11-02 08:03 ?297次閱讀
    <b class='flag-5'>OpenHarmony</b>應用<b class='flag-5'>開發</b>精品課程重磅來襲

    MQTT應用:Air780EP低功耗4G模組AT開發

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

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

    觸覺智能Purple Pi OH鴻蒙開發板,成功適配OpenHarmony5.0 Release版本!為大家帶來OpenHarmony5.0特性講解!關注觸覺智能,為大家帶來更多
    的頭像 發表于 10-25 10:51 ?485次閱讀
    觸覺智能Purple Pi OH鴻蒙<b class='flag-5'>開發</b>板成功適配<b class='flag-5'>OpenHarmony</b>5.0 Release,開啟新征程

    MQTT調試助手中文版(物聯網開發必備)

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

    基于ArkTS語言的OpenHarmony APP應用開發:HelloOpenharmony

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

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

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

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

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

    名單公布!【書籍評測活動NO.38】OpenHarmony開發與實踐 | 基于紅莓RK2206開發

    未聯系,視為放棄本次試用評測資格! 本書特色 本書從系統概述、內核、適配移植、IoT組件開發、SimpleGUI顯示和開發示例等方面,詳細講解基于OpenHarmony的嵌入式系統
    發表于 07-19 10:57

    OpenHarmony開機優化

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

    鴻蒙開發實例:【配置OpenHarmony SDK】

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

    OpenHarmony南向開發案例:【智能油煙機】

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

    OpenHarmony南向開發實例:【游戲手柄】

    基于TS擴展的聲明式開發范式編程語言,以及OpenHarmony的分布式能力實現的一個手柄游戲。
    的頭像 發表于 04-17 10:21 ?823次閱讀
    <b class='flag-5'>OpenHarmony</b>南向<b class='flag-5'>開發</b>實例:【游戲手柄】

    OpenHarmony南向開發案例:【分布式畫板】

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

    什么是MQTTMQTT協議中的方法

    MQTT是一種輕量級消息傳遞協議,由IBM開發,于1999年首次發布。它使用發布/訂閱模式并在設備、服務器和應用程序之間轉換消息。
    的頭像 發表于 02-25 17:04 ?1434次閱讀
    什么是<b class='flag-5'>MQTT</b>?<b class='flag-5'>MQTT</b>協議中的方法
    鸟巢百家乐的玩法技巧和规则| 庄闲和百家乐桌布| 百家乐官网桌台布| 大发888yule| 百家乐是如何出千的| 百家乐官网博送彩金18| 鹤乡棋牌乐| 百家乐赌博策略大全| 将军百家乐官网的玩法技巧和规则| 舟曲县| 元游棋牌下载| 喜达百家乐的玩法技巧和规则| 浩博百家乐娱乐城| 天堂鸟百家乐官网的玩法技巧和规则 | 百家乐技巧-百家乐开户指定代理网址 | 大发888娱乐城首页| 百家乐科学| 真人百家乐现金游戏| 百家乐官网百乐发破解版| 优博平台网址| 大发888娱乐城 真钱| 百家乐筹码皇冠| 百家乐策略大全| 百家乐玩法教学视频| 索罗门百家乐官网的玩法技巧和规则| 澳门百家乐官网娱乐城网址| 至尊娱乐| 利来国际网上娱乐| 皇家娱乐城| 娱乐城简介| 边城棋牌中心| 利博亚洲| 金都娱乐城真人娱乐| 德州扑克秘籍| 德州扑克视频| 大发888娱乐场 888| 大发888xp缺少 casino| 大发888娱乐城官网| 喜力百家乐的玩法技巧和规则 | 真百家乐官网游戏| 休闲百家乐官网的玩法技巧和规则|