网络延时信息转mqtt消息


如上图
要求: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安装及测试

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值