diff --git a/CMakeLists.txt b/CMakeLists.txt index 7800c71..f602bb6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,22 @@ rclcpp_components_register_node(zenoh_bridge_component EXECUTABLE zenoh_bridge ) +add_library(zenoh_router_component SHARED src/ZenohRouter.cpp) +target_include_directories(zenoh_router_component PUBLIC + $ + $) +target_link_libraries(zenoh_router_component + rclcpp::rclcpp + rclcpp_components::component + zenohcxx::zenohc + fmt::fmt +) + +rclcpp_components_register_node(zenoh_router_component + PLUGIN "j7s::ZenohRouter" + EXECUTABLE zenoh_router +) + add_executable(get_default_config src/bin/get_default_config.cpp ) @@ -39,7 +55,7 @@ target_link_libraries(get_default_config ) ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET) -install(TARGETS zenoh_bridge_component get_default_config +install(TARGETS zenoh_bridge_component zenoh_router_component get_default_config EXPORT export_${PROJECT_NAME} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib diff --git a/include/j7s_zenoh_bridge/ZenohRouter.hpp b/include/j7s_zenoh_bridge/ZenohRouter.hpp new file mode 100644 index 0000000..06b4851 --- /dev/null +++ b/include/j7s_zenoh_bridge/ZenohRouter.hpp @@ -0,0 +1,27 @@ +// +// Copyright 2026 James Pace +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. +// +// This Source Code Form is "Incompatible With Secondary Licenses", as +// defined by the Mozilla Public License, v. 2.0. +// +#pragma once +#include + +#include "zenoh.hxx" + +namespace j7s +{ +class ZenohRouter : public rclcpp::Node +{ +public: + ZenohRouter(const rclcpp::NodeOptions & options); + +private: + std::shared_ptr m_zenohSession; +}; + +} // namespace j7s diff --git a/launch/test.launch.xml b/launch/test.launch.xml index 241d31f..5627a7b 100644 --- a/launch/test.launch.xml +++ b/launch/test.launch.xml @@ -1,10 +1,13 @@ - + - + + + + diff --git a/params/DEFAULT_CONFIG.json5 b/params/client_config.json5 similarity index 98% rename from params/DEFAULT_CONFIG.json5 rename to params/client_config.json5 index 1d4cf31..c95c6eb 100644 --- a/params/DEFAULT_CONFIG.json5 +++ b/params/client_config.json5 @@ -20,7 +20,7 @@ /// /// See https://docs.rs/zenoh/latest/zenoh/config/struct.EndPoint.html endpoints: [ - // "/
" + "tcp/localhost:7447" ], }, diff --git a/params/router_config.json5 b/params/router_config.json5 new file mode 100644 index 0000000..564a59d --- /dev/null +++ b/params/router_config.json5 @@ -0,0 +1,41 @@ +{ + /// The node's mode (router, peer or client) + mode: "router", + + /// The node's metadata (name, location, DNS name, etc.) Arbitrary JSON data not interpreted by zenoh and available in admin space @//router, @//peer or @//client + metadata: { + }, + + /// Which endpoints to connect to. E.g. tcp/localhost:7447. + /// By configuring the endpoints, it is possible to tell zenoh which router/peer to connect to at startup. + connect: { + /// timeout waiting for all endpoints connected (0: no retry, -1: infinite timeout) + /// Accepts a single value (e.g. timeout_ms: 0) + /// or different values for router, peer and client (e.g. timeout_ms: { router: -1, peer: -1, client: 0 }). + timeout_ms: { router: -1, peer: -1, client: 0 }, + + /// The list of endpoints to connect to. + /// Accepts a single list (e.g. endpoints: ["tcp/10.10.10.10:7447", "tcp/11.11.11.11:7447"]) + /// or different lists for router, peer and client (e.g. endpoints: { router: ["tcp/10.10.10.10:7447"], peer: ["tcp/11.11.11.11:7447"] }). + /// + /// See https://docs.rs/zenoh/latest/zenoh/config/struct.EndPoint.html + endpoints: [ + // "/
" + ], + + }, + + /// Which endpoints to listen on. E.g. tcp/0.0.0.0:7447. + /// By configuring the endpoints, it is possible to tell zenoh which are the endpoints that other routers, + /// peers, or client can use to establish a zenoh session. + listen: { + + /// The list of endpoints to listen on. + /// Accepts a single list (e.g. endpoints: ["tcp/[::]:7447", "udp/[::]:7447"]) + /// or different lists for router, peer and client (e.g. endpoints: { router: ["tcp/[::]:7447"], peer: ["tcp/[::]:0"] }). + /// + /// See https://docs.rs/zenoh/latest/zenoh/config/struct.EndPoint.html + endpoints: ["tcp/0.0.0.0:7447"], + + }, +} diff --git a/src/ZenohRouter.cpp b/src/ZenohRouter.cpp new file mode 100644 index 0000000..23d6a86 --- /dev/null +++ b/src/ZenohRouter.cpp @@ -0,0 +1,29 @@ +// +// Copyright 2026 James Pace +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. +// +// This Source Code Form is "Incompatible With Secondary Licenses", as +// defined by the Mozilla Public License, v. 2.0. +// +#include + +#include +#include + +namespace j7s +{ + +ZenohRouter::ZenohRouter(const rclcpp::NodeOptions & options) : Node("zenoh_bridge", options) +{ + const auto zenohConfigPath = this->declare_parameter("zenoh_config_path"); + auto config = zenoh::Config::from_file(zenohConfigPath); + m_zenohSession = std::make_shared(std::move(config)); +} + +}; // namespace j7s + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(j7s::ZenohRouter)