diff --git a/CMakeLists.txt b/CMakeLists.txt index e233d79..f0ca49a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,5 @@ src/robotic_arm_serial_port.cpp src/methane_serial_port.cpp src/utils.cpp - src/utils.hpp ) target_link_libraries(message_handler unitree_sdk2) \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index e233d79..f0ca49a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,5 @@ src/robotic_arm_serial_port.cpp src/methane_serial_port.cpp src/utils.cpp - src/utils.hpp ) target_link_libraries(message_handler unitree_sdk2) \ No newline at end of file diff --git a/src/methane_serial_port.cpp b/src/methane_serial_port.cpp index 8a15d63..1961f89 100644 --- a/src/methane_serial_port.cpp +++ b/src/methane_serial_port.cpp @@ -72,7 +72,7 @@ if (Utils::is_network_reachable(ConstantConfig::SERVICE_ADDRESS, ConstantConfig::HTTP_PORT)) { upload_to_server_async(result); } else { - std::cout << "网络异常,上传失败" << std::endl; + std::cout << "网络异常,上传甲烷数据到" << ConstantConfig::SERVICE_ADDRESS << "失败" << std::endl; } } @@ -90,9 +90,10 @@ } void MethaneSerialPort::start_timer() { - timer_.expires_from_now(boost::posix_time::seconds(3)); + timer_.expires_from_now(boost::posix_time::seconds(1)); timer_.async_wait([this](const boost::system::error_code &error) { if (!error) { + buffer_.consume(buffer_.size()); // 每次启动都清空缓冲区 read_from_port(); } }); @@ -108,25 +109,13 @@ // 检查数据包的头和尾 if (response[0] == 0xCC && response[7] == 0x77) { - // 数据包完整且正确 - std::cout << "received 8 bytes: "; - for (size_t i = 0; i < 8; ++i) { - std::cout << std::hex - << std::uppercase - << std::setw(2) - << std::setfill('0') - << static_cast(response[i]) - << " "; - } - std::cout << std::endl; - handle_response(response); // 清空 buffer_,确保不缓存数据 buffer_.consume(8); } else { // 数据包不完整或不正确,丢弃该数据包 - buffer_.consume(1); // 丢弃第一个字节并重新开始 + buffer_.consume(buffer_.size()); } // 重新启动定时器 diff --git a/CMakeLists.txt b/CMakeLists.txt index e233d79..f0ca49a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,5 @@ src/robotic_arm_serial_port.cpp src/methane_serial_port.cpp src/utils.cpp - src/utils.hpp ) target_link_libraries(message_handler unitree_sdk2) \ No newline at end of file diff --git a/src/methane_serial_port.cpp b/src/methane_serial_port.cpp index 8a15d63..1961f89 100644 --- a/src/methane_serial_port.cpp +++ b/src/methane_serial_port.cpp @@ -72,7 +72,7 @@ if (Utils::is_network_reachable(ConstantConfig::SERVICE_ADDRESS, ConstantConfig::HTTP_PORT)) { upload_to_server_async(result); } else { - std::cout << "网络异常,上传失败" << std::endl; + std::cout << "网络异常,上传甲烷数据到" << ConstantConfig::SERVICE_ADDRESS << "失败" << std::endl; } } @@ -90,9 +90,10 @@ } void MethaneSerialPort::start_timer() { - timer_.expires_from_now(boost::posix_time::seconds(3)); + timer_.expires_from_now(boost::posix_time::seconds(1)); timer_.async_wait([this](const boost::system::error_code &error) { if (!error) { + buffer_.consume(buffer_.size()); // 每次启动都清空缓冲区 read_from_port(); } }); @@ -108,25 +109,13 @@ // 检查数据包的头和尾 if (response[0] == 0xCC && response[7] == 0x77) { - // 数据包完整且正确 - std::cout << "received 8 bytes: "; - for (size_t i = 0; i < 8; ++i) { - std::cout << std::hex - << std::uppercase - << std::setw(2) - << std::setfill('0') - << static_cast(response[i]) - << " "; - } - std::cout << std::endl; - handle_response(response); // 清空 buffer_,确保不缓存数据 buffer_.consume(8); } else { // 数据包不完整或不正确,丢弃该数据包 - buffer_.consume(1); // 丢弃第一个字节并重新开始 + buffer_.consume(buffer_.size()); } // 重新启动定时器 diff --git a/src/slam_wrapper.cpp b/src/slam_wrapper.cpp index 7e01df9..cecbe58 100644 --- a/src/slam_wrapper.cpp +++ b/src/slam_wrapper.cpp @@ -341,7 +341,7 @@ if (Utils::is_network_reachable(ConstantConfig::SERVICE_ADDRESS, ConstantConfig::HTTP_PORT)) { upload_pcd_file(); } else { - std::cout << "网络异常,上传失败" << std::endl; + std::cout << "网络异常,上传PCD文件到" << ConstantConfig::SERVICE_ADDRESS << "失败" << std::endl; } } diff --git a/CMakeLists.txt b/CMakeLists.txt index e233d79..f0ca49a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,5 @@ src/robotic_arm_serial_port.cpp src/methane_serial_port.cpp src/utils.cpp - src/utils.hpp ) target_link_libraries(message_handler unitree_sdk2) \ No newline at end of file diff --git a/src/methane_serial_port.cpp b/src/methane_serial_port.cpp index 8a15d63..1961f89 100644 --- a/src/methane_serial_port.cpp +++ b/src/methane_serial_port.cpp @@ -72,7 +72,7 @@ if (Utils::is_network_reachable(ConstantConfig::SERVICE_ADDRESS, ConstantConfig::HTTP_PORT)) { upload_to_server_async(result); } else { - std::cout << "网络异常,上传失败" << std::endl; + std::cout << "网络异常,上传甲烷数据到" << ConstantConfig::SERVICE_ADDRESS << "失败" << std::endl; } } @@ -90,9 +90,10 @@ } void MethaneSerialPort::start_timer() { - timer_.expires_from_now(boost::posix_time::seconds(3)); + timer_.expires_from_now(boost::posix_time::seconds(1)); timer_.async_wait([this](const boost::system::error_code &error) { if (!error) { + buffer_.consume(buffer_.size()); // 每次启动都清空缓冲区 read_from_port(); } }); @@ -108,25 +109,13 @@ // 检查数据包的头和尾 if (response[0] == 0xCC && response[7] == 0x77) { - // 数据包完整且正确 - std::cout << "received 8 bytes: "; - for (size_t i = 0; i < 8; ++i) { - std::cout << std::hex - << std::uppercase - << std::setw(2) - << std::setfill('0') - << static_cast(response[i]) - << " "; - } - std::cout << std::endl; - handle_response(response); // 清空 buffer_,确保不缓存数据 buffer_.consume(8); } else { // 数据包不完整或不正确,丢弃该数据包 - buffer_.consume(1); // 丢弃第一个字节并重新开始 + buffer_.consume(buffer_.size()); } // 重新启动定时器 diff --git a/src/slam_wrapper.cpp b/src/slam_wrapper.cpp index 7e01df9..cecbe58 100644 --- a/src/slam_wrapper.cpp +++ b/src/slam_wrapper.cpp @@ -341,7 +341,7 @@ if (Utils::is_network_reachable(ConstantConfig::SERVICE_ADDRESS, ConstantConfig::HTTP_PORT)) { upload_pcd_file(); } else { - std::cout << "网络异常,上传失败" << std::endl; + std::cout << "网络异常,上传PCD文件到" << ConstantConfig::SERVICE_ADDRESS << "失败" << std::endl; } } diff --git a/src/utils.cpp b/src/utils.cpp index b795f3c..dc29814 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -4,6 +4,11 @@ #include "utils.hpp" +Utils::Utils() { +} + +Utils::~Utils() = default; + bool Utils::is_network_reachable(const std::string &host, const std::string &service) { try { boost::asio::io_context io; @@ -11,9 +16,27 @@ boost::asio::ip::tcp::socket socket(io); const auto endpoints = resolver.resolve(host, service); - boost::asio::connect(socket, endpoints); - return true; + // 设置连接超时为1000ms + boost::asio::deadline_timer timer(io, boost::posix_time::millisec(1000)); + boost::system::error_code ec; + + // 异步连接并在超时后取消 + socket.async_connect(endpoints->endpoint(), [&](const boost::system::error_code &connect_ec) { + if (!connect_ec) { + timer.cancel(); + } + }); + + timer.async_wait([&](const boost::system::error_code &) { + if (socket.is_open()) { + socket.close(); + } + }); + + io.run(ec); + + return !ec && socket.is_open(); } catch (std::exception &e) { std::cerr << "Network error: " << e.what() << std::endl; return false; diff --git a/CMakeLists.txt b/CMakeLists.txt index e233d79..f0ca49a 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,5 @@ src/robotic_arm_serial_port.cpp src/methane_serial_port.cpp src/utils.cpp - src/utils.hpp ) target_link_libraries(message_handler unitree_sdk2) \ No newline at end of file diff --git a/src/methane_serial_port.cpp b/src/methane_serial_port.cpp index 8a15d63..1961f89 100644 --- a/src/methane_serial_port.cpp +++ b/src/methane_serial_port.cpp @@ -72,7 +72,7 @@ if (Utils::is_network_reachable(ConstantConfig::SERVICE_ADDRESS, ConstantConfig::HTTP_PORT)) { upload_to_server_async(result); } else { - std::cout << "网络异常,上传失败" << std::endl; + std::cout << "网络异常,上传甲烷数据到" << ConstantConfig::SERVICE_ADDRESS << "失败" << std::endl; } } @@ -90,9 +90,10 @@ } void MethaneSerialPort::start_timer() { - timer_.expires_from_now(boost::posix_time::seconds(3)); + timer_.expires_from_now(boost::posix_time::seconds(1)); timer_.async_wait([this](const boost::system::error_code &error) { if (!error) { + buffer_.consume(buffer_.size()); // 每次启动都清空缓冲区 read_from_port(); } }); @@ -108,25 +109,13 @@ // 检查数据包的头和尾 if (response[0] == 0xCC && response[7] == 0x77) { - // 数据包完整且正确 - std::cout << "received 8 bytes: "; - for (size_t i = 0; i < 8; ++i) { - std::cout << std::hex - << std::uppercase - << std::setw(2) - << std::setfill('0') - << static_cast(response[i]) - << " "; - } - std::cout << std::endl; - handle_response(response); // 清空 buffer_,确保不缓存数据 buffer_.consume(8); } else { // 数据包不完整或不正确,丢弃该数据包 - buffer_.consume(1); // 丢弃第一个字节并重新开始 + buffer_.consume(buffer_.size()); } // 重新启动定时器 diff --git a/src/slam_wrapper.cpp b/src/slam_wrapper.cpp index 7e01df9..cecbe58 100644 --- a/src/slam_wrapper.cpp +++ b/src/slam_wrapper.cpp @@ -341,7 +341,7 @@ if (Utils::is_network_reachable(ConstantConfig::SERVICE_ADDRESS, ConstantConfig::HTTP_PORT)) { upload_pcd_file(); } else { - std::cout << "网络异常,上传失败" << std::endl; + std::cout << "网络异常,上传PCD文件到" << ConstantConfig::SERVICE_ADDRESS << "失败" << std::endl; } } diff --git a/src/utils.cpp b/src/utils.cpp index b795f3c..dc29814 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -4,6 +4,11 @@ #include "utils.hpp" +Utils::Utils() { +} + +Utils::~Utils() = default; + bool Utils::is_network_reachable(const std::string &host, const std::string &service) { try { boost::asio::io_context io; @@ -11,9 +16,27 @@ boost::asio::ip::tcp::socket socket(io); const auto endpoints = resolver.resolve(host, service); - boost::asio::connect(socket, endpoints); - return true; + // 设置连接超时为1000ms + boost::asio::deadline_timer timer(io, boost::posix_time::millisec(1000)); + boost::system::error_code ec; + + // 异步连接并在超时后取消 + socket.async_connect(endpoints->endpoint(), [&](const boost::system::error_code &connect_ec) { + if (!connect_ec) { + timer.cancel(); + } + }); + + timer.async_wait([&](const boost::system::error_code &) { + if (socket.is_open()) { + socket.close(); + } + }); + + io.run(ec); + + return !ec && socket.is_open(); } catch (std::exception &e) { std::cerr << "Network error: " << e.what() << std::endl; return false; diff --git a/src/utils.hpp b/src/utils.hpp index bb20489..58f00bc 100644 --- a/src/utils.hpp +++ b/src/utils.hpp @@ -10,6 +10,10 @@ class Utils { public: + Utils(); + + ~Utils(); + static bool is_network_reachable(const std::string &host, const std::string &service); };