logo资料库

Easycwmp_源码分析.pdf

第1页 / 共36页
第2页 / 共36页
第3页 / 共36页
第4页 / 共36页
第5页 / 共36页
第6页 / 共36页
第7页 / 共36页
第8页 / 共36页
资料共36页,剩余部分请下载后查看
Easycwmp_源码分析.md 2020/11/16 EasyCwmp 源码分析 1. 主要功能 1.1 提供数据参数配置 1.2 文件管理 1.3 状态和性能监控 1.4 告警上报 2. EasyCwmp 源码结构 2.1 源码架构组成 2.2 文件结构 2.3 文件依赖 3. 源代码模块分析 3.1 系统启动流程 3.2 RPC Methods (CPE) 3.2.1 RPC 函数实现 1. SetParameterValues 方法 2. GetParameterValues 方法 3. GetParameterNames 方法 4. GetParameterAttributes 方法 5. SetParameterAttributes 方法 6. AddObject 方法 7. DeleteObject 方法 8. Download 方法 9. Upload 方法 10. Reboot 方法 11. FactoryReset 方法 12. ScheduleInform 方法 3.2.2 RPC 获取、上报 1. 获取CPE端RPC方法 2. 获取ACS服务器端RPC方法 3.3 连接ASC服务器 3.3.1 WireShark抓包常用设置 3.3.2 会话流程 3.4 XML 数据包解析、生成 3.4.1 mxmlNewXML 3.4.2 mxmlNewElement 3.4.3 mxmlElementSetAttr 3.4.4 mxmlNewText 3.4.5 mxmlSaveFile 3.4.6 mxmlDelete 3.4.7 mxmlLoadFile 3.4.8 mxmlElementGetAttr 3.4.9 mxmlGetText 3.4.10 mxmlWalkNext 3.4.11 mxmlFindElement 3.5 cwmp 事件管理 3.5.1 EasyCwmp消息事件 1 / 36
Easycwmp_源码分析.md 2020/11/16 3.5.2 系统事件类型以及属性 3.5.3 事件处理 3.6 外部脚本调用 3.7 CWMP 引擎和 shell 通讯机制 3.8 配置文件管理 3.9 鉴权认证(后面完善) 3.10 数据备份 3.11 数据上传,下载 5.1 OpenWRT Linux 上安装 EasyCwmp EasyCwmp 部分 microxml 5.2 其他 Linux 发行版本安装 EasyCwmp 1. 数据下载 2. 数据上传 3.12 状态和性能监控 IPPing MemoryStatus 3.13 告警上报 4. EasyCwmp 常见故障代码 5. EasyCwmp 安装 general curl json-c libubox uci ubus microxml easycwmp 6.官方收费代码对比 EasyCwmp 源码分析 CWMP是由数字用户线路DSL——Digital Subscriber’s Line论坛(之后更名为broadband-forum)发起开发的技 术规范之一,编号为TR-069,所以又被称为TR-069协议。 CWMP的全称为:CPE广域网管理协议(CPE WAN Management Protocol),这个协议主要用于网管中心远程管理配置数量较大的网络设备。 目前主要应用在企 业级路由器、一体化皮基站等网络设备的管理,所以CWMP是一个功能强大的用于数据中心、网管中心管理它 所属的所有网络设备的网管协议。 1. 主要功能 1.1 提供数据参数配置 被管理设备(CPE)接收来自ACS发起的配置请求,请求包括了协议标准的参数(比如TR098、TR181等协议规定 的数据模型),以及用户自定义的数据模型 2 / 36
2020/11/16 Easycwmp_源码分析.md 1.2 文件管理 被管理设备(CPE)可以从ACS服务器通过协议标准的数据模型上传或下载文件(包括升级软固件包、日志文 件、性能统计文件等等) 1.3 状态和性能监控 ACS可以通过标准定制的方法监控被管理设备(CPE)的状态和性能统计,同时CPE也可以主动通知ACS自身状 态的更新 1.4 告警上报 被管理设备(CPE)可以主动向ACS服务器上传设备中的告警信息 2. EasyCwmp 源码结构 源代码下载地址为:http://easycwmp.org/download/easycwmp-1.8.6.tar.gz 2.1 源码架构组成 EasyCwmp设计包括2个部分: EasyCwmp Core:它包括 TR069 CWMP 引擎,并负责与ACS服务器的通信。使用C语言开发。 EasyCwmp DataModel:它包含 TR-06 的 DATAModel,并且符合某些 DataModel 标准,例如 TR-098, TR-181,TR-104 等。使用 shell 脚本开发。 EasyCwmp源码流程如下: 3 / 36
Easycwmp_源码分析.md 2020/11/16 2.2 文件结构 文件目录 文件说明 包含文件 /src EasyCwmp核心,CWMP引 擎,并负责与ACS服务器的通 信 backup.c、base64.c、 basicauth.c、config.c、 cwmp.c、digestauth.c、 easycwmp.c、external.c、 http.c、json.c、log.c、 md5.c、time.c、ubus.c、 xml.c /ext/openwrt/config /ext/openwrt/scripts cwmp配置文件,使用uci模块 进行配置 1.命令的入参处理 2.与系统接口的定义 easycwmp easycwmp.sh 4 / 36
Easycwmp_源码分析.md 2020/11/16 文件目录 文件说明 包含文件 /ext/openwrt/scripts/functions/common 1.操作方法的具体实现 2.Json相关函数 3.其他函数封装,数据模型 ManagementServer相关节点 定义,GET和SET方法实现 common、device_info、 ipping_launch、 management_server ipping_diagnostic、 lan_device、root、 wan_device dhcpv4、ip、 ipping_diagnostic、root、 wifi /ext/openwrt/scripts/functions/tr098 tr098 数据模型 /ext/openwrt/scripts/functions/tr181 tr181 数据模型 2.3 文件依赖 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: microxml source: git clone https://github.com/pivasoftware/microxml.git microxml OpenWRT package: wget http://easycwmp.org/download/libmicroxml.tar.gz 3. 源代码模块分析 3.1 系统启动流程 详细代码参考 easycwmp.c 中 main 函数。 1. 获取输入参数。 2. 建立互斥文件锁,设置互斥文件属性,确认为root登录。 3. 内存分配,链表初始化,uloop_init,xml备份初始化。 4. 创建子进程、两个pipe管道负责父子进程进行通信,子进程交给/usr/sbin/easycwmp 脚本程序接管,准 5. 加载easycwpm配置文件,通过配置文件初始化设备信息(设备类型、设备厂商、设备编号、厂商唯一编 备处理JSON格式参数。 号),初始化心跳timer。 6. 测试通过管道发送命令/usr/sbin/easycwmp 脚本程序并使其退出。 7. 根据输入参数添加EVENT_BOOT或EVENT_PERIODIC事件到evens列表,设定timer回调处理事件(启动连 接事件)。 5 / 36
Easycwmp_源码分析.md 8. netlink_init,http_server_init 本地服务初始化 9. 进入uloop_run主循环,处理事件消息。 2020/11/16 3.2 RPC Methods (CPE) 这里主要介绍的是 CPE 设备端的 RPC 远程调用方法,ACS 服务端所具有的 RPC 方法需要查看对应服务器端的 配置。 在 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 }, }; 3.2.1 RPC 函数实现 RPC 函数参数说明: /** * @brief * @param body_in 输入的 xml 数据 * @param tree_in 输入的 xml 数据 * @param tree_out 输出的 xml 数据 * @return int -1 错误, 0 成功 */ int (*handler)(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out); 1. SetParameterValues 方法 CPE 设备端数据模型参数设置,只能修改可写属性的参数。 代码参考 xml.c 中 xml_handle_set_parameter_values 函数 6 / 36
Easycwmp_源码分析.md 2020/11/16 int xml_handle_set_parameter_values(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out) 2. GetParameterValues 方法 获取 CPE 设备端数据模型对应参数数据,可以按照数据模型前缀读取, 如读取前缀为 Device. 的数据。 代码参 考 xml.c 中 xml_handle_get_parameter_values 函数 int xml_handle_get_parameter_values(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out) 3. GetParameterNames 方法 获取 CPE 设备端数据模型对应参数名称、属性信息。 代码参考 xml.c 中 xml_handle_get_parameter_names 函 数 int xml_handle_get_parameter_names(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out) 4. GetParameterAttributes 方法 获取 CPE 设备端数据模型对应参数属性信息。 代码参考 xml.c 中 xml_handle_get_parameter_attributes 函数 int xml_handle_get_parameter_attributes(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out) 5. SetParameterAttributes 方法 设置 CPE 设备端数据模型对应参数属性信息。 代码参考 xml.c 中 xml_handle_set_parameter_attributes 函数 int xml_handle_set_parameter_attributes(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out) 7 / 36
2020/11/16 Easycwmp_源码分析.md 6. AddObject 方法 在 CPE 设备端添加一组数据模型。 代码参考 xml.c 中 xml_handle_AddObject 函数 int xml_handle_AddObject(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out) 7. DeleteObject 方法 删除 CPE 设备端对应数据模型信息。 代码参考 xml.c 中 xml_handle_DeleteObject 函数 int xml_handle_DeleteObject(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out) 8. Download 方法 从xml数据中获取下载数据信息,包括下载链接URL、 文件类型FileType、用户名和密码、文件大小FileSize等信 息。 判断URL合法性,添加一个下载事件 cwmp_add_download。 代码参考 xml.c 中 xml_handle_download 函 数 int xml_handle_download(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out) 9. Upload 方法 从xml数据中获取上传数据信息,包括上传文件链接URL、 文件类型FileType、用户名和密码、文件大小FileSize 等信息。 判断URL合法性,添加一个上传事件 cwmp_add_upload。 代码参考 xml.c 中 xml_handle_upload 函 数 int xml_handle_upload(mxml_node_t *body_in, mxml_node_t *tree_in, mxml_node_t *tree_out) 10. Reboot 方法 8 / 36
分享到:
收藏