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 session
    Config 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 等

相关推荐
Cloud_Shy61812 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
半只小闲鱼17 分钟前
配置计划模块通用办公设备家具批复数合计计算
开发语言·python
是个西兰花18 分钟前
linux:命名管道与共享内存
linux·运维·服务器·网络·c++
凡人叶枫28 分钟前
Effective C++ 条款08:别让异常逃离析构函数
java·linux·数据库·c++·嵌入式开发
qq_4221525740 分钟前
Word 文件太大怎么压缩?2026 年文档瘦身方案对比
开发语言·c#·word
charliedev44 分钟前
Jedi:Python 自动补全与静态分析的实用工具
开发语言·python·其他
ji198594431 小时前
MATLAB 求散点曲线斜率
开发语言·算法·matlab
kaikaile19951 小时前
MATLAB 实现:Koch & Zhao 图像水印算法(DCT域)
开发语言·算法·matlab
love_muming1 小时前
链表每日一练
java·开发语言·数据结构·链表·idea·每日一练
QiLinkOS1 小时前
QiLink开源生态的三维重构:基于时间、空间与社会价值的底层规则创新白皮书
大数据·c++·人工智能·科技·算法·gitee·开源