【mqtt】MQTT安装与入门案例

news2025/1/22 21:00:07

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍MQTT的c++版本入门。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习知识,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. MQTT介绍
    • :blush:2. MQTT(Mosquitto)安装与测试
    • :satisfied:3. MQTT(Eclipse Paho)库安装与实例

😏1. MQTT介绍

MQTT是一个基于客户端-服务器消息发布/订阅传输协议

MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议,通常用于物联网设备和应用程序之间进行通信。它是基于发布/订阅模式设计的,其中消息发布者将消息发布到特定主题(Topic),然后订阅该主题的客户端将收到这些消息。MQTT 特别适合在网络带宽有限的情况下进行通信,因为它使用的数据包非常小。此外,它还提供了多种 QoS (Quality of Service) 级别来确保消息的可靠性和有效性。

MQTT 协议具有以下特点:

轻量级:相对于 HTTP 等协议,MQTT 的数据包非常小,因此能够以较低的网络带宽进行通信。
发布/订阅模式:通过订阅一个特定的主题,客户端能够接收和处理与该主题相关的所有消息。
多种 QoS 级别:MQTT 提供了三种不同的 QoS级别,以满足不同场景下的需求。
可扩展性:MQTT 的设计使得它能够方便地扩展到大规模系统中,并支持多种不同的连接方式,例如TCP、WebSocket 等。

MQTT 支持三种不同级别的服务质量(Quality of Service,QoS),分别为 QoS0、QoS1 和 QoS2。

QoS0:最多发送一次,消息发送者只会将消息发布出去,但是并不保证接收者是否成功接收到该消息。这是最低级别的服务质量,也是最简单和最快速的传输方式。
QoS1:至少发送一次,消息发送者确保至少将消息传输给接收者一次。如果接收者没有确认消息或者确认消息失败,则消息发送者会尝试重新发送,直到接收者成功地接收到消息为止。
QoS2:恰好发送一次,消息发送者确保接收者恰好只能收到一次消息。在该级别下,消息发送者和接收者会进行两轮握手确认,以保证消息的可靠性和有效性。

选择哪种服务质量级别取决于应用场景和对通信安全性的要求。需要注意的是,在选择高级别的服务质量时,会增加通信延迟和网络带宽的消耗。

MQTT数据包结构如下:

固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识;
可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容;
消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容;

😊2. MQTT(Mosquitto)安装与测试

目前mqtt的代理平台主要有:Mosquitto、VerneMQ、EMQTT。

下面在Ubuntu安装Mosquitto来体验mqtt的消息传递过程:

sudo apt-get install mosquitto	# 服务端
sudo apt install mosquitto-clients	# 客户端

启动/关闭mqtt服务:

mosquitto -v	# 启用所有日志记录类型
# 启动和关闭服务
sudo service mosquitto start
sudo service mosquitto stop
# 查看运行状态
sudo systemctl status mosquitto
# 查看帮助
mosquitto --help
#查看运行进程号:
ps -aux | grep mosquitto
#执行命令杀死进程:
kill -9 进程号

消息传输测试:

1、启动代理服务:mosquitto -v
   -v 详细模式 打印调试信息(启动一次就好)
2、订阅主题:mosquitto_sub -v -t hello
  -t 指定订阅的主题,主题为:hello
  -v 详细模式 打印调试信息
3、发布内容:mosquitto_pub -t hello -m world
  -t 指定订阅的主题,主题为:hello
  -m 指定发布的消息的内容

此外,还可以去官网(https://mosquitto.org/)安装最新版源码并编译,编译后的版本适合用于开发。

MQTT在线测试工具:https://mqttx.app/zh

😆3. MQTT(Eclipse Paho)库安装与实例

Eclipse Paho C++是一个跨平台的MQTT客户端实现,可以用于在C++应用程序中发送和接收MQTT消息。它支持许多不同的传输协议(如TCP、WebSocket、SSL等),并提供了多种QoS级别。开发中常使用这个。

github地址:

https://github.com/eclipse/paho.mqtt.c
https://github.com/eclipse/paho.mqtt.cpp

安装步骤:

# 依赖
sudo apt-get install build-essential gcc make cmake libssl-dev doxygen graphviz

# c
git clone https://github.com/eclipse/paho.mqtt.c
cd paho.mqtt.c
git checkout v1.3.8
cmake -Bbuild -H. -DPAHO_ENABLE_TESTING=OFF -DPAHO_BUILD_STATIC=ON \
    -DPAHO_WITH_SSL=ON -DPAHO_HIGH_PERFORMANCE=ON
sudo cmake --build build/ --target install
sudo ldconfig

# c++
git clone https://github.com/eclipse/paho.mqtt.cpp
cd paho.mqtt.cpp
cmake -Bbuild -H. -DPAHO_BUILD_STATIC=ON \
    -DPAHO_BUILD_DOCUMENTATION=TRUE -DPAHO_BUILD_SAMPLES=TRUE
sudo cmake --build build/ --target install
sudo ldconfig

客户端代码示例:

mqtt_client.hpp

#ifndef __MQTT_CLIENT_TO_CLOUD_HPP__
#define __MQTT_CLIENT_TO_CLOUD_HPP__

#include <mqtt/async_client.h>   // mqtt库头文件
#include <mqtt/topic.h>

namespace cloud {
    // Handler on cloud message
    using message_handler = std::function<void(const std::string&)>;

    class mqtt_client
    {
    public:
        mqtt_client();
        ~mqtt_client();

        void send(const std::string& message);
        void set_message_handler(message_handler cb);

    private:
        // static constexpr const char* BROKER_HOST = "localhost:1883";        //本地测试:mosquitto
        static constexpr const char* BROKER_HOST = "broker.emqx.io:1883";       //公共mqtt broker:MQTTX
        // static constexpr const char* BROKER_HOST = "124.XXX.XXX.XXX:1883";   //云端测试:mosquitto

    private:
        mqtt::async_client cli_;
        mqtt::topic        topic_;
    };
}  // namespace cloud

#endif

mqtt_client.cpp

#include <iostream>
#include <string>

#include "mqtt_client.hpp"

using namespace std;

namespace cloud {
    // mqtt_client类构造函数实现
    mqtt_client::mqtt_client()
        // 1.The server URI string  2.The client ID string that we provided to the server   3.The MQTT protocol version we're connected at
        : cli_(BROKER_HOST, "client", mqtt::create_options(MQTTVERSION_5))
        // 1.The client to which this topic is connected	2.The topic name(pub & sub)   3.The default QoS
        , topic_(cli_,"haojuhu", 1)  
    {
        //! Handler on connection lost, do reconnect here
        cli_.set_connection_lost_handler([this](const string& info) {
            std::cout<<"mqtt connection lost <" << info << ">, reconnting"<<std::endl;
            cli_.reconnect();
        });

        //! Handler on connected, it'll subscribe the topic and publish online info
        cli_.set_connected_handler([this](const string& info) {
            std::cout << "mqtt connected <" << info << ">"<<std::endl;
            topic_.subscribe(mqtt::subscribe_options(true));   // client订阅topic[haojuhu]
            topic_.publish("online");                          // client发布消息"online"至topic[haojuhu]
        });
    }
    //2.mqtt_client类析构函数实现
    mqtt_client::~mqtt_client()
    {
        cli_.disconnect();
        cli_.disable_callbacks();
    }

    /**
     * @brief       Publish message to topic,发布消息给topic
     * @param[in]   message The message payload
     */
    void mqtt_client::send(const string& message) 
    { 
        topic_.publish(message); 
    }

    /**
     * @brief       Set mqtt message handler,设置mqtt消息处理句柄(也就是函数对象cb)
     * @note        The mqtt connection will established here
     * @param[in]   cb  The message handler
     */
    void mqtt_client::set_message_handler(message_handler cb)
    {
        //! Set message callback here
        cli_.set_message_callback([cb](mqtt::const_message_ptr message) 
        {
            cb(message->get_payload_str());   //执行函数cb
        });

        //! Set connect options and do connect
        auto opts = mqtt::connect_options_builder()
                        .mqtt_version(MQTTVERSION_5)
                        .clean_start(true)
                        .finalize();
        cli_.connect(opts);
    }
}  // namespace cloud

main.cpp

#include <iostream>
#include <string>
#include <map>

#include "mqtt_client.hpp"

using namespace std;

/**
 * @brief               消息处理
 * @param[in]   data    The message payload from cloud
 */
void on_cloud_message(const string& data)
{
    // 接收数据
    std::cout<<"received data is: "<<data<<std::endl;
}

int main(int argc,char **argv)
{
    cloud::mqtt_client g_client;    // 定义一个mqtt客户端
    std::cout << "[CLOUD] listen starting"<<std::endl;
    g_client.set_message_handler(on_cloud_message);     // 开启mqtt clinet监听消息,消息处理函数为on_cloud_message

    while(1)
    {
        std::cout << "运行中..."<<std::endl;
        this_thread::sleep_for(10s);
        g_client.send("online...");     // 确保与mqtt broker server建立连接之后再publish!!!
    }
    return 0;
}

编译运行:

g++ main.cpp mqtt_client.cpp -o main -lpaho-mqttpp3 -lpaho-mqtt3a
./main

运行如下:

[CLOUD] listen starting
运行中...
mqtt connected <connect onSuccess called>

在这里插入图片描述

以上。

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

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

相关文章

java高频面试题

集合 前言 时间复杂度 时间复杂度是用来来评估代码的执行耗时的&#xff0c;大O表示法&#xff1a;不具体表示代码的真正执行时间&#xff0c;而是表示代码执行时间随数据规模增长的变化趋势。 当n很大时&#xff0c;低阶、常量、系数并不能影响其增长趋势&#xff0c;因此可以…

压缩感知重构之广义正交匹配追踪法

算法的重构是压缩感知中重要的一步&#xff0c;是压缩感知的关键之处。因为重构算法关系着信号能否精确重建&#xff0c;国内外的研究学者致力于压缩感知的信号重建&#xff0c;并且取得了很大的进展&#xff0c;提出了很多的重构算法&#xff0c;每种算法都各有自己的优缺点&a…

RFID在工业自动化产线工艺中的应用

RFID在工业自动化产线工艺中的应用 随着工业自动化技术的不断发展&#xff0c;RFID&#xff08;Radio Frequency Identification&#xff09;技术在自动化产线数据采集方面得到了广泛应用。RFID技术是一种通过电磁波进行无线通信和识别的技术&#xff0c;它可以对物品进行追踪…

电子器件系列39:反激式变压器

反激式(Flyback)变压器又称单端反激式或Buck-Boost转换器。因其输出端在原边绕组断开电源时获得能量故而得名。反激式变换器以其电路结构简单&#xff0c;成本低廉而深受广大开发工程师的喜爱。 反激式变压器适合小功率电源以及各种电源适配器。但是反激式变换器的设计难点是变…

Oracle中的数据导出(1)

目录 1、基本语法&#xff1a; 2、操作步骤 3、spool作用 SPOOL命令的使用 在 Oracle 中&#xff0c;SPOOL 是一条 SQLPLUS 命令&#xff0c;用于将执行 SQL 脚本的输出结果保存到指定文件中。SPOOL 命令可以帮助用户快速导出查询结果、生成报表等常见任务。 1、基本语法&…

压缩感知重构算法之正交匹配追踪算法(OMP)

算法的重构是压缩感知中重要的一步&#xff0c;是压缩感知的关键之处。因为重构算法关系着信号能否精确重建&#xff0c;国内外的研究学者致力于压缩感知的信号重建&#xff0c;并且取得了很大的进展&#xff0c;提出了很多的重构算法&#xff0c;每种算法都各有自己的优缺点&a…

java-面向对象

java-面向对象 面向对象 首先考虑事物中存在哪些对象&#xff0c;再建立对象与对象的关系 一、面向对象-&#xff08;类和对象&#xff09; 1.1类和对象的理解 客观存在的事物皆为对象 &#xff0c;所以我们也常常说万物皆对象。 类 类的理解 类是对现实生活中一类具有共同属性…

java-字符流和字节流(一)

java-字符流和字节流(一) 一、File类 1.1 File类概述和构造方法 File类介绍 它是文件和目录路径名的抽象表示文件和目录是可以通过File封装成对象的对于File而言&#xff0c;其封装的并不是一个真正存在的文件&#xff0c;仅仅是一个路径名而已。它可以是存在的&#xff0c;也…

【C++ 程序设计】第 1 章:C++ 语言简介

目录 一、C 语言的发展简史 二、C 语言的特点 &#xff08;1&#xff09;基本的输入/输出 &#xff08;2&#xff09;头文件和命名空间 &#xff08;3&#xff09;强制类型转换运算符 &#xff08;4&#xff09;函数参数的默认值 &#xff08;5&#xff09;引用和函数…

超简单好看的HTML5七夕情人节表白网页(表白直接拿去用) HTML+CSS+JS

博主&#xff1a;命运之光 专栏&#xff1a;web开发&#xff08;html css js&#xff09; 目录 ✨简介&#xff1a; ✨前言&#xff1a; ✨视频展示 ✨源代码 ✨代码的使用方法&#xff08;超简单什么都不用下载&#xff09; &#x1f353;1.打开记事本 &#x1f353;2.将…

springboot+vue高校食堂点餐送餐配送系统

食堂送餐系统的开发过程中&#xff0c;采用B / S架构&#xff0c;主要使用java语言进行开发&#xff0c;结合最新流行的springboot框架。使用Mysql数据库和Eclipse/idea开发工具。该四川工商学院食堂送餐系统包括用户、商家、送餐员和管理员。其主要功能包括商家管理、用户管理…

【Azure】微软 Azure 基础解析(八)Azure 存储服务:Blob存储、队列存储、文件存储等特点与应用场景

本系列博文还在更新中&#xff0c;收录在专栏&#xff1a;「Azure探秘&#xff1a;构建云计算世界」 专栏中。 本系列文章列表如下&#xff1a; 【Azure】微软 Azure 基础解析&#xff08;三&#xff09;描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx…

chatgpt赋能python:Python创建节点:简单易行的SEO优化技巧

Python创建节点&#xff1a;简单易行的SEO优化技巧 简介 在今天的数字时代&#xff0c;拥有强大在线存在感已经成为了非常重要的一种要素&#xff0c;而搜索引擎优化&#xff08;SEO&#xff09;就是其中重要的一环。优秀的SEO技巧不仅能够帮助网站吸引更多的访客&#xff0c…

chatgpt赋能python:Python编程实现高效的SEO搜索程序

Python编程实现高效的SEO搜索程序 在当今互联网时代&#xff0c;搜索引擎是人类获取信息的主要途径&#xff0c;而优化搜索引擎结果从而使自己的网站得到更多展示机会是一直以来网站优化重要的一环。Python语言以其简洁、高效、易学的特点&#xff0c;成为了编写高效SEO搜索程…

Linux 实操篇--定时任务调度

Linux 实操篇-定时任务调度 crond 任务调度 crontab 进行定时任务的设置 概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序。 任务调度分类&#xff1a;1.系统工作&#xff1a;有些重要的工作必须周而复始地执行。如病毒扫描等 个别用户工作&#xff…

java-基础语法(二)

java-基础语法(二) 一、流程控制语句 1.1 流程控制语句分类 顺序结构 分支结构(if, switch) 循环 结构(for, while, do…while) 1.2 顺序结构 顺序结构执行流程图&#xff1a; 1.3 分支结构之if语句 if语句格式1 格式&#xff1a;if (关系表达式) {语句体; }执行流程&…

04.JavaWeb-Tomcat服务器+Maven

1.B/S架构 B/S架构即浏览器/服务器模式&#xff0c;他是对C/S架构的一种改进&#xff1b;与C/S架构相比B/S架构可以实现跨平台&#xff0c;客户端零维护&#xff0c;但是个性化能力低&#xff0c;响应速度较慢。 2.Tomcat服务器 Tomcat是一个用于运行Java Web应用程序的服务器&…

chatgpt赋能python:Python分解9位数的方法介绍

Python分解9位数的方法介绍 Python是一种广泛使用的编程语言&#xff0c;具有强大的功能和易于使用的语法。其中&#xff0c;分解一个9位数是一个常见的问题。在本篇文章中&#xff0c;将介绍如何用Python分解一个9位数。 分解9位数的方法 对于一个9位数&#xff0c;我们可以…

SVM算法的介绍

一、SVM算法的介绍 1.什么是SVM算法&#xff1f; SVM&#xff08;Support Vector Machine&#xff09;是一种常见的监督学习算法&#xff0c;用于进行二分类或多分类任务。它的主要思想是找到一个最优的超平面&#xff0c;将不同类别的样本分隔开。 超平面最大间隔介绍&#…