编译编译真是浪费生命!
mosquitto真是坑,官方对于编译开启websockets支持只有短短一句话:
libwebsockets (libwebsockets-dev) - enable with make WITH_WEBSOCKETS=yes
但其实你先要安装libwebsockets,简单一点使用:
brew install libwebsockets
不过你要安装最新版本的libwebsockets就要手动自己安装了。
然后打开mosquitto的config.mk
文件,修改:
WITH_WEBSOCKETS:=yes
如果想安装mosquitto到自定义目录则在CMakeLists.txt
文件中添加:
set (CMAKE_INSTALL_PREFIX "你的自定义目录路径")
开始编译:
cmake .
make
make install
编辑/usr/local/etc/mosquitto/mosquitto.conf
,添加:
listener 1883
protocol mqtt
listener 1884
protocol websockets
嗯,官方连这个配置都没说。
这儿开启了两个端口,一个用于mqtt socket协议,一个用于mqtt websockets协议。
执行:
cd /usr/local/sbin/
./mosquitto -c ../etc/mosquitto/mosquitto.conf
然后会出现错误:
Error: Websockets support not available.
WTF,分明根据官方说的配置开启了WITH_WEBSOCKETS:=yes
,为什么还说不支持Websockets?
因为不会cmake想偷懒一下,在github上面官方的Issue找到有人也问同样问题也没人能正确回答,stackoverflow上也没有答案,没办法只能自己动手解决。
打开CMakeCache.txt
,找到一行:
WITH_WEBSOCKETS:BOOL=OFF
妈的,为什么这里是OFF? 于是手动改成ON,并且在CMakeLists.txt
文件中添加:
find_package(libwebsockets REQUIRED)
然后重新运行编译安装,这回开启mosquitto后显示成功开启了websockets:
1542814792: mosquitto version 1.5.4 starting
1542814792: Config loaded from ../etc/mosquitto/mosquitto.conf.
1542814792: Opening ipv6 listen socket on port 1883.
1542814792: Opening ipv4 listen socket on port 1883.
1542814792: Opening websockets listen socket on port 1884.
更简单的解决办法:
原来在src目录下还有个CMakeLists.txt
文件,其中有一行:
option(WITH_WEBSOCKETS "Include websockets support?" OFF)
把这个OFF改成ON,就可以了。
一个很小的问题把人折磨半天浪费时间,官方也不好好写在README里面。
我没用过cmake还得一边网上查cmake用法,真是折腾。
而且我还遇到了找不到openssl头文件和库的问题:
解决办法还是在CMakeLists.txt
文件中添加:
set (OPENSSL_ROOT_DIR "/usr/local/opt/openssl")
set (OPENSSL_INCLUDE_DIR "/usr/local/opt/openssl/include")
set (OPENSSL_LIBRARIES "/usr/local/opt/openssl/lib/libssl.dylib;/usr/local/opt/openssl/lib/libcrypto.dylib")
顺便再学一条cmake打印变量的命令:
message("${OPENSSL_INCLUDE_DIR}")
message("${OPENSSL_LIBRARIES}")
另外修改了CMakeLists.txt最好删除CMakeCache.txt,然后重新cmake编译。
网友评论