【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.pswp.cn/diannao/81760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81760.shtml
英文地址,請注明出處:http://en.pswp.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;…