基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(四)交叉编译OpenSSL、c-ares、e2fsprogs和mosquitto

ARM 141浏览


本篇主旨是编译安装mosquitto,其他的库是它的依赖库。后面我们交叉编译的程序都将放置在主机的”/usr/local/arm/”目录中,以区别主机本地的应用程序。
我的mimi2440的根文件系统是PC端VMWare上linux中的nfs,这样比较容易调试。具体位置是linux上的/work/roorfs,下文中所提到的“目标板根文件系统目录”或者“arm板根目录”就是指这个目录。

一点准备工作,在编译c-ares之前需要在主机上编译安装两个工具软件:
1)、autoconf,用来生成configure文件
https://alpha.gnu.org/gnu/autoconf/autoconf-2.68b.tar.gz
2)、libtool
https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz

编译安装命令一如既往:

./configure
make
make install

下面正式交叉编译过程:

1、交叉编译OpenSSL
解压之后,进入OpenSSL的目录:

cd openssl-1.0.0/
./config no-asm shared --prefix=/usr/local/arm/ssl
export cross=arm-linux-
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
make install

生成动态库如下:
这里写图片描述

把这几个动态库拷贝到目标板跟文件系统目录/usr/local/lib 中。

2、交叉编译c-ares库,因为我下载的是zip文件所以需要unzip命令解压。

unzip c-ares-cares-1_12_0.zip
cd c-ares-cares-1_12_0
./buildconf
./configure --host=arm-linux --prefix=/usr/local/arm/ares
make
make install

生成如下动态库:

这里写图片描述
把这几个动态库拷贝到目标板跟文件系统目录/usr/local/lib 中。

3、交叉编译e2fsprogs:
解压e2fsprogs-1.41.14.tar.gz后进入目录。

cd e2fsprogs-1.41.14/
./configure --host=arm-linux --prefix=/usr/local/arm/e2fsprogs
make
make install

然后把e2fsprogs-1.41.14/lib下的uuid目录拷贝到主机的/usr/local/arm/e2fsprogs目录下:

cp -r lib/uuid/ /usr/local/arm/e2fsprogs

其实uuid才是我们真正需要使用的。

4、交叉编译Mosquitto:
解压mosquitto-1.4.9.tar.gz,进入目录,然后:

找到CMakelists.txt第61行find_package(OpenSSL REQUIRED),
在此句之前加入:

set(OPENSSL_ROOT_DIR "/usr/local/arm/ssl")
set(OPENSSL_LIBRARIES "/usr/local/arm/ssl/lib/")

然后找到option(WITH_SRV “Include SRV lookup support?” ON)这一行,在下面加入:

# Simple detect uuid
set(CMAKE_INCLUDE_PATH /usr/local/arm/e2fsprogs)
set(CMAKE_LIBRARY_PATH /usr/local/arm/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)

如图所示:
这里写图片描述
然后找到lib/CMakelists.txt的第54行

这一段改后如下:

if (${WITH_SRV} STREQUAL ON)
    # Simple detect c-ares
    find_path(ARES_HEADER ares.h /usr/local/arm/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 /usr/local/arm/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=/usr/local/arm/mosquitto/ CMakeLists.txt

这里写图片描述

然后:

make

编译完成后如图所示:

这里写图片描述

然后

make install

安装完成后如图所示:
这里写图片描述

这样,交叉编译的mosquitto就被安装到了主机/usr/local/arm/mosquitto目录下:
这里写图片描述

其中bin目录下有三个:
mosquitto_passwd
mosquitto_pub
mosquitto_sub
这里写图片描述

把这三个拷贝到arm板根目录下的/usr/bin目录中。
其实这三个不是我们用以做MQTT代理服务器的程序,这只是客户端的应用程序。

接下来,进入主机的/usr/local/arm/mosquitto/sbin目录:
这里写图片描述

只有一个mosquitto可执行程序,这个就是MQTT代理服务程序,是我们真正需要的。
拷贝到arm板根目录下的/usr/sbin目录中。

还有就是动态库,在主机的/usr/local/arm/mosquitto/lib中:
这里写图片描述

把这六个拷贝到arm板根目录下的/usr/lib目录中。

还剩下一项:配置文件。
这个在主机的/usr/local/arm/mosquitto/etc目录中:
这里写图片描述

把里面的整个mosquitto文件夹拷贝到arm板根目录下的/etc目录中。
找到里面的#user mosquitto这一行:
这里写图片描述

在它下面添加
user root
因为我arm板上的用户名是root,如果不改,运行的时候会报错误。

mosquitto在mini2440开发板上的移植就完成了。

接下来就是验证一下mosquitto代理服务器能否正常工作:
验证思路是:

  1. 运行Mini2440这边的mosquitto服务程序;
  2. 在PC(我这边是win7系统)安装windows版的mosquitto,然后运行两个窗口:
    一个窗口负责订阅和接收消息,另一个窗口负责发布消息。

安装PC端的mosquitto就不多说了,比较简单,不过稍微提醒一下:
需要安装windows版的OpenSSL和mosquitto。
我安装的版本:
Win32OpenSSL-1_1_0e.exe
mosquitto-1.3.5-install-win32.exe
版本是随便找的。
PC这边安装完之后,打开两个cmd窗口,都进入到mosquitto的安装目录下:
这里写图片描述

我的arm开发板ip地址为192.168.1.230

给mini2440开发板上电,然后执行命令:
mosquitto -c /etc/mosquitto/mosquitto.conf
可以看到:
这里写图片描述

mosquitto已经启动成功了。

然后在PC上的一个cmd窗口执行命令:
mosquitto_sub -v -t gpio -h 192.168.1.230
这个是订阅arm板上的gpio主题。
这里写图片描述
我pc这边的ip地址为192.168.1.101
可以看到已经连接上了。

然后在PC上的第二个cmd窗口执行命令:
mosquitto_pub -t gpio -h 192.168.1.230 -m “{”pin”:17,”value”:0}”
这个是向arm板服务端发送一个主题为gpio的消息,消息内容是:”{”pin”:17,”value”:0}”

可以看到:
这里写图片描述

第一个cmd窗口已经接收到arm服务器端转发过来的MQTT消息了。

到此,已经验证了arm开发板的mosquitto代理服务器程序运行一切正常。

至于说arm板上的那两个客户端程序mosquitto_pub和mosquitto_sub是否能正常工作,对我们的目标来说是不重要的,其实是不需要的。正常情况下应该是可以运行的,需要用到的朋友可以自行验证。

接下来,需要提到的一点是:
资料上给的运行mosquitto的命令如下:
mosquitto -c /etc/mosquitto/mosquitto.conf -d
这个-d其实是让程序在后台运行,并且没有任何打印信息打印到串口。

而我们后面的开发中,可能需要关注mosquitto程序这边的运行情况,所以在开发阶段,不使用-d,而使用另外一种后台运行命令:
mosquitto -c /etc/mosquitto/mosquitto.conf &
后面的&就是让程序在后台运行,不过,打印信息还是会打印到串口。

附修改后的mosquitto-1.4.9源代码:
http://download.csdn.net/detail/sqshining/9863987

下一篇,将正式进入重点:domoticz,待续……