目录
一、MQTT 是什么?
MQTT,全称 Message Queuing Telemetry Transport(消息队列遥测传输协议),是一种轻量级的网络通信协议,特别适合用在以下这些场景:
-
网络不稳定(如无线、蜂窝网)
-
带宽受限(如 IoT 设备)
-
需要实时通信(如遥控、传感器)
MQTT和其他应用层协议的区别:
| 特性/协议 | MQTT | HTTP | WebSocket | CoAP | AMQP |
|---|---|---|---|---|---|
| 模型 | 发布/订阅 | 请求/响应 | 全双工通信 | 请求/响应 | 发布/订阅 |
| 传输层协议 | TCP | TCP | TCP | UDP | TCP |
| 协议开销 | 非常低(2字节头) | 高(带请求头等) | 中等 | 极低 | 中等偏高 |
| 实时性 | 强 | 差 | 强 | 强 | 强 |
| 消息可靠性 | 可调 QoS(0,1,2) | 一般 | 一般 | 较弱(基于 UDP) | 强(事务机制) |
| 适用场景 | 物联网、传感器、低带宽环境 | 网页、API 服务 | 实时聊天、游戏 | 超轻量 IoT(如电池设备) | 企业级消息队列系统 |
| 带宽/功耗敏感性 | 非常适合 | 不适合 | 一般 | 非常适合 | 一般 |
| 是否有中间代理(Broker) | 是 | 否 | 否(一般是服务器) | 一般无 | 是(如 RabbitMQ) |
二、MQTT 的几个关键概念
MQTT 使用的是发布-订阅(Publish/Subscribe)模型,不是传统的客户端直接找服务器通信的方式。
1. Broker(中转站)
所有消息都要经过它,就像菜鸟驿站一样负责收发快递。常见的有:
-
Mosquitto(开源)
-
EMQX(国产)
2. Publisher(发布者)
谁要“发消息”,谁就是发布者,比如一个温度传感器上传数据。
3. Subscriber(订阅者)
谁想“接收消息”,谁就订阅某个话题,比如手机 App 想接收温度。
4. Topic(话题)
消息的“类别”,像新闻频道里的“国际/体育/财经”频道。
三、为什么用 MQTT?(对比 HTTP)
| 特性 | MQTT | HTTP |
|---|---|---|
| 模型 | 发布/订阅 | 请求/响应 |
| 消息大小 | 小 | 相对较大 |
| 实时性 | 强 | 一般 |
| 适合谁? | 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 测试地址
| 服务器 | 地址 |
|---|---|
| Mosquitto | tcp://test.mosquitto.org:1883 |
| EMQX | broker.emqx.io |
1万+

被折叠的 条评论
为什么被折叠?



