基於mini2440嵌入式linux上整合一套Domoticz智慧家居系統(四)交叉編譯OpenSSL、c-ares、e2fsprogs和mosquitto
本篇主旨是編譯安裝mosquitto,其他的庫是它的依賴庫。後面我們交叉編譯的程式都將放置在主機的”/usr/local/arm/”目錄中,以區別主機本地的應用程式。
我的mimi2440的根檔案系統是PC端VMWare上linux中的nfs,這樣比較容易除錯。具體位置是linux上的/work/roorfs,下文中所提到的“目標板根檔案系統目錄”或者“arm板根目錄”就是指這個目錄。
編譯安裝命令一如既往:
./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代理伺服器能否正常工作:
驗證思路是:
- 執行Mini2440這邊的mosquitto服務程式;
- 在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 &
後面的&就是讓程式在後臺執行,不過,列印資訊還是會列印到串列埠。
下一篇,將正式進入重點:domoticz,待續……