【ROS】ROS里使用IXWebSocket并配置支持wss时遇到的坑

错误:

连接wss://…并运行程序时提示

Connection error: TLS support is not enabled on this platform
解决方法:

需要在ROS中配置IXWebSocket库使之支持wss。需要链接OpenSSL的库。

坑:

网上的方法大多是cmake -DUSE_TLS什么的,但是这个选项是基于github demo给的CMakeLists.txt里有这样一些选项:

if (USE_TLS)
    target_compile_definitions(ixwebsocket PUBLIC IXWEBSOCKET_USE_TLS)
    if (USE_MBED_TLS)
        target_compile_definitions(ixwebsocket PUBLIC IXWEBSOCKET_USE_MBED_TLS)
    elseif (USE_OPEN_SSL)
        target_compile_definitions(ixwebsocket PUBLIC IXWEBSOCKET_USE_OPEN_SSL)
    elseif (USE_SECURE_TRANSPORT)
        target_compile_definitions(ixwebsocket PUBLIC IXWEBSOCKET_USE_SECURE_TRANSPORT)
    else()
        message(FATAL_ERROR "TLS Configuration error: unknown backend")
    endif()
endif()

因此,单纯在ROS的CMakeLists.txt里加入-DUSE_TLS等是无效的。

有效的方法:(加在CMakeLists.txt里)

find_package(OpenSSL REQUIRED) # openssl
include_directories(${OPENSSL_INCLUDE_DIR}) # openssl

# 这两行是用来把整个ixwebsocket文件夹(包括.h和.cpp文件)加入ROS项目
file(GLOB CPP_FILES "include/ixwebsocket/*.cpp")
add_executable(${PROJECT_NAME} src/main.cpp src/cJSON.c src/utils.cpp src/ws_comm.cpp ${CPP_FILES})

target_link_libraries(${PROJECT_NAME}
  ${catkin_LIBRARIES}
  ${OPENSSL_LIBRARIES} # 链接openssl库
)

target_compile_definitions(${PROJECT_NAME} PUBLIC IXWEBSOCKET_USE_TLS) # 重要
target_compile_definitions(${PROJECT_NAME} PUBLIC IXWEBSOCKET_USE_OPEN_SSL) # 重要

亲测可行。

附:target_compile_definitions这一行的含义

这行命令的作用是为 ${PROJECT_NAME} 目标添加一个名为IXWEBSOCKET_USE_TLS的宏定义,并且这个定义对于这个目标本身以及所有依赖于它的其他目标都是可见的(PUBLIC)。这通常用于在编译时启用特定的功能或代码路径,比如启用 ixwebsocket 的 TLS 支持。

附:其他笔记

当你在 CMakeLists.txt 文件中看到:

set (CXX_STANDARD_REQUIRED ON)
这里 ON 是传递给 set命令的参数,用于设置 CXX_STANDARD_REQUIRED 变量为真,表示编译器必须支持指定的 C++ 标准。

同样地,

option (BUILD_DEMO OFF)
这里的 OFF 是传递给 option 命令的默认值,表示 BUILD_DEMO 选项默认是关闭的(假值)。如果用户在命令行中使用 -DBUILD_DEMO=ON 调用 CMake,那么 BUILD_DEMO 将被设置为真(ONTRUE)。

在 CMake 中,布尔值可以用以下几种方式表示:

ONTRUE:真值。
OFFFALSE:假值。
10:数字值,其中 1 代表真,0 代表假。
这些值在 CMake 脚本中通常作为参数传递给命令或赋给变量,用以控制条件逻辑和选项设置。

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
给您提供一份修改后的代码: ```cpp #include "ros/ros.h" #include <websocketpp/config/asio_client.hpp> #include <websocketpp/client.hpp> #include <websocketpp/common/thread.hpp> #include <iostream> typedef websocketpp::client<websocketpp::config::asio_tls_client> client; class WebSocketClient { public: WebSocketClient() { // 设置websocket的回调函数 m_client.set_message_handler(std::bind(&WebSocketClient::on_message, this, std::placeholders::_1, std::placeholders::_2)); } void start() { // 连接到websocket服务器 websocketpp::lib::error_code ec; client::connection_ptr con = m_client.get_connection("wss://autopilot-test.t3go.cn:443/api/v1/vehicle/push/message/LFB1FV696M2L43840", ec); if (ec) { std::cout << "连接失败: " << ec.message() << std::endl; return; } // 运行websocket的事件循环 m_client.init_asio(); m_client.start_perpetual(); m_client.connect(con); websocketpp::lib::thread asio_thread(&client::run, &m_client); asio_thread.join(); } void perceptionCallback(const std_msgs::String::ConstPtr& msg) { // 发送消息到websocket服务器 std::string serialized_data = msg->data; m_client.send(serialized_data, websocketpp::frame::opcode::text); } private: void on_message(websocketpp::connection_hdl hdl, client::message_ptr msg) { // 处理websocket服务器返回的消息 std::cout << "收到消息: " << msg->get_payload() << std::endl; } client m_client; }; int main(int argc, char** argv) { ros::init(argc, argv, "websocket_client"); ros::NodeHandle nh; WebSocketClient ws_client; // 订阅感知话题 ros::Subscriber sub = nh.subscribe("perception_topic", 1000, &WebSocketClient::perceptionCallback, &ws_client); // 运行ROS事件循环 ros::spin(); return 0; } ``` 这份代码使用websocketpp库来创建websocket客户端,并在ROS中订阅了一个感知话题。当收到该话题的消息,就会将消息序列化后发送到websocket服务器。同,也会监听websocket服务器返回的消息并进行处理。请注意,这份代码需要安装websocketpp库才能编译通过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值