当前位置: 首页 > 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实现安卓电池充电动效 | 打造工业级电量控件
  • 特斯拉一季度净利下滑七成,马斯克表态将继续倡导关税下调
  • 快评|对华关税或“大幅下降”,市场压力之下特朗普“急于与中国达成协议”
  • 宝马董事长:继续倡导自由贸易和开放市场,坚信全球性挑战需要多协作而非对立,将引入DeepSeek
  • 云南城投去年营收约19.29亿元,亏损4945万元
  • 医学泰斗客死他乡?AI小作文批量如何炮制?对话已被抓获的网络水军成员
  • 2025年度沪惠保参保今开启:保费不变,国内特药种类扩增