如上图
要求:C++ ROS节点中,获取ping值(如上图的31ms),并以int32格式,发送到mqtt的topic中
mqtt:topic:Delay
Ip地址: 39.106.21.114
C++ ROS节点中,获取ping值(如上图的31ms),并以int32格式,发送到mqtt的topic中
1、在catkin_ws/src下创建自己的ros包(这里命名为ping):
catkin_create_pkg ping roscpp std_msgs sensor_msgs
2、进入到ping/src/目录下,放入自己的cpp函数(这里命名为ping.cpp)
ping.cpp代码如下:
#include <string>
#include <regex>
#include <iostream>
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <mqtt_client/MqttClient.h>
int main(int argc, char **argv)
{
ros::init(argc, argv, "Ping_time");
ros::NodeHandle nh;
ros::Publisher publisher = nh.advertise<std_msgs::String>("ping_delay", 10);
ros::Rate rate(10);
mqtt::async_client client("mqtt://broker.emqx.io:1883", "mqttx_16d592d6");
mqtt::connect_options connOpts;
connOpts.set_keep_alive_interval(20);
connOpts.set_clean_session(true);
try {
mqtt::message willMsg("mqtt_ping_delay", "Connection lost");
connOpts.set_will(willMsg);
client.connect(connOpts)->wait();
while (ros::ok()) {
std::string pingCmd = "ping -c 1 180.101.50.242";
FILE* pipe = popen(pingCmd.c_str(), "r");
const int bufferSize = 128;
char buffer[bufferSize];
while (fgets(buffer, bufferSize, pipe) != nullptr) {
std::string line(buffer);
std::regex timeRegex("时间=([0-9.]+)");
std::smatch match;
if (std::regex_search(line, match, timeRegex)) {
if (match.size() > 1) {
std_msgs::String timeStr;
timeStr.data = match[1].str();
publisher.publish(timeStr);
mqtt::message_ptr pubmsg = mqtt::make_message("mqtt_ping_delay", timeStr.data);
client.publish(pubmsg);
}
}
}
pclose(pipe);
rate.sleep();
}
client.disconnect()->wait();
} catch (const mqtt::exception& exc) {
std::cerr << "Error: " << exc.what() << std::endl;
}
return 0;
}
3、然后修改ping/下的Cmakelist:
cmake_minimum_required(VERSION 3.0.2)
project(ping)
set(CMAKE_CXX_STANDARD 17)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
mqtt_client
)
catkin_package(
INCLUDE_DIRS include
LIBRARIES ping
CATKIN_DEPENDS roscpp rospy std_msgs
DEPENDS system_lib
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
## Add executable
add_executable(ping src/ping.cpp)
## Specify libraries to link a library or executable target against
target_link_libraries(ping ${catkin_LIBRARIES} paho-mqtt3as pthread)
4、然后在工作区~/catkin_ws/目录下,bash执行:
catkin_make
<查看ros中话题结果>
5、当ping包构建完成后,然后在终端中输入:
<查看mqtt话题结果>
6、当ping包构建完成后,然后在终端中输入:
另外说明:
参考资料:1、Linux下MQTT安装及测试