@@ -486,15 +486,14 @@ void MqttClient::mqtt2ros(mqtt::const_message_ptr mqtt_msg) {
486486 // if stamped, compute latency
487487 if (stamped) {
488488
489- // copy timestamp from MQTT message to buffer
490- ros::Time stamp;
491- uint32_t stamp_length = ros::serialization::serializationLength (stamp);
492- std::vector<uint8_t > stamp_buffer;
493- stamp_buffer.resize (stamp_length);
494- std::memcpy (stamp_buffer.data (), &(payload[1 ]), stamp_length);
489+ // create ROS message buffer on top of MQTT message payload
490+ char * non_const_payload = const_cast <char *>(&payload[1 ]);
491+ uint8_t * stamp_buffer = reinterpret_cast <uint8_t *>(non_const_payload);
495492
496493 // deserialize stamp
497- ros::serialization::IStream stamp_stream (stamp_buffer.data (), stamp_length);
494+ ros::Time stamp;
495+ uint32_t stamp_length = ros::serialization::serializationLength (stamp);
496+ ros::serialization::IStream stamp_stream (stamp_buffer, stamp_length);
498497 ros::serialization::deserialize (stamp_stream, stamp);
499498
500499 // compute ROS2MQTT latency
@@ -521,17 +520,16 @@ void MqttClient::mqtt2ros(mqtt::const_message_ptr mqtt_msg) {
521520 msg_offset += stamp_length;
522521 }
523522
524- // copy ROS message from MQTT message to buffer
525- std::vector< uint8_t > msg_buffer ;
526- msg_buffer. resize (msg_length );
527- std::memcpy (msg_buffer. data (), &(payload[msg_offset]) , msg_length);
523+ // create ROS message buffer on top of MQTT message payload
524+ char * non_const_payload = const_cast < char *>(&payload[msg_offset]) ;
525+ uint8_t * msg_buffer = reinterpret_cast < uint8_t *>(non_const_payload );
526+ ros::serialization::OStream msg_stream (msg_buffer , msg_length);
528527
529528 // publish via ShapeShifter
530529 NODELET_DEBUG (
531530 " Sending ROS message of type '%s' from MQTT broker to ROS topic '%s' ..." ,
532531 mqtt2ros.ros .shape_shifter .getDataType ().c_str (),
533532 mqtt2ros.ros .topic .c_str ());
534- ros::serialization::OStream msg_stream (msg_buffer.data (), msg_length);
535533 mqtt2ros.ros .shape_shifter .read (msg_stream);
536534 mqtt2ros.ros .publisher .publish (mqtt2ros.ros .shape_shifter );
537535}
@@ -590,14 +588,13 @@ void MqttClient::message_arrived(mqtt::const_message_ptr mqtt_msg) {
590588 mqtt_topic.find (kRosMsgTypeMqttTopicPrefix ) != std::string::npos;
591589 if (msg_contains_ros_msg_type) {
592590
593- // copy ROS message type from MQTT message to buffer
594- RosMsgType ros_msg_type;
595- std::vector<uint8_t > msg_type_buffer;
596- msg_type_buffer.resize (payload_length);
597- std::memcpy (msg_type_buffer.data (), &(payload[0 ]), payload_length);
591+ // create ROS message buffer on top of MQTT message payload
592+ char * non_const_payload = const_cast <char *>(&payload[0 ]);
593+ uint8_t * msg_type_buffer = reinterpret_cast <uint8_t *>(non_const_payload);
598594
599595 // deserialize ROS message type
600- ros::serialization::IStream msg_type_stream (msg_type_buffer.data (),
596+ RosMsgType ros_msg_type;
597+ ros::serialization::IStream msg_type_stream (msg_type_buffer,
601598 payload_length);
602599 ros::serialization::deserialize (msg_type_stream, ros_msg_type);
603600
0 commit comments