• CWMP开源代码研究2——easycwmp安装和学习


    声明:本文是对开源程序代码学习和研究,严禁用于商业目的。 如有任何问题,欢迎和我交流。(企鹅号: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

    #include <stdio.h>
    #include <curl/curl.h>
    #include <stdlib.h>
    int main(int argc, 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);
        }
        return 0;
    }
    

    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

    3. 编译安装
    make

    4. 准备配置开发环境
    4.1 创建脚本存放目录
    mkdir -p /usr/share/easycwmp/functions
    mkdir -p /etc/easycwmp

    4.2 创建easycwmp脚本运行的符号链接

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

    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

  • 相关阅读:
    36、基于TCP、UDP协议的嵌套字通信
    34、异常以及网络编程
    作业4月15号
    31、反射与内置方法、元类
    30、多态与鸭子类型以及内置函数
    作业4月9号
    29、继承
    作业4月8号
    28、封装
    27、面向对象
  • 原文地址:https://www.cnblogs.com/myblesh/p/6225665.html
Copyright © 2020-2023  润新知