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

基于cppzmq和MsgPack封装的Publisher Subscriber - 发布订阅模式

特点:

  • 类似ROS的publisher和subscriber,
    • 允许设置发布和订阅的 topic name
    • Subscriber支持设置回调函数,在订阅到数据的时候触发回调函数;
  • 通过C++模板template配合MsgPack,允许发布和订阅任意类型的数据,包括int、std::string以及自定义的结构体;
  • 支持全部ZMQ协议:tcp, ipc, inprocepgm
    • 单个进程内可使用inproc,基于内存通信,速度快
    • 单机多进程间通讯,可使用ipc
    • tcp最通用,适用于各种场景

调用例子:

#include "zmq_utils/publisher.hpp"
#include "zmq_utils/subscriber.hpp"

void intCallback(int&& data) {
    std::cout << "Received integer: " << data << std::endl;
}

int main(int argc, char* argv[])
{
    // tcp协议 or ipc协议 or epgm协议, 无需传入context
    zmqext::Publisher<int> intPub("int_topic", "tcp://*:5556");
    zmqext::Subscriber<int> intSub("int_topic", "tcp://localhost:5556");

    // zmqext::Publisher<int> intPub("int_topic", "ipc://./.zmq_example.ipc");
    // zmqext::Subscriber<int> intSub("int_topic", "ipc://./.zmq_example.ipc");

    // inproc协议 需要用同一个context创建socket
    // auto contextPtr = std::make_shared<zmq::context_t>(0);
    // zmqext::Publisher<int> intPub("int_topic", "inproc://test", contextPtr);
    // zmqext::Subscriber<int> intSub("int_topic", "inproc://test", contextPtr);

    // 设置订阅的回调函数
    intSub.subscribe(intCallback);

    // Publish some data
    std::this_thread::sleep_for(std::chrono::milliseconds(20));
    for (int i = 0; i < 3; ++i) {
        intPub.publish(i);
        
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout << "===" << std::endl;
    }

    return 0;
}

输出(subscriber订阅到数据后触发了回调函数intCallback):

Received integer: 0
===
Received integer: 1
===
Received integer: 2
===

相关文章:

  • 如何组织和管理JavaScript文件:最佳实践与策略
  • MATLAB进阶之路:数据导入与处理
  • Java File 类
  • rman 备份恢复1
  • spring日志
  • OmniParser V2 和 OmniTool 让 AI 来控制 Windows 设备
  • c语言基础第12节《函数的调用》
  • 怎么用cURL库对接智能语音播报设备
  • ShenNiusModularity项目源码学习(10:ShenNius.FileManagement项目分析)
  • Java语法-集合
  • Java——继承
  • 【OS安装与使用】part5-ubuntu22.04基于conda安装pytorch+tensorflow
  • 深入解析 sudo -l 命令的输出内容
  • pdf预览在vue项目中的使用兼容ie浏览器
  • 面对STM32的庞大体系,如何避免迷失在细节中?
  • [python]windows上安装yolov12环境
  • 选好加密狗,一次说全
  • Deepseek快速做PPT
  • Go Web 项目实战:构建 RESTful API、命令行工具及应用部署
  • 用C++ Qt实现安卓电池充电动效 | 打造工业级电量控件
  • 中信银行:拟出资100亿元全资设立信银金融资产投资有限公司
  • 高盛上调A股未来12个月目标点位,沪深300指数潜在回报15%
  • 美政府被曝下令加强对格陵兰岛间谍活动,丹麦将召见美代办
  • 特朗普政府拟终止太空污染研究,马斯克旗下太空公司将受益
  • 以军总参谋长:已进入“决定性打击计划的第二阶段”
  • 民生访谈|摆摊设点、公园搭帐篷、行道树飘絮,管理难题怎么解?