1. 程式人生 > >基於mini2440嵌入式linux上整合一套Domoticz智慧家居系統(四)交叉編譯OpenSSL、c-ares、e2fsprogs和mosquitto

基於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代理伺服器能否正常工作:
驗證思路是:

  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 &
後面的&就是讓程式在後臺執行,不過,列印資訊還是會列印到串列埠。

下一篇,將正式進入重點:domoticz,待續……