博通Broadcom SDK源码学习与开发12终结篇——TR069网管协议

article/2025/10/18 19:20:51

声明:原创作品,严禁用于商业目的。 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨。

文章目录

  • 0.写在前篇
  • 1. TR069的Makefile和源码
  • 2. 配置参数
    • 2.1 CLI命令
    • 2.2 CM ConfigFile
  • 2.3 DHCP option
  • 3. 多种配置参数的优先顺序
  • 4. TR069具体实现
    • 4.1 TR069 Thread状态控制
    • 4.2 Socket建立
  • 4.3 数据模型的建立
    • 4.4 RPC处理过程
    • 4.5 如何添加object/parameter
  • 5. 改善或问题
    • 5.1 数据有效性检测
    • 5.2 增加/删除节点与SNMP同步
    • 5.3 节点模板
  • 6. 总结

0.写在前篇

本系列文章来自于博通公司相关项目开发中的学习资料和开发总结,是企业或者公司项目开发过程中必备的网络相关知识,主要涉及到ecos和linux系统编译、内存管理、接口管理、HAL抽象层、以及IPV6、DHCP、TR069等网络相关协议。为维护版权和相关知识产权,请购买官方SDK和相关服务,此系列文章仅为个人学习使用,如有不妥之处和技术相关知识,请私信留言!
博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译
博通Broadcom SDK源码学习与开发2——Bootloader功能和编译过程
博通Broadcom SDK源码学习与开发3——Cable Modem Docsis3.0
博通Broadcom SDK源码学习与开发4——ECOS系统数据流
博通Broadcom SDK源码学习与开发5——ECOS系统层剖析
博通Broadcom SDK源码学习与开发6——支持Linux系统
博通Broadcom SDK源码学习与开发7——HAL硬件抽象层分析
博通Broadcom SDK源码学习与开发8——内存与参数管理
博通Broadcom SDK源码学习与开发9——Interface接口管理
博通Broadcom SDK源码学习与开发10——Cable Modem IPv6地址
博通Broadcom SDK源码学习与开发11——Cable Modem DHCP管理
博通Broadcom SDK源码学习与开发12终结篇——TR069网管协议
参考:TR069协议

1. TR069的Makefile和源码

  1. 编译:

在编译选项中添加“tr69”, 对应的makefile为: REV/rbb_cm_src/Bfc/make/BfcTR69.mak

  1. 相关源码

主要有3部分代码:tr069 client agent代码,用c实现;TR069Thread和CLI配置代码,c++实现;client agent与系统间的接口代码,c++实现。(具体实现在后文讲解)

//tr069 client agent代码
REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/
inc/  #放置与数据模型相关的宏定义,数据结构定义头文件
main/ #agent实现文件,main,informer,event
nanoxml/ #
SOAPParser/ #soap解析,其中RPCState.c为RPC命令处理接口
standard/ #节点数据模型定义文件
webproto/ #
//tr069thread与CLI参数配置
REV/rbb_cm_src/Bfc/IpHelpers/TR069/
BcmBfcTr69CommandTable.cpp #tr69 CLI实现
BcmBfcTr69SnmpApi.cpp  #提供了通过snmp进行对系统参数的get/set接口,tr69 agent利用这些接口进行大部分参数的get/set
BcmBfcTr69ThreadIpStackACT.cpp #ip_stack ip变化时,通知TR069Thread启动或停止agent
BcmBfcTr69SocketApi.cpp  #提供系统与agent间有关socket操作的接口,供agent调用
BcmBfcTr69Entry.cpp  #
BfcTr69NonVolSettings.cpp
BfcTr69NonVolSettingsCommandTable.cpp  #tr69 non-vol参数配置CLI
BcmBfcTr69NonVolApi.cpp  #提供non-vol存取的接口,供agent调用
BcmBfcTr69Thread.cpp  #tr069进程实现,控制agent的运行/停止/重启

//client agent系统调用接口
REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/bcmBfcIf/
其中的文件定义了与standard/目录下数据模型结构中对应的object的add/del,parameters的get/set api

2. 配置参数

2.1 CLI命令

CM>cd non-vol/tr69
CD>lsacs_password acs_url acs_username conn_req_password conn_req_url conn_req_usernameip_stack_num periodic_inform_enable periodic_inform_intervalstun_enable stun_max_keepalive stun_mix_keepalive stun_password stun_server stun_username  

其中,ip_stack_num为tr69 agent关联的wan interface对应的ipstack number,默认指定为3

此外,可使用的命令有如下:

CM>cd tr69
CM>lsacs_url log send_inform show start_client stop_client test walk_tree

其中: client可理解为tr069 client agent
acs_url 修改acsurl
send_inform agent运行前提下,立即发送inform
start_client 如ip_stack_num对应的wan interface处于可用状态,则会运行agent
walk_tree 查看节点结构.

2.2 CM ConfigFile

参数配置 CM Config有定义TR-069参数:

eRouter Configuration Encodings (202)eRouter TR-069 Management Server (2)EnableCWMP (1)URL (2)Username (3)Password (4)ConnectionRequestUserName (5)ConnectionRequestPassword (6)ACSOverride (7)

其中,EnableSWMP和ACSOverride会影响tr69 agent的行为。

2.3 DHCP option

利用DHCPv6 Option17或DHCPv4 Option125来配置ACSUrl参数

3. 多种配置参数的优先顺序

(1)启动方式:
通过CLI(start_client)启动,此时使用的为通过CLI配置的参数,即在NonVol中的参数
自动启动,条件为CM Config中的EnableCWMP为true,或者得到有效的DHCPv6 Option17或DHCPv4 Option125。此时的参数选择如下
(2)自动启动时的参数选择

// 其他参数(acsusername,acspassword,connrequsername,connreqpassword)的选择:
if(ACSOverride==true || (ACSOverride==false && ACSUrl in NonVol=="http://10.10.10.10:8080/acs"))CM Config > NonVol
else if(ACSOverride==false && ACSUrl in NonVol!="http://10.10.10.10:8080/acs")!NonVol > CM Config

如果ACSUrl中使用"[]"包含IP地址或者由DHCPv6 Option17得到的ACSUrl,则尝试首先使用IPv6发起连接.

4. TR069具体实现

4.1 TR069 Thread状态控制

// tr069thread有以下状态和消息类型:enum{kStartThread = 0, //目前此msg仅自CLIkStopThread, //同上kStartClient,//同上kStopClient, //同上kSendInform, //同上kIpAddressChanged //当相关的ip_stack ip发生变化时,会收到此消息类型}QCommands;typedef enum{kClientStarting = 0,kClientReady,       // Thread initialized and ready for CorekClientRunning,kClientStopping,kClientStopped,     // Client (core) is stopped, thread runningkExitingThread      // Going away completely.} ThreadState;

进程根据进程状态和收到的消息类型来控制tr69 client agent,start/stop agent的过程用下图简单描述:
在这里插入图片描述

4.2 Socket建立

建立2个socket,acsconnection socket用于连接ACS;acslisten socket用于接收acs的RPC.

// acs connection socket建立
wget.c wget_Connect()\_www.c www_EstablishConnection()\_BcmBfcTr69SocketApi.cpp BfcTr69Api_SocketAcsConnection()\_BcmBfcTr69Thread::SocketAcsConnection()// acs listen socket建立
tr69c_main() -> initTask()\_informer.c initInformer() -> startACSComm() ->startACSListener() -> startACScallback()\_BfcTr69Api_SocketACSListenSocket()\_BcmBfcTr69Thread::SocketACSListenSocket()

4.3 数据模型的建立

数据模型标准:TR-181_Issue-2.pdf。
1)模型对应数据结构

//节点数据结构定义:
REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/inc/tr69cdef.htypedef union TRxPAttrib {struct Attrib {eTRxType    etype:8;unsigned    slength:16;unsigned    inhibitActiveNotify:1; /* set to always inhibit change notification: use on counters */} attrib;InstanceDesc    *instance;} TRxPAttrib;typedef struct TRxObjNode {const char  *name;//节点或参数名称TRxPAttrib  paramAttrib;//主要指示参数类型,object/string/bool...TRxSETFUNC  setTRxParam;//object的del,parameter的setTRxGETFUNC  getTRxParam;//object的add,parameter的getvoid        *objDetail; //节点类型为object时,对应object的详细内容(包含parameter和下级object)InstanceDope *instanceDope;} TRxObjNode;

用以上结构表示以下节点:

Device.InterfaceStackNumberOfEntries //unsigned类型parameter,readonlyDevice.DeviceSummary //string类型parameter,readonly                                          Device.IP. //不可动态添加的object类型,readonlyDevice.IP.IPv4CapableDevice.IP.IPv4Enable...Device.IP.InterfaceNumberOfEntriesDevice.IP.Interface.{i}. //可动态添加的object类型,read-writeDevice.IP.Interface.i.Enable //read-writeDevice.IP.Interface.i.IPv4Enable //read-write...

的实例对应为:

tr181i2DeviceParams.cTRxObjNode  tr181i2DeviceDesc[] = {{InterfaceStackNumberOfEntries,{{tUnsigned,0,0}}, NULL, getInterfaceStackNumEntries,NULL,NULL},{DeviceSummary,{{tString}}, NULL, getDeviceSummary,NULL,NULL},{IP,{{tObject,0,0}}, NULL,NULL, ipDesc,NULL},{NULL}};tr181i2DeviceParams.cTRxObjNode  ipDesc[] = {{IPv4Capable,{{tBool,0}}, NULL,getIPv4Capable,NULL,NULL},{IPv4Enable,{{tBool,0}}, NULL,getIPv4Enable,NULL,NULL},{InterfaceNumberOfEntries,{{tUnsigned,0,16}}, NULL,getIPInterfaceNumberOfEntries,NULL,NULL},{ActivePortNumberOfEntries,{{tUnsigned,0,16}}, NULL,getIPActivePortNumberOfEntries,NULL,NULL},{Interface,{{tObject,0,0}}, NULL,NULL, ipInterfaceDesc,NULL},{NULL}};tr181i2IPInterfaceParams.cTRxObjNode  ipInterfaceDesc[] = {{instanceIDMASK,{{0}}, deleteIPInterfaceInstance, addIPInterfaceInstance, ipInterfaceInstanceDesc},};//其中,instanceIDMASK为新节点标识,deleteIPInterfaceInstance为delete Interface节点的API名称TRxObjNode  ipInterfaceInstanceDesc[] = {{Enable,{{tBool,0}},setIPInterfaceEnable,getIPInterfaceEnable,NULL,NULL},{IPv4Enable,{{tBool,0}},setIPInterfaceIPv4Enable,getIPInterfaceIPv4Enable,NULL,NULL},{NULL}//其中,setIPInterfaceIPv4Enable/getIPInterfaceIPv4Enable为Device.IP.Interface.i.IPv4Enable参数的set/get API名称
};

以上,根据:

tr181i2DeviceDesc[]\_ipDesc[]\_ipInterfaceDesc[]连接成了Device.\_IP.\_Interface.节点树形结构

4.4 RPC处理过程

  1. 入口函数
    对应处理函数入户为: REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/SOAPParser/RPCState.c runRPC()
    目前,支持如下方法:
switch (rpcAction->rpcMethod) {case rpcGetRPCMethods:...case rpcSetParameterValues:...case rpcGetParameterValues:...case rpcGetParameterNames:...case rpcGetParameterAttributes:...case rpcSetParameterAttributes:...case rpcAddObject:...case rpcDeleteObject:...case rpcReboot:...case rpcFactoryReset:...
#if DOWNLOAD_SUPPORTEDcase rpcDownload:...
#endifcase rpcInformResponse:...case rpcTransferCompleteResponse:...case rpcGetRPCMethodsResponse:...case rpcFault:...

2) parameters对应的get/set api  
仍以上述Device.IP.Interface.节点为例,此节点对应的api位于:

1 REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/bcmBfcIf/BcmBfcTr181i2IPInterfaceHandlers.cpp

注意到实际上这里大部分API没有实现实际功能。
实际上,TR069的get/set是通过SNMP实现的,比如WiFi.Radio.{i}.Enable这个参数的get/set:

getWiFiRadioEnable() -> BfcTr69Api_GetFromSnmp(kOID_clabWIFIRadioEnable,,,)
setWiFiRadioEnable() -> BfcTr69Api_SnmpSetInt(kOID_clabWIFIRadioEnable,,,)
其中,kOID_clabWIFIRadioEnable为参数对应的OID,BfcTr69Api_GetFromSnmp()定义在BcmBfcTr69SnmpApi.cpp

4.5 如何添加object/parameter

以添加如下节点和参数为例:

<object ref="Device.NAT.PortMapping.{i}." requirement="createDelete">
...
<parameter ref="RemoteHost" requirement="readWrite"/>
<parameter ref="ExternalPort" requirement="readWrite"/>
...
</object>

1)添加参数对应数据结构定义

--- /dev/null
+++ b/REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/standard/tr181i2NATPortMappingParams.c
@@ -0,0 +1,35 @@
+//  Filename:       tr181i2NATPortMappingParams.c
+
+#include "sharedparams.h"
+#include "tr181i2NATPortMappingParams.h"
+
+/* Device.NAT.PortMapping.{i} */
+TRXGFUNC(getPortMappingRemoteHost);
+TRXSFUNC(setPortMappingRemoteHost);
+TRXGFUNC(getPortMappingExternalPort);
+TRXSFUNC(setPortMappingExternalPort);
+
+TRxObjNode  natPortMappingInstanceDesc[] = {
+    {RemoteHost,{{tString,0,64}}, setPortMappingRemoteHost, getPortMappingRemoteHost, NULL,NULL},
+    {ExternalPort,{{tUnsigned,0,16}}, setPortMappingExternalPort,getPortMappingExternalPort,NULL,NULL},
+    {NULL}
+};
+
+/* Device.NAT.PortMapping. */
+TRXGFUNC(addPortMappingInstance);
+TRXSFUNC(deletePortMappingInstance);
+
+TRxObjNode  natPortMappingDesc[] = {
+    {instanceIDMASK,{{0}}, deletePortMappingInstance, addPortMappingInstance, natPortMappingInstanceDesc},
+};
diff --git a/REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/standard/tr181i2NATPortMappingParams.h b/REV/rbb_cm_src/Bf
new file mode 100755
index 0000000..f45b208
--- /dev/null
+++ b/REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/standard/tr181i2NATPortMappingParams.h
@@ -0,0 +1,24 @@
+//  Filename:       tr181i2NATPortMappingParams.h
+
+#ifndef TR181I2_NAT_PORTMAPPING_PARAMS_H
+#define TR181I2_NAT_PORTMAPPING_PARAMS_H
+
+#include "../inc/tr69cdefs.h"
+
+/* Device.NAT.PortMapping.{i}*/
+SVAR(RemoteHost);
+SVAR(ExternalPort);
+
+#endif   // TR181I2_NAT_PARAMS_H

将增加的PortMapping节点加入Device.NAT.节点下:

+++ b/REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/standard/standardparams.c#include "../standard/tr181i2NATParams.h"
+  #include "../standard/tr181i2NATPortMappingParams.h"#include "../standard/tr181i2UPnPParams.h"+++ b/REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/standard/tr181i2NATParams.c#include "tr181i2NATParams.h"+extern TRxObjNode natPortMappingDesc[];TRxObjNode  natDesc[] = {{InterfaceSettingNumberOfEntries,{{tUnsigned,0,16}}, NULL,getNATInterfaceSettingNumberOfEntries,NULL,NULL},{PortMappingNumberOfEntries,{{tUnsigned,0,16}}, NULL,getNATPortMappingNumberOfEntries,NULL,NULL},
+    {PortMapping,{{tObject,0,0}},NULL,NULL,natPortMappingDesc,NULL},{NULL}};+++ b/REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/standard/tr181i2NATParams.h
@@ -60,5 +60,6 @@SVAR(InterfaceSettingNumberOfEntries);SVAR(PortMappingNumberOfEntries);
+SVAR(PortMapping);

2) 添加对应Add/Del object,Get/Set parameter API
NAT.PortMapping.对应的api添加在BcmBfcTr181i2NATPortMappingHandlers.cpp:

+++ b/REV/rbb_cm_src/Bfc/IpHelpers/TR069/tr69c/bcmBfcIf/BcmBfcTr181i2NATPortMappingHandlers.cpp+ * File Name  : BcmBfcTr181i2NATPortMappingHandlers.c
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "bcmtypes.h"
+#include "BcmBfcTr69SnmpApi.h"
+
+// Give these CPP functions C linkage
+extern "C"
+{
+
+#include "../inc/tr69cdefs.h"
+#include "BcmBfcTr69Log.h"
+
+extern char* strdup (char * str);
+
+TRX_STATUS getPortMappingRemoteHost(char **value)
+{
+    InstanceDesc *idp;
+
+    if ((idp = getCurrentInstanceDesc()) == NULL)
+        return TRX_ERR;
+
+    BfcTr69Api_GetFromSnmp(kOID_clabNATPortMappingRemoteHost, idp->hwUserData, value);
+
+    return TRX_OK;
+}
+
+TRX_STATUS setPortMappingRemoteHost(char *value)
+{
+    InstanceDesc *idp;
+
+    if ((idp = getCurrentInstanceDesc()) == NULL)
+        return TRX_ERR;
+    if(value == NULL)
+        return TRX_ERR;
+
+    if(BfcTr69Api_SnmpSetString(kOID_clabNATPortMappingRemoteHost, idp->hwUserData, value))
+        return TRX_OK;
+
+    return TRX_ERR;
+}+TRX_STATUS addPortMappingInstance(char **value)
+{
+    InstanceDesc *idp;
+
+    if ((idp = getNewInstanceDesc(getCurrentNode(), getCurrentInstanceDesc(), 0)))//添加新节点
+    {
+        idp->hwUserData = *value;
+        idp->instanceID = BfcTr69Api_SnmpToTr69Index(idp->hwUserData);//此api仅从snmp获取相应节点id,作用不详
+        return TRX_OK;
+    }
+    return TRX_ERR;
+}
+
+TRX_STATUS deletePortMappingInstance(char *value)
+{
+    TRxObjNode *n;
+    InstanceDesc *idp;
+    int id = atoi(value);
+
+    if ((idp = findInstanceDesc(n=getCurrentNode(), id)))
+    {
+        if (!deleteInstanceDesc(n, id))//删除节点,但不会通知snmp删除相应节点
+        {
+            return TRX_OK;
+        }
+    }
+    return TRX_ERR;
+}
+
+} // extern "C"
  1. 修改BfcTR69.mak
    因新增加了tr181i2NATPortMappingParams.c和BcmBfcTr181i2NATPortMappingHandlers.cpp文件,需要修改Makefile:
+++ b/REV/rbb_cm_src/Bfc/make/BfcTR69.makBFC_TR69C_OBJECTS += BcmBfcTr181i2NATHandlers.o
+BFC_TR69C_OBJECTS += BcmBfcTr181i2NATPortMappingHandlers.oBFC_TR69C_OBJECTS += BcmBfcTr181i2UPnPHandlers.oBFC_TR69C_OBJECTS += tr181i2NATParams.o
+BFC_TR69C_OBJECTS += tr181i2NATPortMappingParams.oBFC_TR69C_OBJECTS += tr181i2UPnPParams.o
  1. 增加SNMP对节点的实现
    依照目前的实现,TR069对节点/参数的操作,最终是通过SNMP Agent来达成。如果要新添加的节点/参数还未包含在SNMP Agent中,
    需先增加SNMP Agent对此节点/参数的实现,包括mib定义,节点的Add/Del。

5. 改善或问题

5.1 数据有效性检测

目前的实现中,tr69c/SOAPParser/RPCState.c char *doSetParameterValues(RPCAction *a)
有支持对参数名称/参数是否可写做检查,但对设置值的有效性检查只有简单的“对非字符型参数不可设置为空”做了检查,而未对数据范围等做检查。 改进的方法可扩展参数设置SetFunc()的返回类型,在SetFunc中检查数据有效性,如数据无效,返回9007.

5.2 增加/删除节点与SNMP同步

从目前已有实现节点中来看,当TR069 Add/Del一个节点时,并没有通知SNMP Add/Del相应节点。而TR069的Get/Set又依赖于SNMP,理论上,TR069和SNMP的Add/Del节点操作应该需要同步。

5.3 节点模板

构建节点数据结构的形式相对固定,设想可用模板程序根据节点信息自动生成。如从xml -> *.c

6. 总结

至此,博通SDK源码学习和技术知识分享到这里,如有问题,可以私信留言CSDN与我交流。


http://chatgpt.dhexx.cn/article/9jNuxp09.shtml

相关文章

TR069协议与商业应用1——概述(带目录索引)

声明&#xff1a;原创作品&#xff0c;严禁用于商业目的。 如有任何技术问题&#xff0c;欢迎和我交流&#xff1a;19826269205&#xff08;微信同号&#xff09;。 学习链接 免费学习 文章目录 1. 概述1.1 引言1. 2 TR069协议规范1.3 Easycwmp介绍1.4 TR069协议服务端测试工具…

TR069协议与商业应用4——TR069服务器测试工具

声明&#xff1a;原创作品&#xff0c;严禁用于商业目的。 如有任何技术问题&#xff0c;欢迎和我交流&#xff1a;19826269205&#xff08;微信同号&#xff09;。 腾讯课堂链接 B站免费视频部分 文章目录 1. openACS2. VigorACS3. XACS3.1 概述3.2. 设备接入3.3 管理端登录…

TR069-STUN

该模块依据TR-111实现STUN Server功能&#xff0c;基站设备&#xff08;CPE&#xff09;作为STUN Client&#xff0c;向STUN Server发送BINDING-REQUEST&#xff0c;CPE通过BINDING-RESPONSE响应消息获取设备是否在NAT之后&#xff0c;以及NAT类型。 如果设备在NAT之后&#xf…

TR069 测试

对于需要测试TR069的用户&#xff0c;可以使用一个免费的测试平台。 测试方法可以参考下面的流程&#xff1a; TR069智能云平台提供了完全免费的终端自动配置系统. 1.首先登录到http://39.106.195.193:9090/acscloud 注册您的用户 2.注册成功后&#xff0c;在您的设备端配置ACS…

TR069协议与商业应用5——TR069协议架构设计

声明&#xff1a;原创作品&#xff0c;严禁用于商业目的。 如有任何技术问题&#xff0c;欢迎和我交流&#xff1a;19826269205&#xff08;微信同号&#xff09;。 腾讯课堂链接 B站免费视频部分 文章目录 1. TR069&#xff08;CWMP&#xff09;程序设计思想2. 架构分析3. T…

TR069协议

TR069&#xff08; Technical Report 069&#xff09;全称是“ CPE广域网管理协议&#xff08;CWMP&#xff09;&#xff0c;用于远程终端管理&#xff0c;是 CPE 和 ACS之间沟通的通讯协定。CPE 可以借着这个协定完成服务开通、功能设定、档案上传下载、系统检测 等等初始化及…

TR069浅析

何为TR069&#xff1f; TR069, 全称“Technical Report 069”是由DSL Forum修订的一份技术规范&#xff0c;该规范是应用层的管理协议&#xff0c;命名为“CPE广域网管理协议”。 TR069定义了一套全新的网管体系结构&#xff0c;包括管理模型&#xff0c;交互接口及基本的管理…

TR069

tr069简介 全称是“用户终端设备广域网管理协议&#xff08;CWMP&#xff09; 用于远程终端管理&#xff0c;比如远程的配置阿什么的&#xff08;对远程的设备进行配置等管理&#xff09; 1. TR069协议网络架构 ACS为自动配置服务器&#xff0c;负责对终端设备CPE进行管理…

CWMP协议(TR069协议)学习

文中借鉴了一些大神的整理&#xff0c;后面会贴上链接&#xff0c;如侵删 目录 一、概念&#xff08;来自百度百科&#xff09; 二、网络元素 三、基本功能 四、CWMP协议栈 五、远程调用方法&#xff08;RPC&#xff09;详细的RPC方法定义请参见TR-069 六、inform的事件…

TR069是什么鬼

一&#xff0c;TR069是什么 1&#xff0c;概念 搞嵌入式或通信设备的&#xff0c;或多或少都会听说TR069。那他是什么鬼&#xff1f; TR069&#xff0c;就是CPE广域网管理协议。 它用于ACS和CPE之间的自动协商交互&#xff0c;能够实现终端的自动配置。&#xff08; ACS&#x…

TR069协议详解

一、关于TR069协议 TR069, 全称“Technical Report 069”是由DSL Forum&#xff08;一个非盈利性的全球行业联盟,致力于发展宽带网络范&#xff0c; 其成员包括通讯、设备、计算机、网络和服务提供商等行业的领先厂商&#xff0c;现已更名为“Broadband Forum”&#xff09;修…

TR-069协议介绍

一、概念 关于TR-069 ①协议命名 TR-069, 全称“Technical Report 069”是由DSL Forum&#xff08;一个非盈利性的全球行业联盟,致力于发展宽带网络范&#xff09;。其成员包括通讯、设备、计算机、网络和服务提供商等行业的领先厂商&#xff0c;现已更名为“Broadband Forum…

apache多个php版本fcgi,apache使用mod_proxy_fcgi实现多版本php共存

2019-08-02 apache使用mod_proxy_fcgi实现多版本php共存 首先配置php 安装你想用的php版本&#xff0c;找到你的php-fpm.conf配置文件 将listen换成你想要的端口 比如listen 127.0.0.1:9099 注意&#xff0c;如果你的fpm系变量配置文件在php-fpm.d的www.conf下面&#xff0c;请…

搭建nginx+fcgi并使用Holer实现内外网访问

1、环境搭建 本文使用了ubuntu20.04系统进行搭建。 1.1搭建nginx服务器 到Nginx的官网(http://nginx.org/en/download.html)上去下载最新的源码包&#xff0c;本文使用的是nginx-1.20.0.tar.gz &#xff08;1&#xff09;执行tar -zxvf nginx-1.20.0.tar.gz 命令解压文件到当…

web服务选择lighttpd,采用fcgi组件技术扩展处理业务层

目录 一、简介fcgi&#xff1a;web和web服务器间数据传输的桥梁... 2 二、源码编译配置ARM Lighttpd Fastcgi C.. 3 【1】交叉编译。源文件都从官网下载。 Fcgi lighttpd zlib. 3 【2】配置服务器server.document-root"/www" fastcgi.server "bin-path&quo…

Nginx运行FastCGI程序(ngx_http_fastcgi_module模块、fcgi库、spwan-fcgi进程管理器)

一、什么是CGI 通用网关接口&#xff08;Common Gateway Interface、CGI&#xff09;描述了客户端和服务器程序之间传输数据的一种标准&#xff0c;可以让一个客户端&#xff0c;从网页浏览器向执行在网络服务器上的程序请求数据。 CGI 独立于任何语言的&#xff0c;CGI 程序可…

php运行方式fpm fcgi,php如何从fpm-fcgi切换运行模式到cli

在使用一个php爬虫的时候提示一定要用cli环境 我查看了当前php版本信息如下: 我打印 PHP_SAPI 显示 fpm-fcgi 如何才能变成 cli 服务器环境是linux+nginx 补充:我能不能理解为cli一定是要命令行模式? 刚刚在命令行里测试了PHP_SAPI 输出了cli 问:能不能http模拟调用实现cli…

spwan-fcgi和fcgi 关系

spwan-fcgi: 举个例子&#xff1a; spawn-fcgi -a 127.0.0.1 -p 10000 -f ./login spwan-fcgi.c: main 函数 会执行参数解析过程 获得 ip 端口 和 执行文件的路径。 bind_socket 函数会执行 sockt 的 绑定监听过程&#xff0c; 函数 fcgi_spawn_connection 会通过系统调用d…

nginx+spawn-fcgi+demo+fcgi库函数

由于项目中用到了nginxFastCGI相关内容&#xff0c;所以这段时间学习了一下&#xff0c;顺便记下相关内容。 我是在远程工作机上实验的&#xff0c;有个缺点就是没有root权限&#xff0c;所以有些步骤我就没做了&#xff0c;比如make install&#xff08;nginx&#xff09;、添…

【fcgi-2.4.0】移植fcgi-2.4.0到armv7平台

源码下载链接 Index of /lookaside/extras/fcgi/fcgi-2.4.0.tar.gz/d15060a813b91383a9f3c66faf84867e (fedoraproject.org)https://src.fedoraproject.org/lookaside/extras/fcgi/fcgi-2.4.0.tar.gz/d15060a813b91383a9f3c66faf84867e/下载fcgi-2.4.0.tar.gz 解压源码 tar …