MQTT基本原理整理

目录

一、MQTT 是什么?

二、MQTT 的几个关键概念

1. Broker(中转站)

 2. Publisher(发布者)

 3. Subscriber(订阅者)

4. Topic(话题)

三、为什么用 MQTT?(对比 HTTP)

四、MQTT 使用流程图

五、示例(c++)

 1. 安装依赖(Ubuntu)

2. 示例代码:mqtt_example.cpp

3. 编译运行

六、更多尝试

七、总结

附:常用 MQTT Broker 测试地址

一、MQTT 是什么?

MQTT,全称 Message Queuing Telemetry Transport(消息队列遥测传输协议),是一种轻量级的网络通信协议,特别适合用在以下这些场景:

  • 网络不稳定(如无线、蜂窝网)

  • 带宽受限(如 IoT 设备)

  • 需要实时通信(如遥控、传感器)

MQTT和其他应用层协议的区别:

特性/协议MQTTHTTPWebSocketCoAPAMQP
模型发布/订阅请求/响应全双工通信请求/响应发布/订阅
传输层协议TCPTCPTCPUDPTCP
协议开销非常低(2字节头)高(带请求头等)中等极低中等偏高
实时性
消息可靠性可调 QoS(0,1,2)一般一般较弱(基于 UDP)强(事务机制)
适用场景物联网、传感器、低带宽环境网页、API 服务实时聊天、游戏超轻量 IoT(如电池设备)企业级消息队列系统
带宽/功耗敏感性非常适合不适合一般非常适合一般
是否有中间代理(Broker)否(一般是服务器)一般无是(如 RabbitMQ)

二、MQTT 的几个关键概念

MQTT 使用的是发布-订阅(Publish/Subscribe)模型,不是传统的客户端直接找服务器通信的方式。

1. Broker(中转站)

所有消息都要经过它,就像菜鸟驿站一样负责收发快递。常见的有:

 2. Publisher(发布者)

谁要“发消息”,谁就是发布者,比如一个温度传感器上传数据。

 3. Subscriber(订阅者)

谁想“接收消息”,谁就订阅某个话题,比如手机 App 想接收温度。

4. Topic(话题)

消息的“类别”,像新闻频道里的“国际/体育/财经”频道。


三、为什么用 MQTT?(对比 HTTP)

特性MQTTHTTP
模型发布/订阅请求/响应
消息大小相对较大
实时性一般
适合谁?IoT设备、边缘计算网页、后台

四、MQTT 使用流程图



五、示例(c++)

Paho MQTT C++ 库 写一个示例程序,功能包括:

  • 连接到服务器

  • 订阅一个话题

  • 发布一条消息

 1. 安装依赖(Ubuntu)

sudo apt update
sudo apt install libpaho-mqttpp3-dev libpaho-mqtt3as-dev

2. 示例代码:mqtt_example.cpp

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

const std::string SERVER_ADDRESS = "tcp://test.mosquitto.org:1883";
const std::string CLIENT_ID = "cpp_mqtt_client";
const std::string TOPIC = "test/topic";

const int QOS = 1;

class callback : public virtual mqtt::callback {
public:
    void connection_lost(const std::string& cause) override {
        std::cout << "Connection lost: " << cause << std::endl;
    }

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

    void delivery_complete(mqtt::delivery_token_ptr token) override {
        std::cout << "Delivery complete." << std::endl;
    }
};

int main() {
    mqtt::async_client client(SERVER_ADDRESS, CLIENT_ID);
    callback cb;
    client.set_callback(cb);

    mqtt::connect_options connOpts;
    connOpts.set_clean_session(true);

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

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

        std::cout << "Publishing message..." << std::endl;
        mqtt::message_ptr pubmsg = mqtt::make_message(TOPIC, "Hello MQTT!");
        pubmsg->set_qos(QOS);
        client.publish(pubmsg)->wait();

        std::this_thread::sleep_for(std::chrono::seconds(5));

        std::cout << "Disconnecting..." << std::endl;
        client.disconnect()->wait();
    }
    catch (const mqtt::exception& e) {
        std::cerr << "MQTT Error: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

3. 编译运行

g++ mqtt_example.cpp -o mqtt_example -lpaho-mqttpp3 -lpaho-mqtt3as -pthread
./mqtt_example

结果:

Connecting to broker...
Subscribing to topic...
Publishing message...
Message received: Hello MQTT!
Disconnecting...

六、更多尝试

  • 在本地部署 MQTT 服务器(mosquitto)

  • 多线程订阅多个话题

  • 集成到你自己的嵌入式设备

  • 配合 Web 前端做远程控制


七、总结

MQTT 是什么?一种轻量、实时的消息通信协议
适合谁?物联网、嵌入式设备、低带宽网络
学会什么?用 C++ + Paho 实现 MQTT 发布/订阅

附:常用 MQTT Broker 测试地址

服务器地址
Mosquittotcp://test.mosquitto.org:1883
EMQXbroker.emqx.io
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值