MQTT协议介绍与C++服务端客户端实现
文章目录
- 一、MQTT协议简介
- 二、MQTT协议的开源库
- 三、C++ 实现MQTT服务端和客户端
- 1. 环境准备
- 2. MQTT客户端代码(C++)
- 3. MQTT服务端代码(C++)
- 4. 测试用例
- 四、总结
一、MQTT协议简介
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息发布/订阅协议,设计用于低带宽、高延迟、不稳定的网络环境,广泛应用于物联网(IoT)设备间的通信。其基于客户端-服务器架构,通常使用TCP/IP协议作为传输层协议。
MQTT协议的特点:
- 轻量级:头部开销小,适合低带宽环境。
- 支持QoS(服务质量):
- QoS 0:最多一次传递。
- QoS 1:至少一次传递。
- QoS 2:只有一次传递。
- 发布/订阅模式:客户端可以发布消息,也可以订阅消息,支持多对多通信。
- 保持连接:长时间保持连接,适合需要实时通讯的场景。
- 最后遗嘱消息:客户端掉线时,可以由服务器发布“最后遗嘱”消息。
- 持久化会话:支持消息持久化,可以确保消息在客户端不在线时仍然可以接收。
二、MQTT协议的开源库
-
Paho MQTT C/C++:
- 由Eclipse基金会维护,是最流行的MQTT客户端库之一,支持多种编程语言,包括C和C++。
- 官网:https://www.eclipse.org/paho/
-
Mosquitto:
- 是一个轻量级的MQTT消息代理,提供了C语言的客户端库,可以作为MQTT服务器来使用。
- 官网:https://mosquitto.org/
-
MQTT-C:
- 一个轻量级的C语言实现,用于实现MQTT协议的客户端功能。
- GitHub:https://github.com/LiamBindle/MQTT-C### 一、MQTT协议简介
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息发布/订阅协议,设计用于低带宽、高延迟、不稳定的网络环境,广泛应用于物联网(IoT)设备间的通信。其基于客户端-服务器架构,通常使用TCP/IP协议作为传输层协议。
三、C++ 实现MQTT服务端和客户端
下面是基于 Paho MQTT C++
库的实现示例,展示如何用C++编写一个简单的MQTT服务端和客户端。
1. 环境准备
-
安装
Paho MQTT C++
库:sudo apt-get install libpaho-mqttpp3-dev sudo apt-get install libpaho-mqtt3c-dev
-
使用Mosquitto作为MQTT代理服务(如果没有安装Mosquitto,使用下面的命令安装):
sudo apt-get install mosquitto mosquitto-clients
启动Mosquitto:
sudo systemctl start mosquitto
2. MQTT客户端代码(C++)
#include <iostream>
#include <string>
#include <mqtt/async_client.h>
const std::string SERVER_ADDRESS("tcp://localhost:1883");
const std::string CLIENT_ID("example_client");
const std::string TOPIC("test/topic");
class MyCallBack : public virtual mqtt::callback,
public virtual mqtt::iaction_listener {
public:
void connected(const std::string& cause) override {
std::cout << "Connected to the broker." << std::endl;
}
void connection_lost(const std::string& cause) override {
std::cout << "Connection lost: " << cause << std::endl;
}
void message_arrived(const std::string& topic, mqtt::message_ptr msg) override {
std::cout << "Message arrived on topic: " << topic << ", message: " << msg->to_string() << std::endl;
}
void delivery_complete(mqtt::delivery_token_ptr tok) override {
std::cout << "Message delivery completed for message id: " << tok->get_message_id() << std::endl;
}
void on_action_failure(const mqtt::token& tok) override {
std::cout << "Action failed for message id: " << tok.get_message_id() << std::endl;
}
void on_action_success(const mqtt::token& tok) override {
std::cout << "Action succeeded for message id: " << tok.get_message_id() << std::endl;
}
};
int main() {
mqtt::async_client client(SERVER_ADDRESS, CLIENT_ID);
MyCallBack cb;
client.set_callback(cb);
try {
std::cout << "Connecting to broker..." << std::endl;
client.connect()->wait();
std::cout << "Subscribing to topic: " << TOPIC << std::endl;
client.subscribe(TOPIC, 1);
std::string line;
while (true) {
std::cout << "Enter message to send (or 'exit' to quit): ";
std::getline(std::cin, line);
if (line == "exit") break;
client.publish(TOPIC, line.c_str(), line.length(), 1, false);
}
client.disconnect()->wait();
} catch (const mqtt::exception& exc) {
std::cerr << "MQTT error: " << exc.what() << std::endl;
}
return 0;
}
3. MQTT服务端代码(C++)
MQTT的服务端通常是指消息代理(broker),如 Mosquitto
。你可以直接使用 Mosquitto
作为服务器,不需要自己实现服务端代码。
-
启动
Mosquitto
服务器:mosquitto -d
如果需要更改配置,可以编辑
/etc/mosquitto/mosquitto.conf
文件。
4. 测试用例
-
启动
Mosquitto
服务器:mosquitto -d
-
运行 MQTT 客户端程序:
g++ -std=c++11 -o mqtt_client mqtt_client.cpp -lpaho-mqttpp3 -lpaho-mqtt3c ./mqtt_client
-
在终端输入消息,例如:
Enter message to send (or 'exit' to quit): Hello MQTT
-
运行
mosquitto_sub
命令来订阅test/topic
:mosquitto_sub -t test/topic
-
你将看到客户端发送的消息,例如:
Hello MQTT
四、总结
- MQTT协议非常适合物联网设备和低带宽、高延迟的环境,采用了发布/订阅模式,能有效减少网络负担。
- 使用开源库如
Paho MQTT C++
和Mosquitto
,可以很方便地实现MQTT客户端和服务器。 - 以上代码实现了一个简单的MQTT客户端,可以发送和接收消息。服务端通常由
Mosquitto
提供,可以直接安装和配置。