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 等

相关推荐
whltaoin4 分钟前
Java 后端与 AI 融合:技术路径、实战案例与未来趋势
java·开发语言·人工智能·编程思想·ai生态
wjs202412 分钟前
jEasyUI 自定义窗口工具栏
开发语言
二十雨辰24 分钟前
vite与ts的结合
开发语言·前端·vue.js
亦良Cool37 分钟前
如何部署一个Java项目
java·开发语言
沐知全栈开发1 小时前
JavaScript 输出
开发语言
Q741_1471 小时前
C++ 位运算 高频面试考点 力扣 面试题 17.19. 消失的两个数字 题解 每日一题
c++·算法·leetcode·面试·位运算
初圣魔门首席弟子1 小时前
C++ STL string(字符串)学习笔记
c++·笔记·学习
自学AI的鲨鱼儿2 小时前
ubuntu22.04安装gvm管理go
开发语言·后端·golang
AA陈超2 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P04-12 可缩放浮点数的曲线表
c++·游戏·ue5·游戏引擎·虚幻
旭意2 小时前
C++微基础备战蓝桥杯之数组篇10.1
开发语言·c++·蓝桥杯