1. 程式人生 > 實用技巧 >CWMP開原始碼研究2——easycwmp安裝和學習

CWMP開原始碼研究2——easycwmp安裝和學習

摘自:https://www.cnblogs.com/myblesh/p/6225665.html

宣告:本文是對開源程式程式碼學習和研究,嚴禁用於商業目的。 如有任何問題,歡迎和我交流。(企鵝號:408797506)

本文所有筆記和程式碼可以到csdn下載:http://download.csdn.net/detail/eryunyong/9590036

一. linux上安裝

為了更好理解easycwmp執行機制和以及部署在各類linux核心的作業系統環境,我們選擇官網的第二種安裝方法。

(1) linux系統:Ubuntu 12.04

(2) 安裝EasyCwmp所需要的依賴:(若安裝過程提示找不到安裝包,請到官網更新Ubuntu源:http://wiki.ubuntu.org.cn/%E6%BA%90%E5%88%97%E8%A1%A8)

libcurl :

libuci

json-c:可能會遇到版本問題,後附解決放案.

libubox

libubus

libmicroxml:下載地址 http://easycwmp.org/download/libmicroxml.tar.gz

1. general安裝

參考官網,在/opt/目錄下建立git和dev兩個目錄。並賦予使用者操作許可權
為了省去sudo麻煩,後面所有操作可以直接使用root使用者進行安裝

2. curl安裝

安裝說明:
這裡暫時不安裝curl工具,因為我們需要用curl進行程式設計,所以重點會介紹如何在c程式裡使用curl提供的API介面。
如果喜歡curl命令列工具,可以使用命令安裝: sudo apt-get install curl
後續如果有必要,再安裝該工具

1. sudo apt-get install libcurl4-openssl-dev (官網 Note: If you build libcurl with an SSL package dependency, then it is recommended to build with OpenSSL since EasyCwmp was mainly tested with libcurl using OpenSSL.)

提示:最後出現ldconfig deferred processing now taking place: 編寫測試程式若出現找不到curl檔案,最好重啟生效。

2. 測試curl程式

參考:http://blog.csdn.net/u011641885/article/details/46900771

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <stdio.h> #include <curl/curl.h> #include <stdlib.h> intmain(intargc,char*argv[]) { CURL *curl;//定義CURL型別的指標 CURLcode res;//定義CURLcode型別的變數,儲存返回狀態碼 if(argc!=2) { printf("Usage : file <url>;/n"); exit
(1); } curl = curl_easy_init();//初始化一個CURL型別的指標 if(curl!=NULL) { //設定curl選項. 其中CURLOPT_URL是讓使用者指定url. argv[1]中存放的命令列傳進來的網址 curl_easy_setopt(curl, CURLOPT_URL, argv[1]); //呼叫curl_easy_perform 執行我們的設定.並進行相關的操作. 在這裡只在螢幕上顯示出來. res = curl_easy_perform(curl); //清除curl操作. curl_easy_cleanup(curl); } return0; }

3. json安裝

0.依賴libtool
apt-get install libtool


1.get source
git clone git://github.com/json-c/json-c.git /opt/git/json-c
cd /opt/git/json-c/

2.Generate configuration files:
必須保證libtool工具已經安裝好
./autogen.sh

3. Configure:
./configure

4.build & install
make
make install
ln -sf /usr/local/include/json-c /usr/include/json

4. libubox安裝

0. 依賴工具包cmake
apt-get install cmake

1. 獲取原始碼
git clone git://nbd.name/luci2/libubox.git /opt/git/libubox
cd /opt/git/libubox/

2. 配置
cmake CMakeLists.txt -DBUILD_LUA=OFF

遇到提示:package 'json' not found
只要json路徑預設安裝在/usr/local/include
可以不用擔心該提示

3. 編譯安裝
make
遇到錯誤:
blobmsg_json.c:78:2 error: implicit declaration of function 'is_error'
jshn.c:162:2: error: implicit declaration of function 'is_error'
解決辦法:
對應的檔案里加入下面定義
#define is_error(ptr) (ptr == NULL)

make install
ln -sf /usr/local/lib/libubox.so /usr/lib/libubox.so
mkdir -p /usr/share/libubox
ln -sf /usr/local/share/libubox/jshn.sh /usr/share/libubox/jshn.sh

5. uci安裝

1. 獲取原始碼
git clone git://nbd.name/uci.git /opt/git/uci
cd /opt/git/uci/

2. 配置
cmake CMakeLists.txt -DBUILD_LUA=OFF

3. 編譯安裝
make

class="western"
sudo make install
sudo ln -sf /usr/local/bin/uci /sbin/uci
sudo ln -sf /usr/local/lib/libuci.so /usr/lib/libuci.so

6. ubus安裝

1. 獲取原始碼
git clone git://nbd.name/luci2/ubus.git /opt/git/ubus
cd /opt/git/ubus/

2. 配置
cmake CMakeLists.txt -DBUILD_LUA=OFF
提示: package 'systemd' not found
可以不用擔心該提示


3. 編譯安裝
make

sudo make install
sudo ln -sf /usr/local/sbin/ubusd /usr/sbin/ubusd
sudo ln -sf /usr/local/lib/libubus.so /usr/lib/libubus.so

7. microxml安裝

1. 獲取原始碼
git clone https://github.com/pivasoftware/microxml.git /opt/git/microxml
cd /opt/git/microxml/

2. 配置
autoconf -i
./configure --prefix=/usr --enable-threads --enable-shared --enable-static


3. 編譯安裝
make
sudo make install
sudo ln -sf /usr/lib/libmicroxml.so.1.0 /lib/libmicroxml.so
sudo ln -sf /usr/lib/libmicroxml.so.1.0 /lib/libmicroxml.so.1

8.easycwmp安裝

1. 獲取原始碼
cd /opt/dev/
wget http://easycwmp.org/download/easycwmp-{x}.{y}.{z}.tar.gz
tar -xzvf easycwmp-{x}.{y}.{z}.tar.gz
mv easycwmp-{x}.{y}.{z} easycwmp
cd /opt/dev/easycwmp/

2. 配置
autoconf -i
./configure --enable-debug --enable-devel --enable-jsonc=1

安裝easycwmp時,提示找不到libcurl(rpm -qa | grep curl查詢已安裝)
No package 'libcurl' found,找到libcurl的安裝目錄,設定成對應的pkgconfig即可
如下設定即可
export PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig/:/usr/lib64/pkgconfig/


3. 編譯安裝
make

4. 準備配置開發環境
4.1 建立指令碼存放目錄
mkdir -p /usr/share/easycwmp/functions
mkdir -p /etc/easycwmp

4.2 建立easycwmp指令碼執行的符號連結

ln -sf /opt/dev/easycwmp-1.8.6/ext/openwrt/scripts/easycwmp.sh /usr/sbin/easycwmp
ln -sf /opt/dev/easycwmp-1.8.6/ext/openwrt/scripts/defaults /usr/share/easycwmp/defaults
ln -sf /opt/dev/easycwmp-1.8.6/ext/openwrt/scripts/functions/common/common /usr/share/easycwmp/functions/common
ln -sf /opt/dev/easycwmp-1.8.6/ext/openwrt/scripts/functions/common/device_info /usr/share/easycwmp/functions/device_info
ln -sf /opt/dev/easycwmp-1.8.6/ext/openwrt/scripts/functions/tr098/lan_device /usr/share/easycwmp/functions/lan_device
ln -sf /opt/dev/easycwmp-1.8.6/ext/openwrt/scripts/functions/common/management_server /usr/share/easycwmp/functions/management_server
ln -sf /opt/dev/easycwmp-1.8.6/ext/openwrt/scripts/functions/tr181/root /usr/share/easycwmp/functions/root

4.3 建立easycwmp配置檔案的符號連結
mkdir /etc/config
ln -sf /opt/dev/easycwmp/ext/openwrt/config/easycwmp /etc/config/easycwmp
4.4 建立easycwmpd程序的符號連結
ln -sf /opt/dev/easycwmp/bin/easycwmpd /usr/sbin/easycwmpd

4.5 export 在easycwmp指令碼執行的環境變數
export UCI_CONFIG_DIR="/opt/dev/easycwmp/ext/openwrt/config/"
export UBUS_SOCKET="/var/run/ubus.sock"

4.6 使用Openwrt指令碼測試是否easycwmp安裝成功?
sudo mkdir -p /lib/{config,functions}
sudo wget http://pastebin.lukaperkov.net/openwrt/20121219_lib_functions.sh -O /lib/functions.sh
sudo wget http://pastebin.lukaperkov.net/openwrt/20121219_lib_config_uci.sh -O /lib/config/uci.sh
sudo wget http://pastebin.lukaperkov.net/openwrt/20121219_lib_functions_network.sh -O /lib/functions/network.sh

bash /usr/sbin/easycwmp get value InternetGatewayDevice.

遇到錯誤:: 未有任何輸出,解決辦法參考下一步遇到的錯誤

4.7 執行easycwmp
export PATH=$PATH:/usr/sbin:/sbin
ln -sf bash /bin/sh
/usr/sbin/ubusd -s /var/run/ubus.sock &
/usr/sbin/easycwmpd -f -b

遇到錯誤:: error while loading shared libraries: libjson-c.so.3: cannot open shared object file: No such file or directory
解決辦法:如果嚴格按照我的步驟,你會出現找不到libjson庫的問題,因為在安裝libjson的時候預設安裝到/usr/local/lib/路徑下面,所以建立軟連線指向這裡即可:
ln -sf /usr/local/lib/libjson-c.so.3.0.0 /usr/lib/libjson-c.so.3

二. 使用openacs測試

1. 設定acs url
vi /etc/config/easycwmp
修改acs url一行為如下
option url http://ip:8080/openacs/acs

2.開啟openacs
http://ip:8080/openacs
在FindCPE下面看到裝置型號,輸入序列號即可進行操作

. 程式碼閱讀

初步閱讀程式碼,未發現該開原始碼有什麼優勢,這也許就是商業和非商業的區別。 而且在官網上,人家也說了:Data Model部分,shell寫的是開源,隨便你們蹂躪,C寫的才是商業機密,效能比你shell吊炸天!!!!要的就是你在shell裡面痛苦,再找我要商業版的,^_^,外國犢子夠奸詐了吧!!!!

有空我也寫個商業版的cwmp,而且要比他還牛逼,我要支援多平臺的,不僅僅是linux,那就趕緊眾籌我吧,哈哈,讓我有更多的時間來寫一個吊炸天的程式給你們用。

參考:http://www.easycwmp.org/index.php/manual