MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
Mosquitto实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。
交叉编译之前,先创建一个目录存放压缩包和移植所需文件,如mkdir /home/lhq/Tools/embed
。再创建一个存放交叉编译后生成的文件的目录,如mkdir /home/lhq/mosquitto
。
在 /home/lhq/mosquitto目录下创建一个用于存放交叉编译生成的文件的目录ssl,mkdir /home/lhq/mosquitto/ssl
wget https://www.openssl.org/source/old/1.0.0/openssl-1.0.0.tar.gz
tar –xvf openssl-1.0.0.tar.gz
cd openssl-1.0.0/
./config no-asm shared --prefix=/home/lhq/mosquitto/ssl
export cross=arm-linux-gnueabihf-
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
–prefix即为刚才创建的安装目录。我这里使用的交叉编译工具链为arm-linux-gnueabihf-gcc。
make之后可能会报错:
原因是arm是32位的,打开vim Makefile
去掉-m64即可。
随后,
make install
在这里又报了一个错:
按照上面错误提示,删除sudo rm /usr/bin/pod2man
然后再次make install
可以在安装目录看到编译生成的几个文件:
wget https://sourceforge.net/projects/e2fsprogs/files/e2fsprogs/1.41.14/e2fsprogs-1.41.14.tar.gz
tar -xvf e2fsprogs-1.41.14.tar.gz
cd e2fsprogs-1.41.14/
./configure --host=arm-linux-gnueabihf --prefix=/home/lhq/mosquitto/e2fsprogs
make
make install
–prefix为安装目录。
可将e2fsprogs源码包中lib目录下的uuid文件夹拷入安装目录:
cp -rf /home/lhq/Tools/embed/e2fsprogs-1.46.5/lib/uuid /home/lhq/mosquitto/e2fsprogs
wget https://c-ares.haxx.se/download/c-ares-1.14.0.tar.gz
tar -xvf c-ares-1.14.0.tar.gz
cd c-ares-1.14.0/
./configure --host=arm-linux-gnueabihf --prefix=/home/lhq/mosquitto/ares
make
make install
–prefix为安装目录。
在安装目录可以看到编译生成的文件:
wget https://sourceforge.net/projects/libuuid/
tar -xvf libuuid-1.0.3.tar.gz
cd libuuid-1.0.3/
./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc --prefix=/home/lhq/mosquitto/libuuid
make
make install
wget https://mosquitto.org/files/source/mosquitto-1.4.8.tar.gz
tar -xvf mosquitto-1.4.8.tar.gz
cd mosquitto-1.4.8/
vim CMakeList.txt
在if(${WITH_TLS} $TREOUAL ON)后面加入:
set(OPENSSL_ROOT_DIR "/home/lhq/mosquitto/ssl")
set(OPENSSL_LIBRARIES "/home/lhq/mosquitto/ssl/lib64/")
在option(WITH_SRV “Include SRV lookup support?” ON)后面加入:
# Simple detect uuid
set(CMAKE_INCLUDE_PATH /home/lhq/mosquitto/e2fsprogs)
set(CMAKE_LIBRARY_PATH /home/lhq/mosquitto/e2fsprogs/uuid)
find_path(UUID_HEADER NAMES uuid/uuid.h)
if (UUID_HEADER)
include_directories(${UUID_HEADER})
message(STATUS "found uuid/uuid.h at:${UUID_HEADER}")
find_library(UUID_LIBRARY NAMES uuid)
if (UUID_LIBRARY)
message(STATUS "found libuuid at:${UUID_LIBRARY}")
set (LIBRARIES ${LIBRARIES} ${UUID_LIBRARY})
else(UUID_LIBRARY)
message(FATAL_ERROR "uuid library not found!" )
endif (UUID_LIBRARY)
else (UUID_HEADER)
message(WARNING "uuid library not found.")
endif (UUID_HEADER)
然后到mosquitto源码lib目录下,vim CMakeLists.txt
,将第55-63行改为如下:
# Simple detect c-ares
find_path(ARES_HEADER ares.h /home/lhq/mosquitto/ares/include)
if (ARES_HEADER)
add_definitions("-DWITH_SRV")
include_directories(${ARES_HEADER})
message(STATUS "found ares.h at:${ARES_HEADER}")
find_library(ARES_LIBRARY cares /home/lhq/mosquitto/ares/lib)
if (ARES_LIBRARY)
message(STATUS "found libcares at:${ARES_LIBRARY}")
set (LIBRARIES ${LIBRARIES} ${ARES_LIBRARY})
else(ARES_LIBRARY)
message(FATAL_ERROR "not found libcares" )
endif (ARES_LIBRARY)
else (ARES_HEADER)
message(WARNING "c-ares library not found.")
endif (ARES_HEADER)
endif (${WITH_SRV} STREQUAL ON)
返回mosquitto源码根目录,在终端执行:
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt
这里需修改为刚才交叉编译出来的路径:vim CMakeCache.txt
,改为如下内容:
再次执行
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt
接下来再:
make
make install
这里没必要sudo make
和sudo make install
,加上sudo而修改环境变量就得不偿失了。
进入mosquitto安装目录查看,
在开发板/usr
目录下分别创建ssl、uuid、mqtt、ares、e2fsprogs文件夹,将交叉编译得到的文件分别拷入新建的目录下,可通过nfs挂载。
拷贝成功后再配置开发板环境变量,vim /etc/profile
#mqtt start
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/ssl/lib64
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/uuid/lib
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/mqtt/lib
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/ares/lib
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/e2fsprogs/lib
export PATH=$PATH:/usr/ssl/bin
export PATH=$PATH:/usr/mqtt/bin
export PATH=$PATH:/usr/mqtt/sbin
export PATH=$PATH:/usr/e2fsprogs/bin
export PATH=$PATH:/usr/e2fsprogs/sbin
#mqtt end
之后,再source /etc/profile使环境变量生效。
再进入/usr/mqtt/bin
,给mosquitto_pub、mosquitto_sub、mosquitto_passwd;/usr/mqtt/sbin
,给mosquitto赋可执行权限。
mosquitto_sub -t test
,再打开一个终端,mosquitto_pub -t test -m "hello world"
。可以看到,订阅和发布都能成功。
mosquitto -c /usr/mqtt/etc/mosquitto/mosquitto.conf
再执行订阅和发布即可。
如果执行mosquitto -c /usr/mqtt/etc/mosquitto/mosquitto.conf
时出现如下错误:
1672122706:Error:Invalid user ‘mosquitto’
可将上面的mosquitto.conf文件的#user mosquitto下加上user root
。
或者adduser mosquitto
新增一个普通用户,再执行。