特点:
- 类似ROS的publisher和subscriber,
- 允许设置发布和订阅的 topic name
- Subscriber支持设置回调函数,在订阅到数据的时候触发回调函数;
- 通过C++模板
template
配合MsgPack
,允许发布和订阅任意类型的数据,包括int、std::string以及自定义的结构体; - 支持全部ZMQ协议:
tcp
,ipc
,inproc
和epgm
。- 单个进程内可使用
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协议, 无需传入contextzmqext::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 datastd::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
===