错误:
连接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
将被设置为真(ON
或 TRUE
)。
在 CMake 中,布尔值可以用以下几种方式表示:
ON
或 TRUE
:真值。
OFF
或 FALSE
:假值。
1
或 0
:数字值,其中 1
代表真,0
代表假。
这些值在 CMake 脚本中通常作为参数传递给命令或赋给变量,用以控制条件逻辑和选项设置。