Server.h
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2024 Jose Luis Blanco Claraco |
5  | Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6  | Distributed under 3-clause BSD License |
7  | See COPYING |
8  +-------------------------------------------------------------------------+ */
9 
10 #pragma once
11 
12 #include <mrpt/core/Clock.h>
13 #include <mrpt/system/COutputLogger.h>
14 #include <mvsim/Comms/ports.h>
15 #include <mvsim/Comms/zmq_fwrds.h>
16 
17 #include <atomic>
18 #include <set>
19 #include <shared_mutex> // read/write mutex
20 #include <thread>
21 
22 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
23 
24 #include <mvsim/mvsim-msgs/AdvertiseServiceRequest.pb.h>
25 #include <mvsim/mvsim-msgs/AdvertiseTopicRequest.pb.h>
26 #include <mvsim/mvsim-msgs/GetServiceInfoRequest.pb.h>
27 #include <mvsim/mvsim-msgs/ListNodesRequest.pb.h>
28 #include <mvsim/mvsim-msgs/ListTopicsRequest.pb.h>
29 #include <mvsim/mvsim-msgs/RegisterNodeRequest.pb.h>
30 #include <mvsim/mvsim-msgs/SubscribeRequest.pb.h>
31 #include <mvsim/mvsim-msgs/UnregisterNodeRequest.pb.h>
32 
33 #endif
34 
35 namespace mvsim
36 {
40 class World;
41 
60 class Server : public mrpt::system::COutputLogger
61 {
62  public:
63  Server();
64  ~Server();
65 
69  void start();
70 
73  void shutdown() noexcept;
76  unsigned int listenningPort() const { return serverPortNo_; }
77  void listenningPort(unsigned int port) { serverPortNo_ = port; }
78 
79  private:
80  std::thread mainThread_;
81  std::atomic<zmq::context_t*> mainThreadZMQcontext_ = nullptr;
83 
84  void internalServerThread();
85 
86  // ========= Message handlers ========
87 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
88  void handle(const mvsim_msgs::RegisterNodeRequest& m, zmq::socket_t& s);
89  void handle(const mvsim_msgs::UnregisterNodeRequest& m, zmq::socket_t& s);
90  void handle(const mvsim_msgs::SubscribeRequest& m, zmq::socket_t& s);
91  void handle(const mvsim_msgs::ListTopicsRequest& m, zmq::socket_t& s);
92  void handle(const mvsim_msgs::ListNodesRequest& m, zmq::socket_t& s);
93  void handle(const mvsim_msgs::AdvertiseTopicRequest& m, zmq::socket_t& s);
94  void handle(const mvsim_msgs::AdvertiseServiceRequest& m, zmq::socket_t& s);
95  void handle(const mvsim_msgs::GetServiceInfoRequest& m, zmq::socket_t& s);
96 #endif
97 
103  mutable std::shared_mutex dbMutex;
104 
106  void db_remove_node(const std::string& nodeName);
107 
109  void db_register_node(const std::string& nodeName);
110 
112  void db_advertise_topic(
113  const std::string& topicName, const std::string& topicTypeName,
114  const std::string& publisherEndpoint, const std::string& nodeName);
115 
118  const std::string& serviceName, const std::string& inputTypeName,
119  const std::string& outputTypeName, const std::string& publisherEndpoint,
120  const std::string& nodeName);
121 
123  bool db_get_service_info(
124  const std::string& serviceName, std::string& publisherEndpoint,
125  std::string& nodeName) const;
126 
127  void db_add_topic_subscriber(const std::string& topicName, const std::string& updatesEndPoint);
128 
132  const std::string& topicName,
133  const std::optional<std::string>& updatesEndPoint = std::nullopt);
134 
135  struct InfoPerNode
136  {
137  InfoPerNode(const std::string& name) : nodeName(name) {}
138 
139  const std::string nodeName;
140 
142  const mrpt::Clock::time_point timeConnected = mrpt::Clock::now();
143 
144  std::set<std::string> advertisedTopics;
145  std::set<std::string> subscribedTopics;
146  };
147  using node_name_t = std::string;
148  std::map<node_name_t, InfoPerNode> connectedNodes_;
149 
150  using endpoint_t = std::string;
151 
153  {
155  const std::string& topic_name, const std::string& publisher_node_name,
156  const std::string& publisher_endpoint)
157  : topicName(topic_name),
158  publisherNodeName(publisher_node_name),
159  publisherEndpoint(publisher_endpoint)
160  {
161  }
162  const std::string topicName;
163  const std::string publisherNodeName;
165  };
166 
168  {
169  InfoPerSubscriber(const std::string& topic_name, const std::string& sub_updates_endpoint)
170  : topicName(topic_name), subscriberUpdatesEndpoint(sub_updates_endpoint)
171  {
172  }
173  const std::string topicName;
175  };
176 
178  {
179  InfoPerTopic() = default;
180  InfoPerTopic(const std::string& name, const std::string& topic_type_name)
181  : topicName(name), topicTypeName(topic_type_name)
182  {
183  }
184  std::string topicName, topicTypeName;
185 
186  std::map<node_name_t, InfoPerPublisher> publishers;
187  std::map<endpoint_t, InfoPerSubscriber> subscribers;
188  };
189  using topic_name_t = std::string;
190  std::map<topic_name_t, InfoPerTopic> knownTopics_;
191 
193  {
194  InfoPerService() = default;
196  const std::string& name, const std::string& in_type_name,
197  const std::string& out_type_name, const std::string& end_point,
198  const std::string& node_name)
199  : serviceName(name),
200  inputTypeName(in_type_name),
201  outputTypeName(out_type_name),
202  endpoint(end_point),
203  nodeName(node_name)
204  {
205  }
207  std::string endpoint, nodeName;
208  };
209  using service_name_t = std::string;
210  std::map<service_name_t, InfoPerService> knownServices_;
211 
215 };
218 } // namespace mvsim
mvsim
Definition: Client.h:21
mvsim::Server::InfoPerNode::timeConnected
const mrpt::Clock::time_point timeConnected
Definition: Server.h:142
mvsim::Server::knownTopics_
std::map< topic_name_t, InfoPerTopic > knownTopics_
Definition: Server.h:190
mvsim::Server::InfoPerService::serviceName
std::string serviceName
Definition: Server.h:206
mvsim::Server::requestMainThreadTermination
void requestMainThreadTermination()
Definition: Server.cpp:149
mvsim::Server::topic_name_t
std::string topic_name_t
Definition: Server.h:189
mvsim::Server::InfoPerNode
Definition: Server.h:135
mvsim::Server::InfoPerSubscriber::subscriberUpdatesEndpoint
const endpoint_t subscriberUpdatesEndpoint
Definition: Server.h:174
mvsim::Server::mainThread_
std::thread mainThread_
Definition: Server.h:80
zmq_fwrds.h
mvsim::Server::InfoPerService::InfoPerService
InfoPerService()=default
mvsim::Server::db_remove_node
void db_remove_node(const std::string &nodeName)
Definition: Server.cpp:165
mvsim::Server::InfoPerTopic::subscribers
std::map< endpoint_t, InfoPerSubscriber > subscribers
Definition: Server.h:187
mvsim::Server::service_name_t
std::string service_name_t
Definition: Server.h:209
mvsim::Server::InfoPerService::endpoint
std::string endpoint
Definition: Server.h:207
mvsim::Server::InfoPerTopic
Definition: Server.h:177
mvsim::Server::Server
Server()
Definition: Server.cpp:37
mvsim::Server::InfoPerPublisher::publisherEndpoint
const endpoint_t publisherEndpoint
Definition: Server.h:164
mvsim::Server::node_name_t
std::string node_name_t
Definition: Server.h:147
mvsim::Server::InfoPerSubscriber::InfoPerSubscriber
InfoPerSubscriber(const std::string &topic_name, const std::string &sub_updates_endpoint)
Definition: Server.h:169
mvsim::Server::InfoPerNode::InfoPerNode
InfoPerNode(const std::string &name)
Definition: Server.h:137
mvsim::Server::send_topic_publishers_to_subscribed_clients
void send_topic_publishers_to_subscribed_clients(const std::string &topicName, const std::optional< std::string > &updatesEndPoint=std::nullopt)
Definition: Server.cpp:230
mvsim::Server::~Server
~Server()
Definition: Server.cpp:39
mvsim::Server::db_get_service_info
bool db_get_service_info(const std::string &serviceName, std::string &publisherEndpoint, std::string &nodeName) const
Definition: Server.cpp:323
mvsim::Server::InfoPerSubscriber
Definition: Server.h:167
mvsim::Server::serverPortNo_
unsigned int serverPortNo_
Definition: Server.h:214
mvsim::Server::InfoPerService
Definition: Server.h:192
mvsim::Server::dbMutex
std::shared_mutex dbMutex
Definition: Server.h:103
mvsim::Server::InfoPerService::InfoPerService
InfoPerService(const std::string &name, const std::string &in_type_name, const std::string &out_type_name, const std::string &end_point, const std::string &node_name)
Definition: Server.h:195
mvsim::Server::InfoPerPublisher
Definition: Server.h:152
mvsim::Server::db_advertise_service
void db_advertise_service(const std::string &serviceName, const std::string &inputTypeName, const std::string &outputTypeName, const std::string &publisherEndpoint, const std::string &nodeName)
Definition: Server.cpp:295
mvsim::Server::listenningPort
void listenningPort(unsigned int port)
Definition: Server.h:77
mvsim::Server::InfoPerTopic::InfoPerTopic
InfoPerTopic(const std::string &name, const std::string &topic_type_name)
Definition: Server.h:180
mvsim::Server::InfoPerPublisher::topicName
const std::string topicName
Definition: Server.h:162
mvsim::Server
Definition: Server.h:60
mvsim::Server::InfoPerService::inputTypeName
std::string inputTypeName
Definition: Server.h:206
mvsim::Server::start
void start()
Definition: Server.cpp:41
mvsim::Server::db_advertise_topic
void db_advertise_topic(const std::string &topicName, const std::string &topicTypeName, const std::string &publisherEndpoint, const std::string &nodeName)
Definition: Server.cpp:191
mvsim::Server::connectedNodes_
std::map< node_name_t, InfoPerNode > connectedNodes_
Definition: Server.h:148
mvsim::Server::db_register_node
void db_register_node(const std::string &nodeName)
Definition: Server.cpp:184
mvsim::Server::InfoPerTopic::topicTypeName
std::string topicTypeName
Definition: Server.h:184
mvsim::Server::internalServerThread
void internalServerThread()
Definition: Server.cpp:75
mvsim::MVSIM_PORTNO_MAIN_REP
constexpr unsigned int MVSIM_PORTNO_MAIN_REP
Definition: ports.h:17
mvsim::Server::InfoPerSubscriber::topicName
const std::string topicName
Definition: Server.h:173
mvsim::Server::listenningPort
unsigned int listenningPort() const
Definition: Server.h:76
mvsim::Server::endpoint_t
std::string endpoint_t
Definition: Server.h:150
mvsim::Server::InfoPerService::nodeName
std::string nodeName
Definition: Server.h:207
mvsim::Server::InfoPerTopic::publishers
std::map< node_name_t, InfoPerPublisher > publishers
Definition: Server.h:186
mvsim::Server::knownServices_
std::map< service_name_t, InfoPerService > knownServices_
Definition: Server.h:210
mvsim::Server::InfoPerTopic::topicName
std::string topicName
Definition: Server.h:184
ports.h
mvsim::Server::InfoPerPublisher::publisherNodeName
const std::string publisherNodeName
Definition: Server.h:163
mvsim::Server::mainThreadZMQcontext_
std::atomic< zmq::context_t * > mainThreadZMQcontext_
Definition: Server.h:81
mvsim::Server::shutdown
void shutdown() noexcept
Definition: Server.cpp:58
mvsim::Server::InfoPerNode::nodeName
const std::string nodeName
Definition: Server.h:139
mvsim::Server::InfoPerTopic::InfoPerTopic
InfoPerTopic()=default
mvsim::Server::InfoPerService::outputTypeName
std::string outputTypeName
Definition: Server.h:206
mvsim::Server::db_add_topic_subscriber
void db_add_topic_subscriber(const std::string &topicName, const std::string &updatesEndPoint)
Definition: Server.cpp:217
mvsim::Server::InfoPerNode::subscribedTopics
std::set< std::string > subscribedTopics
Definition: Server.h:145
mvsim::Server::InfoPerNode::advertisedTopics
std::set< std::string > advertisedTopics
Definition: Server.h:144
mvsim::Server::InfoPerPublisher::InfoPerPublisher
InfoPerPublisher(const std::string &topic_name, const std::string &publisher_node_name, const std::string &publisher_endpoint)
Definition: Server.h:154


mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:08