18 #ifndef __IGN_TRANSPORT_DISCOVERY_HH_INCLUDED__ 19 #define __IGN_TRANSPORT_DISCOVERY_HH_INCLUDED__ 28 #include <netinet/in.h> 47 class DiscoveryPrivate;
64 public:
Discovery(
const std::string &_pUuid,
65 const bool _verbose =
false);
97 public:
bool DiscoverMsg(
const std::string &_topic);
109 public:
bool DiscoverSrv(
const std::string &_topic);
123 public:
bool MsgPublishers(
const std::string &_topic,
130 public:
bool SrvPublishers(
const std::string &_topic,
140 public:
bool UnadvertiseMsg(
const std::string &_topic,
141 const std::string &_nUuid);
150 public:
bool UnadvertiseSrv(
const std::string &_topic,
151 const std::string &_nUuid);
155 public: std::string HostAddr()
const;
161 public:
unsigned int ActivityInterval()
const;
168 public:
unsigned int HeartbeatInterval()
const;
174 public:
unsigned int AdvertiseInterval()
const;
180 public:
unsigned int SilenceInterval()
const;
185 public:
void SetActivityInterval(
const unsigned int _ms);
190 public:
void SetHeartbeatInterval(
const unsigned int _ms);
195 public:
void SetAdvertiseInterval(
const unsigned int _ms);
200 public:
void SetSilenceInterval(
const unsigned int _ms);
218 this->ConnectionsCb(std::bind(_cb, _obj, std::placeholders::_1));
225 public:
void DisconnectionsCb(
238 this->DisconnectionsCb(std::bind(_cb, _obj, std::placeholders::_1));
259 this->ConnectionsSrvCb(std::bind(_cb, _obj, std::placeholders::_1));
268 public:
void DisconnectionsSrvCb(
281 this->DisconnectionsSrvCb(std::bind(_cb, _obj, std::placeholders::_1));
285 public:
void PrintCurrentState()
const;
289 public:
void TopicList(std::vector<std::string> &_topics)
const;
293 public:
void ServiceList(std::vector<std::string> &_services)
const;
297 public: std::recursive_mutex& Mutex()
const;
301 public:
void WaitForInit()
const;
306 private:
void RunActivityTask();
309 private:
void RunHeartbeatTask();
312 private:
void RunReceptionTask();
315 private:
void RecvDiscoveryUpdate();
320 private:
void DispatchDiscoveryMsg(
const std::string &_fromIp,
329 private:
template<
typename T>
void SendMsg(uint8_t _type,
330 const T &_pub,
const uint16_t _flags = 0)
const 333 Header header(this->Version(), _pub.PUuid(), _type, _flags);
335 std::vector<char> buffer;
337 std::string topic = _pub.Topic();
351 advMsg.
Pack(reinterpret_cast<char*>(&buffer[0]));
352 msgLength =
static_cast<int>(advMsg.
MsgLength());
363 subMsg.
Pack(reinterpret_cast<char*>(&buffer[0]));
364 msgLength =
static_cast<int>(subMsg.
MsgLength());
371 buffer.resize(header.HeaderLength());
372 header.Pack(reinterpret_cast<char*>(&buffer[0]));
373 msgLength = header.HeaderLength();
377 std::cerr <<
"Discovery::SendMsg() error: Unrecognized message" 378 <<
" type [" << _type <<
"]" << std::endl;
384 for (
const auto &sock : this->Sockets())
386 std::lock_guard<std::recursive_mutex> lock(this->Mutex());
387 if (sendto(sock, reinterpret_cast<const raw_type *>(
388 reinterpret_cast<unsigned char*>(&buffer[0])),
389 msgLength, 0, reinterpret_cast<sockaddr *>(this->MulticastAddr()),
390 sizeof(*(this->MulticastAddr()))) != msgLength)
392 std::cerr <<
"Exception sending a message" << std::endl;
400 <<
" msg [" << topic <<
"]" << std::endl;
406 private: std::vector<int>& Sockets()
const;
410 private: sockaddr_in* MulticastAddr()
const;
414 private:
bool Verbose()
const;
418 private: uint8_t Version()
const;
424 private:
bool RegisterNetIface(
const std::string &_ip);
428 protected: std::unique_ptr<DiscoveryPrivate>
dataPtr;
static const uint8_t AdvSrvType
Definition: Packet.hh:40
std::map< std::string, std::vector< MessagePublisher > > MsgAddresses_M
Definition: TransportTypes.hh:51
#define IGNITION_VISIBLE
Use to represent "symbol visible" if supported.
Definition: Helpers.hh:56
static const std::vector< std::string > MsgTypesStr
Used for debugging the message type received/send.
Definition: Packet.hh:47
std::map< std::string, std::vector< ServicePublisher > > SrvAddresses_M
Definition: TransportTypes.hh:58
void DisconnectionsSrvCb(void(C::*_cb)(const ServicePublisher &_pub), C *_obj)
Register a callback to receive discovery disconnection events.
Definition: Discovery.hh:278
void DisconnectionsCb(void(C::*_cb)(const MessagePublisher &_pub), C *_obj)
Register a callback to receive discovery disconnection events.
Definition: Discovery.hh:234
Subscription packet used in the discovery protocol for requesting information about a given topic...
Definition: Packet.hh:163
void raw_type
Definition: Discovery.hh:30
A discovery class that implements a distributed topic discovery protocol.
Definition: Discovery.hh:58
size_t MsgLength() const
Get the total length of the message.
Definition: Packet.hh:284
static const uint8_t HeartbeatType
Definition: Packet.hh:38
size_t MsgLength() const
Get the total length of the message.
static const uint8_t ByeType
Definition: Packet.hh:39
static const uint8_t UnadvSrvType
Definition: Packet.hh:42
static const uint8_t SubType
Definition: Packet.hh:36
std::unique_ptr< DiscoveryPrivate > dataPtr
Definition: Discovery.hh:428
Advertise packet used in the discovery protocol to broadcast information about the node advertising a...
Definition: Packet.hh:235
std::function< void(const ServicePublisher &_publisher)> SrvDiscoveryCallback
Definition: TransportTypes.hh:110
std::function< void(const MessagePublisher &_publisher)> MsgDiscoveryCallback
Definition: TransportTypes.hh:102
ignition/transport/Publisher.hh
Definition: Publisher.hh:175
ignition/transport/Publisher.hh
Definition: Publisher.hh:264
void ConnectionsCb(void(C::*_cb)(const MessagePublisher &_pub), C *_obj)
Register a callback to receive discovery connection events.
Definition: Discovery.hh:214
static const uint8_t SubSrvType
Definition: Packet.hh:41
size_t Pack(char *_buffer) const
Serialize the advertise message.
Definition: Packet.hh:292
Definition: AdvertiseOptions.hh:25
static const uint8_t AdvType
Definition: Packet.hh:35
Store address information about topics and provide convenient methods for adding new topics...
Definition: TopicStorage.hh:37
void ConnectionsSrvCb(void(C::*_cb)(const ServicePublisher &_pub), C *_obj)
Register a callback to receive discovery connection events for services.
Definition: Discovery.hh:255
size_t Pack(char *_buffer) const
Serialize the subscription message.
static const uint8_t UnadvType
Definition: Packet.hh:37