MQTT协议版本Mosquitto移植到嵌入式arm平台

文章目录

  • 前言
  • 一、mosquitto是什么?
  • 二、交叉编译
    • 1.交叉编译openssl源码
    • 2.交叉编译e2fsprogs源码
    • 3.交叉编译c-ares源码
    • 4.交叉编译uuid源码
    • 5.交叉编译mosquitto源码
    • 6.将编译得到的文件拷贝到开发板执行
      • 6.1测试
      • 6.2错误解决


前言

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。


一、mosquitto是什么?

Mosquitto实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。

二、交叉编译

交叉编译之前,先创建一个目录存放压缩包和移植所需文件,如mkdir /home/lhq/Tools/embed。再创建一个存放交叉编译后生成的文件的目录,如mkdir /home/lhq/mosquitto

1.交叉编译openssl源码

在 /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之后可能会报错:
MQTT协议版本Mosquitto移植到嵌入式arm平台_第1张图片
原因是arm是32位的,打开vim Makefile去掉-m64即可。
随后,

make install

在这里又报了一个错:
MQTT协议版本Mosquitto移植到嵌入式arm平台_第2张图片
按照上面错误提示,删除sudo rm /usr/bin/pod2man 然后再次make install
可以在安装目录看到编译生成的几个文件:
在这里插入图片描述

2.交叉编译e2fsprogs源码

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

在这里插入图片描述

3.交叉编译c-ares源码

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为安装目录。
在安装目录可以看到编译生成的文件:
在这里插入图片描述

4.交叉编译uuid源码

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

可以看到在安装目录下编译生成的文件:
在这里插入图片描述

5.交叉编译mosquitto源码

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/")

MQTT协议版本Mosquitto移植到嵌入式arm平台_第3张图片
路径为openssl的安装目录。

在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)

MQTT协议版本Mosquitto移植到嵌入式arm平台_第4张图片
路径为e2fsprogs和uuid的安装目录。

然后到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)

MQTT协议版本Mosquitto移植到嵌入式arm平台_第5张图片

返回mosquitto源码根目录,在终端执行:

cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt

识别到了Ubuntu x86系统的openssl路径。
MQTT协议版本Mosquitto移植到嵌入式arm平台_第6张图片

这里需修改为刚才交叉编译出来的路径:vim CMakeCache.txt,改为如下内容:
MQTT协议版本Mosquitto移植到嵌入式arm平台_第7张图片
再次执行

cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX=/home/mosquitto/arm/mosquitto/ CMakeLists.txt

MQTT协议版本Mosquitto移植到嵌入式arm平台_第8张图片
已经识别到刚才交叉编译出来的openssl路径。

接下来再:

make
make install

MQTT协议版本Mosquitto移植到嵌入式arm平台_第9张图片
这里没必要sudo makesudo make install,加上sudo而修改环境变量就得不偿失了。
进入mosquitto安装目录查看,
在这里插入图片描述

6.将编译得到的文件拷贝到开发板执行

在开发板/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赋可执行权限。

6.1测试

mosquitto_sub -t test ,再打开一个终端,mosquitto_pub -t test -m "hello world"。可以看到,订阅和发布都能成功。
在这里插入图片描述

6.2错误解决

如果网络已经连通,出现如下错误,可这样考虑解决:
在这里插入图片描述
执行:

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
MQTT协议版本Mosquitto移植到嵌入式arm平台_第10张图片
或者adduser mosquitto新增一个普通用户,再执行。


你可能感兴趣的:(c语言,arm开发,ubuntu,linux)