本篇是本次整合智能家居系统的重点,最终结果是将domoticz交叉编译并安装到mimi2440的嵌入式linux系统中,并让它运行起来,以供后续开发使用。
1、交叉编译zlib:
解压zlib-1.2.11.tar.gz后,进入目录,然后
cmake -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_INSTALL_PREFIX=/usr/local/arm/zlib/ CMakeLists.txt
make
make install
在主机/usr/local/arm/zlib/lib目录下可以看到:
把动态库拷贝到arm板根目录的/usr/lib中。
2、交叉编译curl:
解压curl-7.53.1.tar.gz,进入目录,然后:
./configure --prefix=/usr/local/arm/curl --host=arm-linux --target=arm-linux CC=arm-linux-gcc
make
make install
然后进入主机/usr/local/arm/curl/lib目录中可以看到:
把动态库拷贝到arm板根目录的/usr/lib中。
其实除了动态库之外,它还生成了一个两个可执行文件在/usr/local/arm/curl/bin目录中,但是我们用不到,就不拷贝了。
3、交叉编译boost:
解压boost_1_63_0.tar.gz,进入目录,然后:
sh bootstrap.sh
然后修改生成的project-config.jam文件
修改using gcc ;为:
using gcc : : arm-linux-gcc ; //(注意空格)
还有指定安装目录参数:
option.set prefix : /usr/local/arm/boost ;
option.set exec-prefix : /usr/local/arm/boost ;
option.set libdir : /usr/local/arm/boost/lib ;
option.set includedir : /usr/local/arm/boost/include ;
修改完之后依次执行下面两行命令:
./b2 stage threading=multi link=static --with-thread --with-date_time --with-system --with-atomic --with-regex
./b2 install threading=multi link=static --with-thread --with-date_time --with-system --with-atomic --with-regex
编译安装boost需要花很长时间,编译完成后,生成静态链接库文件。
生成的库有:
这几个是我们在domoticz中所使用的,所以只生成了这些。
对于domoticz所使用的boost库,编译参数选项的指定请参考:
Installing and running Domoticz on a Raspberry PI
中有关boost库编译相关内容。
到此,编译domoticz所需各种依赖库已经全部准备完毕,接下来就是任务的重点了。
4、交叉编译domoticz:
4.1、需要修改CMakeLists.txt:
1)指定OpenSSL搜索路径。
在project(domoticz)下一行添加:
set(OPENSSL_ROOT_DIR "/usr/local/arm/ssl")
set(OPENSSL_LIBRARIES "/usr/local/arm/ssl/lib/")
如图所示:
2)指定boost搜索路径。
在IF(USE_PYTHON AND PYTHONLIBS_FOUND)上面一行添加:
SET(Boost_ADDITIONAL_VERSION "1.63.0" "1.63.0")
SET(BOOST_ROOT /usr/local/arm/boost)
紧接着下面else()下面内容修改:
find_package(Boost 1.63.0 REQUIRED COMPONENTS thread date_time system atomic)
if(Boost_FOUND)
message(STATUS "boost lib found at: ${Boost_LIBRARY_DIRS} version:${Boost_VERSION}")
else()
message(FATAL_ERROR "boost lib not found !")
endif(Boost_FOUND)
如图所示:
Domoticz官网编译参数中,是在执行cmake的时候指定atomic参数:
-DCMAKE_EXE_LINKER_FLAGS=-lboost_atomic
参考:https://www.domoticz.cn/wiki/Linux#Add_support_for_Z-Wave
但是,其实原cmakelists.txt中并没有搜这个库,所以在链接可执行文件的时候会报错,说找不到该库。
所以,需要在CMakeLists.txt文件中添加这个库的搜索参数。
3)指定zlib搜索路径。
在option(USE_BUILTIN_ZLIB “Use builtin zlib library” NO)上面一行添加:
set(ZLIB_ROOT /usr/local/arm/zlib)
接着找到include_directories(${ZLIB_INCLUDE_DIRS}),在下面一行添加:
message(STATUS "ZLIB includes found at: ${ZLIB_INCLUDE_DIRS}")
如图所示:
4)指定curl搜索路径。
在FIND_PACKAGE(CURL)上面一行添加:
set(CURL_INCLUDE_DIR "/usr/local/arm/curl/include")
set(CURL_LIBRARY "/usr/local/arm/curl/lib/libcurl.so")
如图所示:
5)打印OpenSSL搜索结果(这一个不是必须的,只是用来打印搜索结果到屏幕)。
找到include_directories(${OPENSSL_INCLUDE_DIR}),在上面一行添加:
MESSAGE(STATUS "OpenSSL libraries found at: ${OPENSSL_LIBRARIES}")
MESSAGE(STATUS "OpenSSL includes found at: ${OPENSSL_INCLUDE_DIR}")
如图所示:
到此,修改CMakeLists.txt完毕。
4.2、编写一个shell脚本,然后运行脚本执行cmake构建命令,因为cmake会生成一些cache文件,如果cmake构建出问题,这些cache是需要删掉的,但是cmake本身没有相关命令,只能手动删除,如果不删除,那么修改CMakeLists.txt文件后,会不起作用。
脚本内容如下:
rm -fr build
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DUSE_BUILTIN_LUA=YES -DUSE_BUILTIN_SQLITE=YES -DUSE_STATIC_BOOST=ON -DCMAKE_C_COMPILER="arm-linux-gcc" -DCMAKE_CXX_COMPILER="arm-linux-g++" -DCMAKE_INSTALL_PREFIX="/work/rootfs/home/root/domoticz/" CMakeLists.txt ..
保存为build.sh,然后:
chmod +x build.sh
然后执行脚本:
./build.sh
或者
sh build.sh
执行完之后,生成了build目录。
4.3、进入build目录,然后
make
编译完,如图所示:
然后:
make install
安装完成后,如下图所示:
然后看到主机/work/rootfs/home/root/domoticz/中已经有了
domoticz主程序和web目录:
4.4、配置启动脚本:
把原编译目录domoticz-3.5877中的domoticz.sh拷贝到/work/rootfs/etc/init.d/目录下。
编辑这个脚本:
找到第17行:
USERNAME=pi
改为:
USERNAME=root
然后找到第33行:
. /lib/init/vars.sh
注释掉这一行:
#. /lib/init/vars.sh
然后找到第38行:
. /lib/lsb/init-functions
也注释掉:
#. /lib/lsb/init-functions
如图所示:
然后保存、退出。
其实可以在这个脚本中可以看到,默认的web访问端口是8080,这个是可以通过修改脚本中的参数来更改的。
现在使用默认的端口。
然后在mini2440串口调试端输入命令:
chmod +x /etc/init.d/domoticz.sh
/etc/init.d/domoticz.sh start
如图所示,已经启动:
domoticz.sh可以执行的命令参数有三种(start、stop、status):
domoticz.sh start
domoticz.sh stop
domoticz.sh status
我们只是使用启动的那个参数。
在实际使用时,需要让它在后台运行:
/etc/init.d/domoticz.sh start &
参考:https://www.domoticz.com/wiki/Install.txt
4.5、在PC端访问domoticz服务端主页:
我mini2440的ip地址为:192.168.1.230
在PC上打开浏览器,在地址栏输入:
http://192.168.1.230:8080
可以看到已经进入domoticz了:
至此,移植domoticz已经完成。
需要注意的是,我没有完全移植domoticz支持的功能,其中包括对OpenZWave、Python、libusb等。
不过,对于本人使用的环境已经够用了。
即便没有支持以上功能,Domoticz能提供的功能还有很多包括与wifi的对接、MQTT代理服务的对接等等,据说最强大的是它的事件处理功能,不过我还没仔细研究,后面慢慢深入吧。
下一篇将用domoticz做个实验,并在Android上安装一个domoticz的客户端程序,联合arm板上的mosquitto代理服务器来实现远程控制。