声明:原创作品,严禁用于商业目的。 如有任何技术问题,欢迎和我交流:19826269205(V号)。
1. 源码结构
1.1 EasyCwmp设计架构
EasyCwmp设计包括2个部分:
EasyCwmp Core:它包括 TR069 CWMP 引擎,并负责与ACS服务器的通信。使用C语言开发。
EasyCwmp DataModel:它包含 TR-06 的 DATAModel,并且符合某些 DataModel 标准,例如 TR-098,TR-181,TR-104 等。使用 shell 脚本开发,只支持部分协议模型,在开发和维护过程效率比较低。
1.2 EasyCwmp源码组成
1.3 EasyCwmp文件依赖
(1)libuci (配置文件管理)
(2)libcurl (http 协议处理)
(3)json-c (JSON 数据处理)
(4)libubox (openwrt核心库之一,事件处理)
(5)libubus (openwrt消息总线,实现不同应用程序之间的信息交互)
(6)microxml: microxml is a fork of Mini-XML,it’s being used to parse XML blocks passed between ACS and the client , and it’s published by freecwmp guys
2. EasyCwmp执行流程
2.1 主函数
详细代码可参考 easycwmp.c 中 main 函数:
(1) 获取输入参数。
(2) 建立互斥文件锁,设置互斥文件属性,确认为root登录。
(3) 内存分配,链表初始化,uloop_init,xml备份初始化。
(4) 创建子进程、两个pipe管道负责父子进程进行通信,子进程交给/usr/sbin/easycwmp 脚本程序接管,准备处理JSON格式参数。
(5) 加载easycwpm配置文件,通过配置文件初始化设备信息(设备类型、设备厂商、设备编号、厂商唯一编号),初始化心跳timer。
(6) 测试通过管道发送命令/usr/sbin/easycwmp 脚本程序并使其退出。
(7) 根据输入参数添加EVENT_BOOT或EVENT_PERIODIC事件到evens列表,设定timer回调处理事件(启动连接事件)。
(8) netlink_init,http_server_init 本地服务初始化
(9) 进入uloop_run主循环,处理事件消息。
2.2 RPC Methods (CPE)
在 EasyCwmp 源码中已经实现了 TR069 协议中常用 RPC 方法,源码定义的 RPC 方法在 xml.c 文件中:
const struct rpc_method rpc_methods[] = {
{ “GetRPCMethods”, xml_handle_get_rpc_methods },
{ “SetParameterValues”, xml_handle_set_parameter_values },
{ “GetParameterValues”, xml_handle_get_parameter_values },
{ “GetParameterNames”, xml_handle_get_parameter_names },
{ “GetParameterAttributes”, xml_handle_get_parameter_attributes },
{ “SetParameterAttributes”, xml_handle_set_parameter_attributes },
{ “AddObject”, xml_handle_AddObject },
{ “DeleteObject”, xml_handle_DeleteObject },
{ “Download”, xml_handle_download },
{ “Upload”, xml_handle_upload },
{ “Reboot”, xml_handle_reboot },
{ “FactoryReset”, xml_handle_factory_reset },
{ “ScheduleInform”, xml_handle_schedule_inform },
};
2.3 商业源码对比
初步阅读开源代码,未发现该开源代码有什么优势,这也许就是商业和非商业的区别。 而且在官网上,明确说明开源免费的效率要比商业版的低得多,而且维护也比较困难。其中,Data Model部分,是shell脚本编写,开源,集成到openwrt中。C写的才是商业机密,性能比你shell吊炸天!!!!要的就是你在shell里面痛苦,再找我要商业版的,_,外国犊子够奸诈了吧!!!!
所以,我们需要构建一个使用C语言程序编写的商业版的CWMP程序。
3. easycwmp源码编译和测试(X86平台)
环境:
linux系统:Ubuntu 18.04
CPE:easycwmp-1.8.6.tar.gz
ACS: 华为ITMS测试版
安装EasyCwmp所需要的依赖:若安装过程提示找不到安装包,请到更新Ubuntu源。
sudo apt-get install git cmake autoconf
3.1 配置我们将要使用的USER和GROUP变量:
UUSER=yy
GROUP=yy
3.2. 创建目录
sudo mkdir -p /opt/{
dev,git}
sudo chown -R $USER:$GROUP /opt/{
dev,git}
3.3. 安装curl
sudo apt install libcurl4-openssl-dev
您的发行版应该已经包含curl开发包。可以直接使用。
注意:如果使用SSL软件包依赖关系来构建libcurl,则建议使用OpenSSL进行构建,因为EasyCwmp主要是使用OpenSSL与libcurl一起测试的。
如果使用PolarSSL构建libcurl,则无法使用ACS服务器进行摘要身份验证。
3.4 安装json-c
下载json:
git clone git://github.com/json-c/json-c.git /opt/git/json-c
因为出现错误:fatal: read error: Connection reset by peer
把git换成http即可。
git clone http://github.com/json-c/json-c.git /opt/git/json-c
cd /opt/git/json-c/
生成配置文件:
mkdir build
cd build
cmake ../CMakeLists.txt
../cmake-configure --prefix=/usr
编译
cd ..
make
sudo make install
sudo ln -sf /usr/include/json-c /usr/include/json
3.5.安装libubox
下载libubox:
git clone git://nbd.name/luci2/libubox.git /opt/git/libubox
或者命令
git clone http://git.nbd.name/luci2/libubox.git libubox
cd /opt/git/libubox/
安装依赖工具cmake:
sudo apt install cmake
配置编译
cmake CMakeLists.txt -DBUILD_LUA=OFF
make
libubox在make时,报错:
/opt/git/libubox/blobmsg_json.c:78:6: error: implicit declaration of function ‘is_error’;
/opt/git/libubox/jshn.c:162:6: error: implicit declaration of function ‘is_error’;
需要在对应C文件中添加<