【C/C++】MQTT

文章目录

  • MQTT 协议
    • 1 基本概念
    • 2 核心特性
    • 3 核心组件
    • 4 C++ 简易实现(基于 Paho MQTT 库)
      • 环境准备
      • 示例代码
    • 不同mqtt对比
      • 关键差异说明

MQTT 协议

1 基本概念

MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅模式消息传输协议,专为低带宽、高延迟或不稳定的网络环境设计,广泛应用于物联网(IoT)场景。

官方定义

MQTT is a Client Server publish/subscribe messaging transport protocol.
It is light weight, open, simple, and designed to be easy to implement.
These characteristics make it ideal for use in many situations, including constrained environments such as for communication in Machine to Machine (M2M) and Internet of Things (IoT) contexts where a small code footprint is required and/or network bandwidth is at a premium.

The protocol runs over TCP/IP, or over other network protocols that provide ordered, lossless, bi-directional connections. Its features include:

  • Use of the publish/subscribe message pattern which provides one-to-many message distribution and decoupling of applications.

  • A messaging transport that is agnostic to the content of the payload.

  • Three qualities of service for message delivery:

    • “At most once”, where messages are delivered according to the best efforts of the operating environment. Message loss can occur. This level could be used, for example, with ambient sensor data where it does not matter if an individual reading is lost as the next one will be published soon after.
    • “At least once”, where messages are assured to arrive but duplicates can occur.
    • “Exactly once”, where messages are assured to arrive exactly once. This level could be used, for example, with billing systems where duplicate or lost messages could lead to incorrect charges being applied.
  • A small transport overhead and protocol exchanges minimized to reduce network traffic.

  • A mechanism to notify interested parties when an abnormal disconnection occurs.

2 核心特性

  • 轻量高效:报文头部最小仅2字节。
  • 发布/订阅模型:解耦消息生产者(Publisher)和消费者(Subscriber)。
  • QoS支持:提供3种消息传输质量等级:
    • QoS 0:最多一次(可能丢包)。
    • QoS 1:至少一次(确保送达,可能重复)。
    • QoS 2:精确一次(复杂握手保证唯一性)。
  • 低功耗:适合嵌入式设备。
  • 基于TCP/IP:默认端口1883(未加密)、8883(SSL加密)。

3 核心组件

  • Broker:消息代理服务器,负责消息路由和转发。
  • Client:设备或应用程序,可发布或订阅消息。
  • Topic:分层消息主题(如 sensors/temperature)。

4 C++ 简易实现(基于 Paho MQTT 库)

环境准备

  1. 安装 Mosquitto Broker
    sudo apt-get install mosquitto mosquitto-clients
    
  2. 安装 Paho MQTT C++ 库
# c++库的依赖
git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqtt.c
cmake -B build -DPAHO_WITH_SSL=ON
cmake --build build
sudo cmake --install build --prefix /usr/local# C++库
git clone https://github.com/eclipse/paho.mqtt.cpp
cd paho.mqtt.cpp
cmake -B build -DPAHO_MQTT_C_LIBRARIES=/usr/local/lib/libpaho-mqtt3as.so
cmake --build build
sudo cmake --install build --prefix /usr/local

示例代码

  1. 发布者(Publisher)
#include <mqtt/client.h>
#include <iostream>const std::string BROKER_ADDRESS = "tcp://localhost:1883";
const std::string CLIENT_ID = "paho_cpp_publisher";
const std::string TOPIC = "test/topic";int main() {mqtt::client client(BROKER_ADDRESS, CLIENT_ID);try {// 连接到 Brokerclient.connect();std::cout << "Connected to broker!" << std::endl;// 发布消息std::string payload = "Hello MQTT!";auto msg = mqtt::make_message(TOPIC, payload);client.publish(msg);std::cout << "Message published: " << payload << std::endl;// 断开连接client.disconnect();}catch (const mqtt::exception& exc) {std::cerr << "Error: " << exc.what() << std::endl;return 1;}return 0;
}
  1. 订阅者(Subscriber)
#include <mqtt/client.h>
#include <iostream>
#include <cstdlib>const std::string BROKER_ADDRESS = "tcp://localhost:1883";
const std::string CLIENT_ID = "paho_cpp_subscriber";
const std::string TOPIC = "test/topic";class callback : public mqtt::callback {
public:void message_arrived(mqtt::const_message_ptr msg) override {std::cout << "Message received: " << msg->get_payload()<< " on topic: " << msg->get_topic() << std::endl;}
};int main() {mqtt::client client(BROKER_ADDRESS, CLIENT_ID);callback cb;client.set_callback(cb);try {// 连接到 Brokerclient.connect();client.subscribe(TOPIC);std::cout << "Subscribed to topic: " << TOPIC << std::endl;// 保持运行以接收消息while (true) {std::this_thread::sleep_for(std::chrono::seconds(1));}client.disconnect();}catch (const mqtt::exception& exc) {std::cerr << "Error: " << exc.what() << std::endl;return 1;}return 0;
}
  1. 编译与运行
  • 编译命令(使用 g++):
    g++ publisher.cpp -o publisher -lpaho-mqttpp3 -lpaho-mqtt3as
    g++ subscriber.cpp -o subscriber -lpaho-mqttpp3 -lpaho-mqtt3as
    
  • 运行步骤:
    • 启动 Broker(Mosquitto默认已后台运行)。
    • 启动订阅者:./subscriber
    • 启动发布者:./publisher

  1. 关键点解析
  • QoS 设置:在 publishsubscribe 时可通过参数指定 QoS 等级。
  • 异步通信:Paho 库支持异步回调机制(如 message_arrived)。
  • 遗嘱消息(Last Will):可在连接时设置遗嘱消息,用于客户端异常断线通知。

通过此实现,您已掌握 MQTT 的核心通信流程。实际项目中可根据需求扩展消息持久化、SSL加密等功能。

不同mqtt对比

关键差异说明

特性Paho MQTT C++ 库Mosquitto C 库
编程风格面向对象(C++封装)面向过程(C语言接口)
安装复杂度较高(需手动编译依赖)简单(直接 apt 安装)
功能扩展性更丰富的异步回调机制基础功能
文档支持官方文档详细社区示例较多

推荐选择:

  • 如果需高性能和异步特性,优先选择 Paho MQTT C++ 库
  • 如果快速验证或简单项目,直接使用 Mosquitto C 库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Java 高并发程序设计》笔记

&#x1f4a1; 根据 遗忘曲线&#xff1a;如果没有记录和回顾&#xff0c;6天后便会忘记75%的内容 读书笔记正是帮助你记录和回顾的工具&#xff0c;不必拘泥于形式&#xff0c;其核心是&#xff1a;记录、翻看、思考 ::: 书名Java 高并发程序设计作者葛一鸣、郭超状态已读完简…

Fine Structure-Aware Sampling(AAAI 2024)论文笔记和启发

文章目录 本文解决的问题本文提出的方法以及启发 本文解决的问题 传统的基于Pifu的人体三维重建一般通过采样来进行学习。一般选择的采样方法是空间采样&#xff0c;具体是在surface的表面随机位移进行样本的生成。这里的采样是同时要在XYZ三个方向上进行。所以这导致了一个问…

【AI面试准备】性能测试与AI模型结合应用指南

面试题&#xff1a; 性能测试&#xff1a;AI模型预测系统瓶颈&#xff08;如LoadRunnerAI模块&#xff09;。 性能测试与AI模型预测系统瓶颈的结合是当前软件工程和运维领域的重要趋势&#xff0c;能够显著提升系统优化效率和问题预测能力。以下从核心概念、技术实现、快速掌握…

Spring MVC 与 FreeMarker 整合

以下是 Spring MVC 与 FreeMarker 整合的详细步骤&#xff0c;包含配置和代码示例&#xff1a; 1. 添加依赖 在 pom.xml 中引入 Spring MVC 和 FreeMarker 的依赖&#xff08;以 Maven 为例&#xff09;&#xff1a; <!-- Spring Web MVC --> <dependency><gr…

Redis分布式锁使用以及对接支付宝,paypal,strip跨境支付

本章重点在于如何使用redis的分布式锁来锁定库存。减少超卖&#xff0c;同时也对接了支付宝&#xff0c;paypal&#xff0c;strip跨境支付 第一步先建立一个商品表 CREATE TABLE sys_product (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,code varchar(60) DEFAUL…

使用frpc链接内网的mysql

以下是配置 frpc 连接内网 MySQL 服务的详细步骤&#xff1a; 1. 准备工作 frps 服务器&#xff1a;已部署在公网 IP 11.117.11.245&#xff0c;假设 frps 的默认端口为 7000。 内网 MySQL 服务&#xff1a;运行在内网机器的 3306 端口。 目标&#xff1a;通过公网 IP 11.117…

2025信息安全网络安全意识培训资料汇编(24份)

最新整理&#xff1a;2025信息安全网络安全意识培训资料汇编&#xff0c;共24份资料&#xff0c;供学习参考。 互联网信息安全意识培训.pptx100个网络安全风险防范知识.pptx亚信信息安全意识培训.pptx网络安全法规及意识培训.pptx网络安全意识与案例分析.pptx绿盟-安全意识培训…

JAVA:使用 XStream 实现对象与XML转换的技术指南

1、简述 XStream 是一个简单便捷的 Java 库,用于对象与 XML 的相互转换。其主要特点是: 易于使用:无需复杂的配置即可直接使用。支持自定义:可以灵活地定制对象的序列化和反序列化规则。强大的功能:支持注解、自定义转换器等。本文将详细介绍 XStream 的基本使用方法,并…

VITA STANDARDS LIST,VITA 标准清单下载

VITA STANDARDS LIST&#xff0c;VITA 标准清单下载 DesignationTitleAbstractStatusVMEbus Handbook, 4th EditionA users guide to the VME, VME64 and VME64x bus specifications - features over 70 product photos and over 160 circuit diagrams, tables and graphs. The…

Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows]

Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows] 需要有游戏正版基础本体&#xff0c;安装路径不能带有中文&#xff0c;或其它非常规拉丁字符&#xff1b; DLC 版本 至最新全部 DLC 后续可能无法及时更新文章&#xff0c;具体最新版本见下载文件说明 DLC 解锁列表&…

【Java idea配置】

IntelliJ IDEA创建类时自动生成注释 /** * program: ${PROJECT_NAME} * * since: jdk1.8 * * description: ${description} * * author: ${USER} * * create: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} **/自动导入和自动移除无用导入 idea彩色日志不生效 调试日志输出 在…

计算方法实验六 数值积分

【实验性质】综合性实验。 【实验目的】理解插值型积分法&#xff1b;掌握复化积分法算法。 【实验内容】 1对 &#xff0c;用复化梯形积分和变步长梯形积分求值&#xff08;截断误差不超过&#xff09;。 【理论基础】 积分在工程中有重要的应用&#xff0c;数值积分…

Webug4.0靶场通关笔记11- 第15关任意文件下载与第16关MySQL配置文件下载

目录 一、文件下载 二、第15关 任意文件下载 1.打开靶场 2.源码分析 3.渗透实战 三、第16关 MySQL配置文件下载 1.打开靶场 2.源码分析 3.渗透实战 &#xff08;1&#xff09;Windows系统 &#xff08;2&#xff09;Linux系统 四、渗透防御 一、文件下载 本文通过…

小土堆pytorch--tensorboard的使用

小土堆pytorch--tensorboard的使用 小土堆pytorch--tensorboard的使用0.介绍1.使用tensorboard绘制 y x 等简单函数1.1 相应的代码1.2 对上述代码的解释1.3 可能遇到的问题1.3.1 问题1.3.2 解决方法 2.使用tensorboard加载数据集中的图片2.1 相应代码2.2 对上述代码的解释2.2.…

大模型(LLMs)RAG 版面分析——文本分块面

大模型&#xff08;LLMs&#xff09;RAG 版面分析——文本分块面 一、为什么需要对文本分块&#xff1f; 二、能不能介绍一下常见的文本分块方法&#xff1f; 2.1 一般的文本分块方法 2.2 正则拆分的文本分块方法 2.3 Spacy Text Splitter 方法 2.4 基于 langchain 的 Cha…

解构区块链身份认证:从ID到零知识证明的实战指南

引言 在数字经济高速发展的今天&#xff0c;数字身份已成为个人与数字世界交互的核心凭证。传统中心化身份系统存在数据孤岛、隐私泄露、单点故障等痛点&#xff0c;而区块链技术凭借​​去中心化、不可篡改、可追溯​​的特性&#xff0c;为数字身份验证提供了革命性解决方案…

c#数据结构 线性表篇 非常用线性集合总结

本人能力有限,使用了一些Ai的结论,如有不足还请斧正 目录 1.HashSet <> Dictionary 2.SortedSet <>提供升序方法的List 3.ArrayList<>List 4.BitArray <> Bit[] array 5.StringCollection <>List 6.StringDictionary<>Dictionary 1…

爬虫管理平台-最新版本发布

TaskPyro 是什么&#xff1f; TaskPyro 是一个轻量级的 Python 任务调度平台&#xff0c;专注于提供简单易用的任务管理和爬虫调度解决方案。它能够帮助您轻松管理和调度 Python 任务&#xff0c;特别适合需要定时执行的爬虫任务和数据处理任务。 官方文档&#xff1a;https:/…

过采样处理

一、数据读取与初步观察 首先&#xff0c;使用pandas库读取信用卡交易数据集&#xff1a; data pd.read_csv(r"./creditcard.csv") print(data.head())通过head()方法查看数据集的前几行&#xff0c;初步了解数据的结构和内容。该数据集包含交易时间、交易金额、多…

潮乎盲盒商城系统全开源多级分销推广海报奖品兑换试玩概率OSS云存储多端源码

一、源码描述 这是一套潮乎盲盒商城源码&#xff0c;仿小叮当盲盒商城&#xff0c;后端Laravel框架前端uniappvue&#xff0c;前后端数据库分离&#xff0c;支持四端同步数据&#xff08;H5小程序等&#xff09;&#xff0c;测试环境: php7.4&#xff0c;mysql5.6&#xff0c;…