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

基于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
===

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

相关文章:

  • css之display:grid布局改块级元素布局
  • CF292C Beautiful IP Addresses 题解
  • Redis-缓存过期和内存淘汰
  • 机器学习和深度神经网络 参数调参数 太麻烦,非常费时间怎么办,用自动化超参数优化方法
  • IPv6报头40字节具体怎么分配的?
  • 前端面试题---循环渲染里面key的作用(vue)
  • [Android]文本多的时候让TextView的字体自动变小
  • 测试使用Cursor中的deepseek-V3大模型辅助开发一个小程序
  • 58,web面试测试题
  • Go Web 项目实战:构建 RESTful API、命令行工具及应用部署
  • 网络安全域管理 网络安全管理体系
  • 某手sig3-ios算法 Chomper黑盒调用
  • 解决gradio无法通过ip访问
  • Fino1: 关于推理增强型大型语言模型在金融领域的可迁移性
  • C#应用程序重启实现
  • HTML/CSS中属性选择器
  • 蓝桥杯备考:贪心算法之矩阵消除游戏
  • VScode 使用Deepseek又方便又好用的另一款插件
  • 【STM32】外部时钟|红外反射光电开关
  • EasyRTC智能硬件:实时畅联、沉浸互动、消音护航