OpenHarmony开发之MQTT讲解

相信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信息的订阅者(接收者)。

可以看到,针对不同的主题,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\n", data->topicName->lenstring.len,data->topicName->lenstring.data, data->message->payloadlen, data->message->payload);
}
//主流程函数
static void MQTTDemoTask(void)
{WifiConnect("BearPi", "123456789");printf("Starting ...\n");int rc, count = 0;MQTTClient client;NetworkInit(&network);printf("NetworkConnect  ...\n");NetworkConnect(&network, MQTT_SERVERIP, MQTT_SERVERPORT);//本地电脑作为消息代理 此处为电脑IPprintf("MQTTClientInit  ...\n");//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  ...\n");//2-------------连接服务端rc = MQTTConnect(&client, &data);if (rc != 0) {printf("MQTTConnect: %d\n", rc);NetworkDisconnect(&network);MQTTDisconnect(&client);osDelay(MQTT_DELAY_2S);}printf("MQTTSubscribe  ...\n");//3-------------订阅主题substopicrc = MQTTSubscribe(&client, "substopic", MQTT_QOS, messageArrived);if (rc != 0) {printf("MQTTSubscribe: %d\n", 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\n", 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 ...\n");
NetworkInit(&network);
printf("NetworkConnect  ...\n");
NetworkConnect(&network, MQTT_SERVERIP, MQTT_SERVERPORT);//本地电脑作
printf("MQTTClientInit  ...\n");
//1-------------创建客户端对象
MQTTClientInit(&client, &network, MQTT_CMD_TIMEOUT_MS, sendBuf, sizeof(sendBuf), readBuf, sizeof(readBuf));printf("MQTTConnect  ...\n");
//2-------------连接服务端
rc = MQTTConnect(&client, &data);printf("MQTTSubscribe  ...\n");
//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\n", 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有个感性认识。

为了帮助到大家能够更有效的学习OpenHarmony 开发的内容,下面特别准备了一些相关的参考学习资料:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……

系统架构分析:https://qr18.cn/CgxrRy

  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单快捷的图片格式转换工具:认识webp2jpg-online

经常写博客或记笔记的朋友们可能会碰到图床不支持的图片格式或图片太大需要压缩的情况。通常,我们会在浏览器中搜索在线图片格式转换器,但这些转换器往往伴有烦人的广告或要求登录,并且支持的转换格式有限。最近,我在浏览 GitHub …

hls.js实现分片播放视频

前言&#xff1a;hls.js官网&#xff1a;hls.js - npm 一、demo——在HTML中使用 <audio id"audio" controls></audio><script src"https://cdn.jsdelivr.net/npm/hls.jslatest"></script> <script>document.addEventList…

upload-labs 通关方法

目录 Less-1&#xff08;JS前端验证&#xff09; Less-2&#xff08;MIME验证&#xff09; Less-3&#xff08;黑名单&#xff0c;特殊过滤&#xff09; Less-4&#xff08;黑名单验证&#xff0c;.htaccess&#xff09; Less-5&#xff08;黑名单&#xff0c;点空格点绕过…

Qt | QCalendarWidget 类(日历)

01、QCalendarWidget 类 1、QCalendarWidget 类是 QWidget 的直接子类,该类用于日历,见下图 02、QCalendarWidget 属性 ①、dateEditAcceptDelay:int 访问函数:int dateEditAcceptDelay()const; void setDateEditAcceptDelay(int) 获取和设置日期编辑器的延迟时间(以毫秒…

给树莓派配置静态IP地址

第一步&#xff1a;查找默认网关 打开windowr&#xff1b;输入cmd&#xff0c; 输入 最后一行就是默认网关 ipconfig第二步&#xff1a;确定分配好给树莓派的IP地址 要注意&#xff1a;&#xff08;1&#xff09;静态ip地址与路由器网段保持一致&#xff08;2&#xff09;与…

压缩设备液压控制比例放大器

液压比例阀放大器是液压控制系统中的重要部件之一&#xff0c;用于控制输出油压方向流量和压力的精确控制。它由BEUEC比例放大器和比例电磁阀组成&#xff0c;通过调节比例放大器的增益和灵敏度参数&#xff0c;可以实现对液压系统输出油压方向流量和压力的精确控制。适用于各种…

动态IP与静态IP有什么区别?如何选择?

动态IP和静态IP都是指网络设备&#xff08;如计算机、服务器、路由器等&#xff09;在互联网上分配的IP地址的类型。 一、什么是动态IP&#xff0c;什么是静态IP&#xff1f; 1、什么是动态IP&#xff1f; 动态IP是指由Internet服务提供商&#xff08;ISP&#xff09;动态分配…

SpringBoot中使用AOP实现日志记录功能

目录 一、SpringBoot框架介绍 二、什么是 AOP 三、日志记录的必要性 四、SpringBoot中如何使用AOP实现日志记录功能 一、SpringBoot框架介绍 SpringBoot是一个开源的Java开发框架&#xff0c;旨在简化基于Spring框架的应用程序的开发。它提供了一套开箱即用的工具&#xf…

express.js--连接数据库,并且增删改查(四)

使用数据库需要在电脑安装mysql&#xff0c;然后使用navicat 我没有下载mysql,我使用的是小皮里面的数据库&#xff0c;需要破解版的navicat可以私信我 安装mysql npm i mysql 数据库的基本信息&#xff0c;我是直接写到配置文件里面的 config/index.js module.exports {…

【Android】联系人列表补充

真布局--叠起来垂直管 效果展示 部分代码&#xff08;在activity_main&#xff09;里面 <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"…

如何在Windows下使用Docker Desktop运行CentOS容器

引言&#xff1a; 在Windows操作系统中&#xff0c;我们可以使用Docker Desktop来轻松运行和管理各种Linux容器&#xff0c;包括CentOS。今天&#xff0c;我们就来详细讲解一下如何在Windows环境下使用Docker Desktop来运行CentOS容器。 一、安装Docker Desktop 首先&#x…

WPF中CommandParameter用法

1. 界面样式 2. XAML中代码部分 <ButtonGrid.Row"0"Grid.Column"1"Command"{Binding BtnClick_Number}"CommandParameter"7"Content"7"Style"{StaticResource BtnStyle_Num}" /> <ButtonGrid.Row"…

【个人商业画布】你有思考过把自己当成一家公司来经营吗?

商业模式画布(Business Model Canvas)&#xff0c;是亚历山大奥斯特瓦德在《商业模式新生代》中提出的一种用于描述商业模式、可视化商业模式、评估商业模式以及改变商业模式的通用语言。它由9个模块构成&#xff0c;帮助创业者理清为“细分客户提供独有价值”&#xff0c;从而…

浅谈OpenHarmony LiteOS-A内核之基础硬件——中断控制器GIC400

一、前言 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;采用多内核架构&#xff0c;支持Linux内核的标准系统、LiteOS-A的小型系统、LiteOS-M的轻量系统。 其中LiteOS-A要求设备具备一定的处理能力&#xff0c;对比LiteOS-M&#xff0c;LiteOS-A支持…

国赛部分复现

MISC 神秘文件 下载解压后是个pptm文件&#xff0c;内容丰富 使用010打开ppt查看 发现为PK开头&#xff0c;属于压缩包文件。复制粘贴ppt&#xff0c;修改副本后缀为.zip并解压 part1 查看属性&#xff0c;发现奇怪字符 QFCfpPQ6ZymuM3gq 根据提示Bifid chipher&#xff0c;…

【Linux】Linux信号产生,接受与处理机制

理解Linux信号产生&#xff0c;接受与处理机制 信号是Linux操作系统中一种用于进程间通信和异步事件处理的机制。在本文中&#xff0c;我们将结合Linux的源码&#xff0c;深入分析信号的产生、发送、接收和处理的底层原理。 文章目录 理解Linux信号产生&#xff0c;接受与处理…

Android 几个简单的自定义对话框介绍

Android 几个简单的自定义对话框介绍 文章目录 一、前言二、对话框相关内容1、效果2、对话框显示的调用代码&#xff08;1&#xff09;原生对话框代码&#xff1a;&#xff08;2&#xff09;自定义对话框代码&#xff1a; 3、对话框SweetAlertDialog 主要实现代码&#xff1a;4…

【Linux】-Elasticsearch安装部署[16]

目录 简介 安装 1、添加yum仓库 2、安装es 3、配置es 4、启动es 5、关闭防火墙 6、测试 简介 全文搜索属于最常见的要求&#xff0c;开源的Elasticsearch&#xff08;以下简称es&#xff09;是目前全文搜索引擎的首选。它可以快速的储存、搜索和分析海量数据。维基百科…

以人为本的人工智能:李飞飞谈AI

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;关于AI的讨论越来越多&#xff0c;特别是围绕其可能带来的威胁。有人担心高效的AI会夺走我们的工作&#xff0c;甚至不可控的AI最终会统治人类。对此&#xff0c;斯坦福大学计算机科学系教授李飞飞提出了不同…

Paddle 稀疏计算 使用指南

Paddle 稀疏计算 使用指南 1. 稀疏格式介绍 1.1 稀疏格式介绍 稀疏矩阵是一种特殊的矩阵&#xff0c;其中绝大多数元素为0。与密集矩阵相比&#xff0c;稀疏矩阵可以节省大量存储空间&#xff0c;并提高计算效率。 例如&#xff0c;一个5x5的矩阵中只有3个非零元素: impor…