src/Comms/common.cpp
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2023 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 #include <mrpt/core/exceptions.h>
11 
12 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
13 #include <google/protobuf/message.h>
14 #include <mvsim/Comms/common.h>
15 
16 #include <zmq.hpp>
17 
18 using namespace mvsim;
19 
20 void mvsim::sendMessage(
21  const google::protobuf::MessageLite& m, zmq::socket_t& socket)
22 {
23  mrpt::io::CMemoryStream buf;
24  auto arch = mrpt::serialization::archiveFrom(buf);
25 
26  arch << m.GetTypeName();
27  arch << m.SerializeAsString();
28 
29  zmq::message_t msg(buf.getRawBufferData(), buf.getTotalBytesCount());
30 #if CPPZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 1)
31  socket.send(msg, zmq::send_flags::none);
32 #else
33  socket.send(msg);
34 #endif
35 }
36 
37 std::tuple<std::string, std::string> mvsim::internal::parseMessageToParts(
38  const zmq::message_t& msg)
39 {
40  mrpt::io::CMemoryStream buf;
41  buf.assignMemoryNotOwn(msg.data(), msg.size());
42 
43  auto arch = mrpt::serialization::archiveFrom(buf);
44 
45  std::string typeName, serializedData;
46  arch >> typeName >> serializedData;
47  return {typeName, serializedData};
48 }
49 
50 void mvsim::parseMessage(
51  const zmq::message_t& msg, google::protobuf::MessageLite& out)
52 {
53  const auto [typeName, serializedData] = internal::parseMessageToParts(msg);
54 
55  ASSERT_EQUAL_(typeName, out.GetTypeName());
56 
57  bool ok = out.ParseFromString(serializedData);
58  if (!ok)
59  THROW_EXCEPTION_FMT(
60  "Format error: protobuf could not decode binary message of "
61  "type "
62  "'%s'",
63  typeName.c_str());
64 }
65 
66 zmq::message_t mvsim::receiveMessage(zmq::socket_t& s)
67 {
68  zmq::message_t m;
69 #if CPPZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 1)
70  std::optional<size_t> msgSize = s.recv(m);
71  ASSERT_(msgSize.has_value());
72 #else
73  s.recv(&m);
74 #endif
75  return m;
76 }
77 
78 std::string mvsim::get_zmq_endpoint(const zmq::socket_t& s)
79 {
80 #if CPPZMQ_VERSION > ZMQ_MAKE_VERSION(4, 7, 0)
81  return s.get(zmq::sockopt::last_endpoint);
82 #else
83  char assignedPort[200];
84  size_t assignedPortLen = sizeof(assignedPort);
85  s.getsockopt(ZMQ_LAST_ENDPOINT, &assignedPort, &assignedPortLen);
86  assignedPort[assignedPortLen] = '\0';
87  return {assignedPort};
88 #endif
89 }
90 
91 #endif
ROSCPP_DECL bool ok()


mvsim
Author(s):
autogenerated on Tue Jul 4 2023 03:08:19