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

windows 下 使用C++ 集成 zenoh

zenoh 是由rust编写的一个跨平台 网络中间件 ,支持 pub,sub,query。 提供多语言绑定。

据说性能稍逊于NNG。

一,编译 成 C dll

cmake 编译C dll

git clone https://github.com/eclipse-zenoh/zenoh-c.git

二,编译 C++ dll

cmake 编译 C++ dll  需要依赖第一步的 C dll

https://github.com/eclipse-zenoh/zenoh-cpp.git

三,demo 

(1),将所有 编译出来的 dll /include/lib 放到一起

(2),客户端 cmake 文件 配置

需要引用c  和c++ 的cmake配置文件

(3),客户端 

#include <iostream>
#include <thread>
#include <chrono>
#include <condition_variable>
#include <map>
#include <mutex>#include "zenoh.hxx"
using namespace zenoh;struct Selector {std::string key_expr;std::string parameters;
};int main(int, char **) {init_log_from_env_or("error");Config config = Config::create_default();auto session = Session::open(std::move(config));while (1){//  session.put("demo/example/simple", "Simple!");std::this_thread::sleep_for(std::chrono::milliseconds (5000));auto on_reply = [](const Reply &reply) {if (reply.is_ok()) {const auto &sample = reply.get_ok();std::cout << "Received ('" << sample.get_keyexpr().as_string_view() << "' : '"<< sample.get_payload().as_string() << "')\n";} else {std::cout << "Received an error :" << reply.get_err().get_payload().as_string() << "\n";auto now = std::chrono::system_clock::now();auto timestamp_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();std::cout << "Timestamp (ms): " << timestamp_ms << std::endl;}};std::mutex m;std::condition_variable done_signal;bool done = false;auto on_done = [&m, &done, &done_signal]() {std::lock_guard lock(m);std::cout<<"done ....."<<std::endl;auto now = std::chrono::system_clock::now();auto timestamp_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();std::cout << "Done  Timestamp (ms): " << timestamp_ms << std::endl;done = true;done_signal.notify_all();};auto payload = std::string("payload123");uint64_t timeout_ms = 1000;QueryTarget query_target = zenoh::QueryTarget::Z_QUERY_TARGET_BEST_MATCHING;Selector selector = Selector{std::string("demo/example/**"), ""};Session::GetOptions options;options.target = query_target;if (!payload.empty()) {options.payload = payload;}options.timeout_ms = timeout_ms;session.get(selector.key_expr, selector.parameters, on_reply, on_done, std::move(options));auto now = std::chrono::system_clock::now();auto timestamp_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();std::cout << "Timestamp (ms): " << timestamp_ms << std::endl;std::unique_lock lock(m);done_signal.wait(lock, [&done] { return done; });}}

(4),服务端 cmake 配置

(5),服务端 

#include <iostream>
#include "zenoh.hxx"
#include <chrono>
using namespace zenoh;const char *kind_to_str(SampleKind kind) {switch (kind) {case SampleKind::Z_SAMPLE_KIND_PUT:return "PUT";case SampleKind::Z_SAMPLE_KIND_DELETE:return "DELETE";default:return "UNKNOWN";}
}int main(int, char **) {// 初始化日志级别init_log_from_env_or("info");// 初始化 Zenoh sessionConfig config = Config::create_default();auto session = Session::open(std::move(config));//订阅KeyExpr keyexpr("demo/example/simple");//auto queryable_keyexpr = KeyExpr("demo/example/simple_query");auto data_handler = [](const Sample &sample) {std::cout << ">> [Subscriber] Received " << kind_to_str(sample.get_kind()) << " ('"<< sample.get_keyexpr().as_string_view() << "' : '" << sample.get_payload().as_string() << "')";auto attachment = sample.get_attachment();if (attachment.has_value()) {std::cout << "  (" << attachment->get().as_string() << ")";}std::cout << std::endl;};std::cout << "Declaring Subscriber on '" << keyexpr.as_string_view() << "'..." << std::endl;auto subscriber = session.declare_subscriber(keyexpr, data_handler, closures::none);//查询auto keyexprQuery = KeyExpr("demo/example/simple_query");auto payload = "payload456";auto on_query = [payload, keyexprQuery](const Query &query) {auto params = query.get_parameters();auto query_payload = query.get_payload();std::cout << ">> [Queryable ] Received Query '" << query.get_keyexpr().as_string_view() << "?" << params;if (query_payload.has_value()) {std::cout << "' with value = '" << query_payload->get().as_string();}std::cout << "'\n";std::cout << "[Queryable ] Responding ('" << keyexprQuery.as_string_view() << "': '" << payload << "')\n";auto now = std::chrono::system_clock::now();auto timestamp_ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();std::cout << "Timestamp (ms): " << timestamp_ms << std::endl;query.reply(keyexprQuery, payload);};auto on_drop_queryable = []() { std::cout << "Destroying queryable\n"; };Session::QueryableOptions opts;opts.complete = "complete";auto queryable = session.declare_queryable(keyexprQuery, on_query, on_drop_queryable, std::move(opts));// 阻塞,不让进程退出std::cin.get();return 0;
}

(6),运行

这个中间件 同时也支持 C#  rust  java  python 等

http://www.dtcms.com/a/350955.html

相关文章:

  • ArcGIS学习-9 ArcGIS查询操作
  • vLLM轻松通
  • ArcGIS学习-10 空间连接和矢量分析
  • 百度IOS客户端岗位--面试真题分析
  • 5G 三卡图传终端:应急救援管理的 “可视化指挥核心”
  • PostgreSQL诊断系列(3/6):性能瓶颈定位——缓冲池、I/O与临时文件
  • 【Linux系统】线程概念
  • 【R代码分析】甲烷排放绘制代码-参考论文
  • 【云原生】CentOS安装Kubernetes+Jenkins
  • RAW API 的 UDP 总结1
  • Android Glide常见问题解决方案:从图片加载到内存优化
  • [在实践中学习] 中间件理论和方法--Redis
  • 【JavaEE】了解volatile和wait、notify(三)
  • 08-引入AI编程插件(TRAE)编写单元测试并检查覆盖率
  • Cloudflare 推出 GenAI 安全工具,守护企业数据
  • 科普 | 5G支持的WWC架构是个啥(1)?
  • android 改机系列之-虚拟摄像头-替换相机预览画面
  • excel导出,多列合并表头
  • 运行node18报错
  • 【JVM】类加载器都有哪些?
  • ChromaDB向量数据库Python教程:从入门到实战完整指南(含游戏资源管理系统案例
  • Java大厂面试实战:从Spring Boot到微服务架构的全链路技术拆解
  • 计算机视觉:从 “看见” 到 “理解”,解锁机器感知世界的密码
  • Windows 命令行:mkdir 命令
  • 【配置】CurSor使用Claude 4.0如何解除地域限制
  • [CS创世SD NAND征文] CS创世CSNP1GCR01-AOW在运动控制卡中的高可靠应用
  • 塞尔达传说 旷野之息 PC/手机双端(The Legend of Zelda: Breath of the Wild)免安装中文版
  • 深入了解linux系统—— 线程封装
  • podman启动mongdb的container因为权限问题导致changing ownership和读取storage.bson失败的解决方法
  • HarmonyOS image组件深度解析:多场景应用与性能优化指南(2.4详细解析,完整见uniapp官网)