当前位置: 首页 > news >正文

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅(Publish/Subscribe)模式的轻量级消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计。它构建在TCP/IP协议之上,由IBM的Andy Stanford-Clark和Cirrus Link的Arlen Nipper于1999年共同开发,旨在为硬件性能低下的远程设备提供一种高效的通信方式。

MQTT协议的基本组成

  • MQTT客户端:任何通过网络使用MQTT进行通信的设备,可以是发布者(Publisher)或订阅者(Subscriber)。发布者将消息发送到特定的主题(Topic),而订阅者则订阅感兴趣的主题来接收消息。
  • MQTT代理(Broker):作为中间件,接收来自发布者的消息,并根据主题将消息分发给所有已订阅该主题的订阅者。代理还负责其他任务,如授权和身份验证、将消息传递给其他系统、处理错过的消息和客户端会话等。
  • 主题(Topic):用于标识消息的类别或内容的字符串,订阅者可以根据主题来选择感兴趣的消息。主题是分层组织的,类似于文件或文件夹目录。

MQTT协议的工作原理

  1. 建立连接:客户端通过向MQTT代理发送CONNECT消息来启动连接,代理通过响应CONNACK消息来确认已建立连接。
  2. 发布消息:客户端可以将消息发布到特定的主题。消息包含主题和数据,数据格式可以是文本、二进制、XML或JSON等。
  3. 订阅主题:客户端向代理发送SUBSCRIBE消息,以接收有关感兴趣主题的消息。此消息包含唯一标识符和订阅列表。
  4. 接收消息:代理收到一条消息后,会将其转发给所有已订阅该主题的订阅者。

MQTT协议的特点

  • 轻量级:协议头部最小仅2字节,网络传输开销极小,适合在窄带网络(如NB-IoT)中使用。
  • 低功耗:使用异步传输机制和较小的数据包传输,使得设备在通信过程中的能耗更低。
  • 高可靠性:提供三种服务质量(QoS)级别,确保消息必达。
  • 灵活扩展:通过主题和通配符机制,设备可以灵活订阅和发布消息,支持大规模设备接入。
  • 适应不稳定网络:心跳机制和会话恢复功能,确保设备在断网后能够快速恢复连接并获取未读消息。

MQTT协议的应用领域

MQTT协议广泛应用于物联网(IoT)设备、传感器网络和分布式系统中。例如,在智能家居系统中,各种智能设备可以通过MQTT协议与中央控制系统通信,实现设备之间的协同工作。此外,MQTT也适用于移动消息推送领域,如Android手机客户端与服务器端的消息推送。

下面是一个使用C++和Paho MQTT客户端库实现MQTT通信的简单示例。这个示例展示了如何连接到MQTT代理、发布消息和订阅主题。

示例代码

#include <iostream>
#include <mqtt/client.h>
#include <mqtt/async_client.h>

// MQTT连接选项
const char* ADDRESS = "tcp://broker.hivemq.com:1883"; // 公共MQTT代理
const char* CLIENT_ID = "cpp_client";
const char* TOPIC = "test/topic";
const int QOS = 1;

// MQTT回调类
class Callback : public virtual mqtt::callback {
public:
    void connection_lost(const std::string& cause) override {
        std::cout << "\nConnection lost, cause: " << cause << std::endl;
    }

    void message_arrived(mqtt::const_message_ptr msg) override {
        std::cout << "Message arrived: " << msg->get_topic() << " - " << msg->get_payload_str() << std::endl;
    }

    void delivery_complete(uint64_t token) override {
        std::cout << "Delivery complete for token: " << token << std::endl;
    }
};

int main() {
    // 创建MQTT客户端
    mqtt::async_client client(ADDRESS, CLIENT_ID);
    Callback cb;
    client.set_callback(cb);

    // 连接到代理
    mqtt::connect_options conn_opts;
    conn_opts.set_keep_alive_interval(20);
    conn_opts.set_clean_session(true);

    try {
        std::cout << "Connecting to MQTT broker..." << std::endl;
        client.connect(conn_opts)->wait();
        std::cout << "Connected to MQTT broker." << std::endl;

        // 订阅主题
        std::cout << "Subscribing to topic: " << TOPIC << std::endl;
        client.subscribe(TOPIC, QOS)->wait();

        // 发布消息
        std::string payload = "Hello, MQTT from C++!";
        std::cout << "Publishing message: " << payload << std::endl;
        client.publish(TOPIC, payload.c_str(), payload.size(), QOS)->wait();

        // 等待几秒钟以接收可能的消息
        std::cout << "Waiting for messages..." << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(5));

        // 断开连接
        std::cout << "Disconnecting from MQTT broker..." << std::endl;
        client.disconnect()->wait();
        std::cout << "Disconnected from MQTT broker." << std::endl;
    } catch (const mqtt::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

代码说明

  1. 包含头文件

    • mqtt/client.hmqtt/async_client.h 是Paho MQTT客户端库的头文件。
  2. 连接选项

    • ADDRESS 是MQTT代理的地址,这里使用的是公共代理 broker.hivemq.com
    • CLIENT_ID 是客户端的唯一标识符。
    • TOPIC 是消息的主题。
    • QOS 是消息的服务质量级别。
  3. 回调类

    • Callback 类继承自 mqtt::callback,用于处理连接丢失、消息到达和消息交付完成等事件。
  4. 主函数

    • 创建 mqtt::async_client 实例。
    • 设置回调。
    • 连接到MQTT代理。
    • 订阅主题。
    • 发布消息。
    • 等待几秒钟以接收可能的消息。
    • 断开连接。

编译和运行

  1. 安装Paho MQTT客户端库

    • 在Ubuntu上可以使用以下命令安装:
      sudo apt-get install libmqttclient-dev
      
  2. 编译代码

    g++ -std=c++11 mqtt_example.cpp -o mqtt_example -lpaho-mqtt3as
    
  3. 运行程序

    ./mqtt_example
    

输出示例

Connecting to MQTT broker...
Connected to MQTT broker.
Subscribing to topic: test/topic
Publishing message: Hello, MQTT from C++!
Waiting for messages...
Message arrived: test/topic - Hello, MQTT from C++!
Delivery complete for token: 1
Disconnecting from MQTT broker...
Disconnected from MQTT broker.

这个示例展示了如何使用C++和Paho MQTT客户端库实现基本的MQTT通信。你可以根据需要扩展功能,例如处理更多的回调事件、增加错误处理逻辑等。

相关文章:

  • L1-088 静静的推荐
  • QT中委托QStyledItemDelegate的使用
  • 6-langchang多模态输入和自定义输出
  • Apache POI详解
  • 保安员考试:巧用记忆术,攻克理论知识堡垒
  • 目标检测YOLO实战应用案例100讲-基于毫米波雷达的多目标检测 (续)
  • protobuf, rpc, 火焰图
  • 大语言模型 (LLM) 基础知识
  • 介绍如何开发一个小样本增量学习程序
  • 国产LIMS系统深度横评 实验室数字化转型最优解
  • Linux之kernel(1)系统基础理论(6)
  • C++ 使用红黑树的实现及迭代器完成对set和map的封装
  • 2025年Draw.io最新版本下载安装教程,附详细图文
  • asm磁盘组扩容加错磁盘
  • 脑电波控制设备:基于典型相关分析(CCA)的脑机接口频率精准解码方法
  • Tomcat下载安装及日志乱码问题解决
  • DeepSeek-专家并行(二)
  • Spring Boot+RabbitMQ+Canal 解决数据一致性
  • 【算法学习计划】动态规划 -- 路径问题
  • 1433抓鸡工具_1433抓鸡工具在软件安全测试中的重要性及应用
  • 媒体:西安62岁男子当街殴打妻子,警方称打人者已被行拘
  • 上海畅通“外转内”,外贸优品成“香饽饽”
  • 恒瑞医药通过港交所上市聆讯,最快或5月挂牌上市
  • 北美票房|“雷霆”开画票房比“美队4”低,但各方都能接受
  • 出口管制不能将民用技术泛安全化,也不能破坏全球供应链稳定
  • 5月1日全国铁路发送旅客2311.9万人次,创历史新高