TR069相关介绍

背景介绍

随着信息产业的飞速发展,广域网上承载的业务种类和业务量在不断增大,规模也不断在扩大,大量的终端接入设备被广泛应用,需要对这些用户侧设备(CPE)进行有效的管理。

传统上,用户测设备无论是在最开始安装的时候,还是在后期运行中的业务配置变更,或是出现故障需要维护的时候,都需要通过管理接口对设备进行配置或是诊断。设备大都提供在LAN侧的管理配置接口和界面,因此传统的做法是运营商的维护人员上门进行安装或调试设备,通过LAN侧管理接口做一些设备配置或故障诊断的工作。但是,这种一对一的人工服务方式显然运行效率不高而且需要花费大量的人力。随着业务的开展,将会有大量的设备需要安置在用户家中,采用人工方式对这些设备进行维护和管理将会成为一个巨大的负担。而广域网的分支设备一般位置比较分散,Telnet、SSH、SNMP(简单网络管理协议)、远程Web登录等传统的远程管理方式具有很多的局限性:如多厂商的设备命令行、SNMP不一致,设备地址经常变化,终端位于NAT网关之后,SNMP基于UDP协议导致传输不可靠,不同设备的Web界面及配置方式各异,无法对大量的CPE进行批量自动化管理,等等。

在这样的背景下,DSL论坛(Digital Subscriber Line数字用户环路,现已更名为Broadband论坛)于2004年5月推出TR069协议,通常被称为用户终端设备广域网管理协议(CWMP,CPE WAN Management Protocol)。TR069协议和其他相关协议一起定义了一套全新的网管体系结构,包括管理模型、交互接口及基本的管理参数。

TR069主要功能

TR069协议描述了一种机制,建立ACS对CPE进行安全的自动化配置管理的框架,同时将它的CPE管理功能添加到这个框架中。目的是要实现以下多种功能,从而能够管理一个CPE或者CPE的集合。

  • 提供自动配置和动态服务: 该机制涉及到的参数既有一般规定的参数,也可以包含用户自定义的参数,为软件实现留有更大的自主空间。
  • 软件和固件镜像文件管理: CPE可以下载和上传文件,协议提供了检查软件或者固件的版本的方法,还可以对签名数据文件进行处理。在文件传输结束后,通知ACS,返回成功或者失败。
  • 诊断: TR069协议为CPE生成有效的诊断信息提供支持,ACS可以使用这些信息来诊断和解决连通或业务问题,同时提供执行预先定义好的诊断测试能力。
  • 告警: CPE主动发送事件报告来实现设备的实时告警。
  • 穿越NAT连接: TR069本身允许ACS管理NAT后的设备,但限制了ACS不能主动发起会话。TR111的机制则是对TR069这部分的补充,可以使ACS主动发起会话。初始安装时,CPE会自动寻找ACS服务器(CPE出厂时配置一个默认的URL地址,用户将该地址指向ACS服务器),建立连接后即可与ACS通信、下载配置等,可完美解决NAT网关之后的管理难题。

TR069协议介绍

TR-069网络架构

在TR069定义的管理模型中,主要包括两类逻辑设备:受管理的用户设备(CPE,Customer Premises Equipment)和自动配置服务器(ACS,Auto-Configuration Servers)。TR069的核心思想是通过定义一套ACS和CPE之间自动协商交互协议,实现终端的自动配置过程。下图描述了TR069协议在自动配置网络构架中的定位。ACS与CPE之间的接口为南向接口,ACS与第三方网管系统、业务管理系统之间的接口为北向接口。TR069协议主要定义了南向接口标准。

Positing in the Auto-Configuration Architecture

协议栈结构

协议层描述
CPE/ACS Management Application应用可以在CPE和ACS端分别实现CWMP协议,应用可以进行本地的定义,而不必是CWMP的一部分
RPC Methods在CWMP中定义的各种RPC方法,实现ACS与CPE之间的交互
SOAP编码远程过程调用的基于XML语法的标准,避免了与防火墙的冲突
HTTPHTTP 1.1
SSL/TLS标准的互联网传输层安全协议(可选)
TCP/IP标准的TCP/IP

- RPC:远程过程调用是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。TR069为CPE定义了9种基本RPC方法,6种可选RPC方法;为ACS定义了2种基本RPC方法,2种可选的的RPC方法(CPE方法,CPE设备支持,可以被ACS调用;ACS方法,ACS设备支持,可以被CPE调用)。此外,TR069还对RPC方法中使用的数据类型做了定义,只能使用SOAP定义的的数据类型中的部分。
- SOAP、HTTP:在Internet环境下实现分布式组件互操作有一个很重要的问题需要解决,那就是所谓的防火墙问题。大多数的防火墙都是基于端口扫描的,而基于CORBA的RPC使用的都不是常用的端口。如果不经过特殊配置,基于CORBA分布式组件调用将被作为恶意访问而拒绝。所以,TR069使用SOAP简单对象访问协议作为RPC报文的封装,利用标准HTTP协议来传送的方式。TR069规定将SOAP与HTTP绑定,以RPC方法调用来实现设备的管理。把SOAP绑定到HTTP提供了同时利用SOAP的分散性、灵活性的特点以及HTTP丰富的特征库的优点。在HTTP上传送SOAP并不是说SOAP会覆盖现有的HTTP语义,而是HTFP上的SOAP语义会自然的映射到HTTP语义。在使用HTTP作为绑定协议时,一个RPC调用自然地映射到一个HTTP请求,RPC应答同样映射到HTTP应答。一般情况下,一个完整的SOAP包的结构包括:一个信封(Envelope)、一个头部(Header)(可选)、一个SOAP体(Body)(必需)。SOAP协议中未说明一个SOAP包中可以包含多个Envelope,TR069采用了多个信封机制,这样增加了一次交换所带的信息量,减少了网络设备之间的数据交换次数。
SSL:SSL协议指定了一种在应用程序协议和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器人证、消息完整性以及可选的客户机人证,确保数据在传送中不被改变。TR069协议实现的是远程管理,安全的信息交换是必需的。采用128bit加密算法、数字认证机制,实现CPE和ACS之间的安全信息交换

业务流程

软件架构以及协议的具体解析过程

TR-069_stack_internal

通信过程

我们来看一个tr069协议完整的通信过程.
TR-069_comm

一次GetParameterValues首先由CPE主动发送INFORM消息.

POST /openacs/acs HTTP/1.1  
Host: 192.168.7.1:9090  
User-Agent: BCM_TR69_CPE_04_00  
Connection: keep-alive  
SOAPAction:  
Content-Type: text/xml  
Content-Length: 2452

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cwmp="urn:dslforum-org:cwmp-1-0">  
  <SOAP-ENV:Header> 
    <cwmp:ID SOAP-ENV:mustUnderstand="1">2044897763</cwmp:ID> 
  </SOAP-ENV:Header>  
  <SOAP-ENV:Body> 
    <cwmp:Inform> 
      <DeviceId> 
        <Manufacturer>Bellmann</Manufacturer>  
        <OUI>001F8F</OUI>  
        <ProductClass>HA930e</ProductClass>  
        <SerialNumber>27FD6001F8F748602</SerialNumber> 
      </DeviceId>  
      <Event SOAP-ENC:arrayType="cwmp:EventStruct[1]"> 
        <EventStruct> 
          <EventCode>8 DIAGNOSTICS COMPLETE</EventCode>  
          <CommandKey/> 
        </EventStruct> 
      </Event>  
      <MaxEnvelopes>1</MaxEnvelopes>  
      <CurrentTime>2012-12-10T13:21:37+00:00</CurrentTime>  
      <RetryCount>0</RetryCount>  
      <ParameterList SOAP-ENC:arrayType="cwmp:ParameterValueStruct[0008]"> 
        <ParameterValueStruct> 
          <Name>InternetGatewayDevice.DeviceSummary</Name>  
          <Value xsi:type="xsd:string">InternetGatewayDevice:1.1[](Baseline:1, EthernetLAN:1, USBLAN:1, WiFiLAN:1, EthernetWAN:1, Time:1, IPPing:1, DeviceAssociation:1), VoiceService:1.0[1](Endpoint:1, SIPEndpoint:1)</Value> 
        </ParameterValueStruct>  
        <ParameterValueStruct> 
          <Name>InternetGatewayDevice.DeviceInfo.SpecVersion</Name>  
          <Value xsi:type="xsd:string">1.0</Value> 
        </ParameterValueStruct>  
        <ParameterValueStruct> 
          <Name>InternetGatewayDevice.DeviceInfo.HardwareVersion</Name>  
          <Value xsi:type="xsd:string">HA930e_N_V2.0</Value> 
        </ParameterValueStruct>  
        <ParameterValueStruct> 
          <Name>InternetGatewayDevice.DeviceInfo.SoftwareVersion</Name>  
          <Value xsi:type="xsd:string">HA930e_N_V1.00S</Value> 
        </ParameterValueStruct>  
        <ParameterValueStruct> 
          <Name>InternetGatewayDevice.DeviceInfo.ProvisioningCode</Name>  
          <Value xsi:type="xsd:string"/> 
        </ParameterValueStruct>  
        <ParameterValueStruct> 
          <Name>InternetGatewayDevice.ManagementServer.ConnectionRequestURL</Name>  
          <Value xsi:type="xsd:string">http://192.168.7.143:30005/</Value> 
        </ParameterValueStruct>  
        <ParameterValueStruct> 
          <Name>InternetGatewayDevice.ManagementServer.ParameterKey</Name>  
          <Value xsi:type="xsd:string">unsetCommandKey</Value> 
        </ParameterValueStruct>  
        <ParameterValueStruct> 
          <Name>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.ExternalIPAddress</Name>  
          <Value xsi:type="xsd:string">192.168.7.143</Value> 
        </ParameterValueStruct> 
      </ParameterList> 
    </cwmp:Inform> 
  </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>

ACS端回应INFORM Response.

HTTP/1.1 200 OK  
Server: Apache-Coyote/1.1  
X-Powered-By: Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181439)/JBossWeb-2.0  
Set-Cookie: JSESSIONID=5CEB426075A42489AC3A7E6BAE004C61; Path=/  
Content-Type: text/xml  
Content-Length: 574  
Date: Sat, 01 Nov 2014 07:53:48 GMT

<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Header>
    <cwmp:ID SOAP-ENV:mustUnderstand="1">2044897763</cwmp:ID>
    <cwmp:NoMoreRequests>0</cwmp:NoMoreRequests>
  </SOAP-ENV:Header>

  <SOAP-ENV:Body>
    <cwmp:InformResponse xmlns:cwmp="urn:dslforum-org:cwmp-1-0"><MaxEnvelopes>1</MaxEnvelopes>
    </cwmp:InformResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

然后CPE端回应一个空的HTTP POST请求.

HTTP/1.1  
Host: 192.168.7.1:9090  
User-Agent: BCM_TR69_CPE_04_00  
Connection: keep-alive  
SOAPAction:  
Cookie: JSESSIONID=5CEB426075A42489AC3A7E6BAE004C61  
Content-Type: text/xml  
Content-Length: 0  

下面开始进入RPC阶段.由ACS发送RPC REQUEST,这里就是GetParameterValues, 目的是获得InternetGatewayDevice.DeviceSummary的值.

HTTP/1.1 200 OK  
Server: Apache-Coyote/1.1  
X-Powered-By: Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181439)/JBossWeb-2.0  
Content-Type: text/xml  
Content-Length: 722  
Date: Sat, 01 Nov 2014 07:53:48 GMT

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Header>
    <cwmp:ID SOAP-ENV:mustUnderstand="1">ID:intrnl.unset.id.GetParameterValues1414832028729.539118694</cwmp:ID>
    <cwmp:NoMoreRequests>0</cwmp:NoMoreRequests>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <cwmp:GetParameterValues>
      <ParameterNames SOAP-ENC:arrayType="xsd:string[1]">
        <string>InternetGatewayDevice.DeviceSummary</string>
      </ParameterNames>
    </cwmp:GetParameterValues>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

CPE调用后台的脚本查找到InternetGatewayDevice.DeviceSummary的值, 然后回应ACS.

POST /openacs/acs HTTP/1.1  
Host: 192.168.7.1:9090  
User-Agent: BCM_TR69_CPE_04_00  
Connection: keep-alive  
SOAPAction:  
Cookie: JSESSIONID=5CEB426075A42489AC3A7E6BAE004C61  
Content-Type: text/xml  
Content-Length: 941

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cwmp="urn:dslforum-org:cwmp-1-0">  
  <SOAP-ENV:Header> 
    <cwmp:ID SOAP-ENV:mustUnderstand="1">ID:intrnl.unset.id.GetParameterValues1414832028729.539118694</cwmp:ID> 
  </SOAP-ENV:Header>  
  <SOAP-ENV:Body> 
    <cwmp:GetParameterValuesResponse> 
      <ParameterList SOAP-ENC:arrayType="cwmp:ParameterValueStruct[0001]"> 
        <ParameterValueStruct> 
          <Name>InternetGatewayDevice.DeviceSummary</Name>  
          <Value xsi:type="xsd:string">InternetGatewayDevice:1.1[](Baseline:1, EthernetLAN:1, USBLAN:1, WiFiLAN:1, EthernetWAN:1, Time:1, IPPing:1, DeviceAssociation:1), VoiceService:1.0[1](Endpoint:1, SIPEndpoint:1)</Value> 
        </ParameterValueStruct> 
      </ParameterList> 
    </cwmp:GetParameterValuesResponse> 
  </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>

这个值是:InternetGatewayDevice:1.1[](Baseline:1, EthernetLAN:1, USBLAN:1, WiFiLAN:1, EthernetWAN:1, Time:1, IPPing:1, DeviceAssociation:1), VoiceService:1.0[1](Endpoint:1, SIPEndpoint:1.

最后, ACS结束这次会话.

HTTP/1.1 204 No Content  
Server: Apache-Coyote/1.1  
X-Powered-By: Servlet 2.4; JBoss-4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181439)/JBossWeb-2.0  
Date: Sat, 01 Nov 2014 07:53:53 GMT

整个通信过程我们需要注意以下几点.

什么时候Inform以及EventCode

每次Inform上报代表一次会话的开始, 因此Inform的时机很重要.我们至少需要实现:

  • CPE初次安装使用的时候. EventCode为BOOTSTRAP.
  • 上电或者重启的时候. EventCode为BOOT.
  • 每一个PeriodicInformInterval周期到来的时候. EventCode为PERIODIC.
  • ACS通过CPE的Httpd服务向CPE请求CONNECTION REQUEST的时候. EventCode为CONNECTION REQUEST.
  • Monitor的值发生改变的时候. EventCode要包含VALUE CHANGE.

更详细的支持需要查看手册.

Cookie的作用

我们注意到Inform完成后, ACS和CPE使用同一个Cookie通信, 直到本次会话结束. 事实上由于HTTP协议是无状态协议, 为了能够建立通信过程的顺序,维持状态机的正常工作,两边都是通过Cookie来进行的.

XML节点的type

我们注意到在SOAP消息中,XML节点是包含类别的.比如xsi:type=”xsd:string”, 说明这个Value值是String类型. 虽然在某些ACS上即使去掉这些值也能工作, 但是不同的ACS对参数的检查严格程度不一样, 建议一定要加上.


RPC方法

我们上面的例子中提到了RPC方法, 并拿GetParameterValues来示例, tr069协议规定了CPE可以支持的方法.

tr069 rpc method

其中Optional为可选的, Required为必须实现的, 不过这个只能作为参考, 还得看各家设备商的标准.

RPC统一了设备的接口, 那RPC所操作的数据要如何统一呢, Tr069因此提出了Datamodel.

DataModel

Tr069把很多不同的设备都抽象出了设备模型, 挂到公共的设备树上面, 根节点叫做InternetGatewayDevice, 利用统一出来的RPC接口, 我们只需要操作这些设备树上的节点的Value以及Atribute, 就可以改变盒子的配置.

其实我觉得这样的设计有些繁琐, 我来举个例子,我们看一下如何利用协议来测试设备的Ping功能.

直观来想, 如果我们要测试CPE是否能够Ping得通其他的设备地址, 一般我们会直接用ssh/telnet/UART登录上这个设备, 然后直接敲击ping命令.在tr069中我们得分两部进行, 首先我们通过SetParameterValues设置Ping参数.

itms ping SetParamterValues

然后再用GetParameterValues查.

itms ping GetParameterValues

不过确实也想不出更好的办法, 至于说为啥要用XML这么重量级的协议格式, 我的解释是XML足够成熟, 可以很方便的定义Schema文件,方便验证.另外tr069协议出现的事情JSON格式并没有流行起来, 恰恰是XML的年代.


OpenSource

ACS服务器

  • OpenACS :一直我都是使用它测试CPE客户端的,但是可惜作者把它删除了, 有人Fork它的项目, 重命名为Libreacs.
  • Genieacs: 用Coffee Script写的可以尝试一下.
  • Fusion ACS: 作者自己称之为I believe this is the most complete open-source (MIT-license) ACS available, with web-interface, web-services interface, TR-111 support, etc.

CPE客户端

  • Easycwmp: 它从freecwmp演化而来.说自己是fully conform with the TR069 CWMP standard, 但是脚本部分居然用Shell写的又臭又长.
  • Fishcorecpe: 这不是一个开源项目, 但在国内可以搜到一些关于它的测试, 读者可以从我这里下载一份副本, 方便你测试CPE的行为.
  • Evcpe: 由于google code要关闭了, 我把它移到了github上面.
  • CWMP Client
  • Netcwmp

在github上cwmp的客户端有很多,读者可以自行搜索,这里推荐的是一些典型的,以及我自己参考的一些.

总结

用Lua开发主要是处于脚本语言可以方便的处理文本,而Lua又是这里面最轻量的,在性能关键的地方,也可以用C很好的优化, 目前来看效果还不错.

tr069最大的工作量在于仔细实现每一个节点上具体的业务逻辑以及能够通过不同ACS平台的测试.相比较与SNMP,TR069在安全性,可配置性,兼容性等等方面都做的更好,应该相信它的应用前景会更广.

本文只是简要的把自己能够想的起来的一些东西记载下来,还有很多方面没有提到,如果读者有什么问题,欢迎通过评论提出,一起探讨~

参考

BroadBand 规范都在这里
tr069 central 一个写Tr069的blogger.

(全文完)

更多
- fishcorecpe与openacs对接测试报告
- More Details about TR069 CPE WAN Management Protocol


本文转载于: https://forestgump.me/2015/03/14/about-tr069/
  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值