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

MQTT协议介绍与C++服务端客户端实现

文章目录

      • 一、MQTT协议简介
      • 二、MQTT协议的开源库
      • 三、C++ 实现MQTT服务端和客户端
        • 1. 环境准备
        • 2. MQTT客户端代码(C++)
        • 3. MQTT服务端代码(C++)
        • 4. 测试用例
      • 四、总结


一、MQTT协议简介

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息发布/订阅协议,设计用于低带宽、高延迟、不稳定的网络环境,广泛应用于物联网(IoT)设备间的通信。其基于客户端-服务器架构,通常使用TCP/IP协议作为传输层协议。

MQTT协议的特点:

  1. 轻量级:头部开销小,适合低带宽环境。
  2. 支持QoS(服务质量)
    • QoS 0:最多一次传递。
    • QoS 1:至少一次传递。
    • QoS 2:只有一次传递。
  3. 发布/订阅模式:客户端可以发布消息,也可以订阅消息,支持多对多通信。
  4. 保持连接:长时间保持连接,适合需要实时通讯的场景。
  5. 最后遗嘱消息:客户端掉线时,可以由服务器发布“最后遗嘱”消息。
  6. 持久化会话:支持消息持久化,可以确保消息在客户端不在线时仍然可以接收。

二、MQTT协议的开源库

  1. Paho MQTT C/C++

    • 由Eclipse基金会维护,是最流行的MQTT客户端库之一,支持多种编程语言,包括C和C++。
    • 官网:https://www.eclipse.org/paho/
  2. Mosquitto

    • 是一个轻量级的MQTT消息代理,提供了C语言的客户端库,可以作为MQTT服务器来使用。
    • 官网:https://mosquitto.org/
  3. 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. 环境准备
  1. 安装 Paho MQTT C++ 库:

    sudo apt-get install libpaho-mqttpp3-dev
    sudo apt-get install libpaho-mqtt3c-dev
    
  2. 使用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 作为服务器,不需要自己实现服务端代码。

  1. 启动 Mosquitto 服务器:

    mosquitto -d
    

    如果需要更改配置,可以编辑 /etc/mosquitto/mosquitto.conf 文件。

4. 测试用例
  1. 启动 Mosquitto 服务器:

    mosquitto -d
    
  2. 运行 MQTT 客户端程序:

    g++ -std=c++11 -o mqtt_client mqtt_client.cpp -lpaho-mqttpp3 -lpaho-mqtt3c
    ./mqtt_client
    
  3. 在终端输入消息,例如:

    Enter message to send (or 'exit' to quit): Hello MQTT
    
  4. 运行 mosquitto_sub 命令来订阅 test/topic

    mosquitto_sub -t test/topic
    
  5. 你将看到客户端发送的消息,例如:

    Hello MQTT
    

四、总结

  • MQTT协议非常适合物联网设备和低带宽、高延迟的环境,采用了发布/订阅模式,能有效减少网络负担。
  • 使用开源库如 Paho MQTT C++Mosquitto,可以很方便地实现MQTT客户端和服务器。
  • 以上代码实现了一个简单的MQTT客户端,可以发送和接收消息。服务端通常由 Mosquitto 提供,可以直接安装和配置。

http://www.kler.cn/a/444148.html

相关文章:

  • 阿里云百炼大模型生成贪吃蛇小游戏
  • W25Q128读写实验(一)
  • 【Linux进程】进程间的通信
  • 【LeetCode】45.跳跃游戏II
  • elasticsearch 7.6.2版本即使使用wildcard模糊查询,也毫无过滤效果分析
  • Qlib安装成功步骤和测试是否成功
  • Qt5与Qt6中的高DPI缩放属性解析
  • mysql中与并发相关的问题?
  • matlab的一些时间函数【转】
  • AGM FPGA如何配置上拉或者下拉电阻
  • 按照字幕拆解视频实战
  • SSH连接成功,但VSCode连接不成功
  • DALSA工业相机SDK二次开发(图像采集及保存)C#版
  • 智慧社区系统源码社区服务软件家政跑腿月嫂保洁维修小程序
  • 企业如何选择媒体发稿平台及相关事项?媒介盒子分享
  • maven权威指南(读书笔记一)
  • 「iOS」通过CoreLocation Framework深入了解MVC架构
  • 硬件---14---PCB学习:PCB封装库及布局操作
  • Linux Red Hat安装包安装nodejs
  • samout llm解码 幻觉更低更稳定
  • CentOS 快捷安装 jenkins 并设置开机自启
  • vue相关的---Vuex
  • 游戏AI实现-寻路算法(DFS)
  • ESP-AT 固件:物联网智能 “引擎”
  • C语言学习day22:URLDownloadToFile函数/开发文件下载工具
  • [python]使用flask-caching缓存数据