本篇主旨是编译安装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代理服务器能否正常工作:
验证思路是:
安装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,待续……