天天看點

【AllJoyn架構-08】AllJoyn在OpenWrt上的實踐

1、下載下傳openwrt源碼編譯

貌似版本很多,也不是所有版本都适合我的闆子,是以這點得弄清楚。我下得是barrier_break,支援mt7620a開發闆。按照上面的教程,把該準備的給準備着,具體總結如下:

1.1 目前有三種,v12.09,attitude adjustment,barrier_breaker,貌似中間第二種不支援mt7620

1.2 将下面某一行添加進對應版本的feeds.conf

src-git alljoyn https://git.allseenalliance.org/gerrit/core/openwrt_feed;openwrt_12.09

src-git alljoyn https://git.allseenalliance.org/gerrit/core/openwrt_feed;barrier_breaker

1.3 更新和安裝

./scripts/feeds update -a

./scripts/feeds install -a -p alljoyn

1.4 make menuconfig時按照下圖選擇

【AllJoyn架構-08】AllJoyn在OpenWrt上的實踐

當然如果選擇子產品,則生成ipk檔案,如果內建到核心中,則直接刷固件就有了

我們可以在build_dir/target-mipsel-24kec**/下找到alljoyn的相關目錄,裡面的build目錄下有生成好的庫和二進制檔案

2、編寫alljoyn程式

編譯方法和helloworld類似了,我前篇博文有講述,這裡就不說了,我主要列出src檔案夾的makefile

3、交叉編譯

在sdk頂層下編譯程式,成功後在build_dir/target**/ajtest/下有執行程式,scp到闆子上運作。這裡截取一下交叉編譯器的編譯和連結過程,注意觀察用到了哪些目錄下的頭檔案目錄和庫目錄

【編譯】

mipsel-openwrt-linux-uclibc-g++ -os -pipe -mno-branch-likely -mips32r2 -mtune=24kec -mdsp -fno-caller-saves -fhonour-copts -wno-error=unused-but-set-variable

-msoft-float  -i/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/target-mipsel_24kec+dsp_uclibc-0.9.33.2/usr/include

-i/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/target-mipsel_24kec+dsp_uclibc-0.9.33.2/include-i/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uclibc-0.9.33.2/usr/include

-i/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uclibc-0.9.33.2/include  -c

hello.cpp

【連結】

mipsel-openwrt-linux-uclibc-g++ -l/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/target-mipsel_24kec+dsp_uclibc-0.9.33.2/usr/lib

-l/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/target-mipsel_24kec+dsp_uclibc-0.9.33.2/lib -l/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uclibc-0.9.33.2/usr/lib

-l/home/cshi/download/openwrt/barrier_breaker/bin/ramips/openwrt-sdk-ramips-for-linux-i686-gcc-4.8-linaro_uclibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uclibc-0.9.33.2/lib  hello.o

-o hello

4、保證闆中已經有了liballjoyn,pthread,librt,ssl等庫,且正确設定了動态庫路徑,執行即可

用ldd檢查可發現加載了哪些動态庫

【AllJoyn架構-08】AllJoyn在OpenWrt上的實踐

【插曲一】

從官方路徑中下載下傳的libstdcpp貌似不管用,害得整半天,在執行alljoyn程式時,出現如下錯誤:

【AllJoyn架構-08】AllJoyn在OpenWrt上的實踐

經查詢發現它在c++檔案hashtable_c++0x.o中

【AllJoyn架構-08】AllJoyn在OpenWrt上的實踐

再對比barrier_breaker上的cpp庫(libstdc++.so.6.0.19)和闆子上的cpp庫(libstdc++.so.6.0.16),發現後者小很多且nm不到任何符号,不如直接替換,讓軟連結libstdc++.so.6指向19版本,看看能不能找到這個符号,果然可以了。

【插曲二】

符号找到了,卻識别不了我pc上的用戶端了。大膽猜測一下,是不是闆子上的防火牆阻擋了?一試,果然是!

【AllJoyn架構-08】AllJoyn在OpenWrt上的實踐

正如上圖所示,由于我将闆子連入了另外一個接入外網的路由器,産生了wan區域,将其入口設定為接受即可,這樣,闆子上的alljoyn服務端就可識别pc上的用戶端了(當然要在同一個區域網路内啦)

參考連結

繼續閱讀