tr069

说明:因为个人能力有限,如有理解错误的地方,恳请大佬们指正呀!

什么是tr069?

在接触网络知识的时候,我们最常用的一个词语就是协议(protocol),tr069就是一种协议,它规定了网络服务器,和设备之间的交互规则。

而且Tr069协议是在soap协议的基础之上的,就是说客户端和服务器发送报文的格式是满足soap协议的,如果有一方不满足,那么另一方很有可能解析不出正确的报文信息。

tr069相关术语

我们说tr069像其他网管一样,通过服务器操作客户端设备。通常情况下,我们称服务器为ACS(Auto-Configuration Server),称设备为CPE(Customer Premise Equipment),这些设备一般都是与运营商业务相关的,比如家庭网关,机顶盒和IP电话终端等等。这些设备会有一系列统一的,或者自定义的参数,我们可以通过服务器来配置参数,诊断设备的问题,对设备进行升级操作等等。这些通过服务器来操作设备的过程称为远程过程调用,即RPC(remote procedure call)。我们把一次RFC调用称为一次会话,即Session。

tr069协议架构

tr069协议在网络层使用IP协议;传输层使用TCP,可以使用SSL/TLS在本层加密;应用层使用http加soap;再上层就是客户端和服务器自己实现的RFC方法,这些RFC方法的实现规则不做要求,但是调用应当符合规定。当然不一定完全符合标准规定,只要服务器和客户端的双方意愿一致即可。但是我们鼓励服从标准规则,这样你的设备换到其他的服务器上仍然能正常使用。

RPC方法

简介:远程过程调用(RPC)机制被用于CPE设备和自动配置服务器(ACS)之间的双向通信。包括由ACS发起并发送给CPE的方法,及由CPE发起并发送给ACS的方法。

数据类型

节点的数据类型包括:string,int,unsignedInt,boolean,datetime,base64(base64编码的二进制),any(任意类型)

类型 描述
string(字符串) 本规范列示的字符串,最大允许长度可以用格式字符串(N)表示,N是以字符计的最大长度。对所有字符串,其最大长度要么明确表明,要么隐含在构成该字符串的元素大小中。对内容是枚举类型的字符串,枚举的最大值决定了字符串的最大长度。如果没有明确指明最大长度或者不是枚举类型的字符串,默认最大长度为16个字符。如果字符串型动作参数超过了指定的最大值,会产生一个“无效参数(Invalid arguments)”的错误应答。
int (整数型) 从–2147483648(含)到+2147483647(含)范围内的整数。对列示的一些整数型,格式int[Min:Max]表明取值范围,Min和Max值包含在内。如果没有任一Min或Max,表明没有限值。
unsignedInt无符号整数型 无符号整数,取值范围为0(含)到4294967295(含)。对列示的一些无符号整数型,格式unsignedInt[Min:Max]表明取值范围,Min和Max值包含在内。如果没有任一Min或Max,表明没有限值。
boolean(布尔型) 布尔型,1 = true(真),0 = false(假)。
dataTime(日期时间型) ISO 8601 data-time类型的子集,由SOAP的dateTime型定义。除非明确指明,所有的时间表示为UTC(全球统一时间)。如果CPE不知道绝对时间,它应当使用从启动后消逝的时间。比如,启动后的2天3小时4分5秒将表示为0000-00-02T03:04:05。
base64 Base64编码的二进制。最大允许长度可以用格式base64(N)来表示,N是指在Base64编码后字符的最大长度。
any (任意) 某元素包含该表中列示的任意类型。根据SOAP规范,使用这一类型的元素必须包含一个类型属性,来表明该元素的真正类型。例如:

在本规范中定义的方法可能使用结构和数组(在某些情况下还可能使用复合类型)。数组元素用数据类型后加方框号表示。数组最大长度的说明表示在方框号中。如果最大长度没有说明,除非特别指明,接收方能接受的元素数目没有固定的要求。如果接收方收到的请求含超出其处理能力的过大数组的请求,应当产生“Resources exceeded”错误代码。


通用方法

A.1.1.1 GetRPCMethods

这一方法可用于CPE或ACS来发现另一方所支持的方法集。方法集列表可以包括标准方法(在本规范及后续版本中定义),也可以包括厂商自定制方法。接收该方法的应答方必须忽略掉任何不能解释的方法。

厂商定制方法必须采用X__MethodName的格式,其中是唯一厂商标识符,可以是一个OUI或域名。OUI(organizationally unique identifier组织的唯一标识)在[9]中定义,必须格式化为6个十六进制字符的OUI,所有字母要大写,要包括所有前置0。域名必须是大写,并且将每个点(“.”)替换为连字符或下划线。例如:X_00D09E_MyMethod,X_ACME_COM_MyMethod。

该方法的调用参数在表7中定义。应答参数在表8中定义。

表7 GetPRCMethods参数

参数 类型 描述
- Void 本方法没有调用参数。

表8 GetPRCMethodsResponse参数

参数 类型 描述
MethodList String(64)[] 字符串数组,包含接收方支持的每一个PRC方法名称。例如,CPE仅实现了本规范本版本所定义的基本方法,则CPE会返回如下列表给ACS:”GetRPCMethods””SetParameterValues””GetParameterValues””GetParameterNames””SetParameterAttributes””GetParameterAttributes””AddObject””DeleteObject””Reboot””Download”

针对该方法定义的来自CPE应答的错误代码有:9001,9002。

针对该方法定义的来自ACS应答的错误代码有:8001,8002,8005。

CPE方法:

SetParameterValues

服务器可用此方法来修改CPE的一个或多个参数。此方法的调用参数在表9中定义。应答参数在表10中定义。

表9 SetParameterValues参数

参数 类型 描述
ParameterList ParameterValueStruct[] 表11中所定义的name-value值对数组。对每个name-value值对,CPE需要将指定名称的参数值设置为指定值。
ParameterKey String(32) 设置ParameterKey参数值。该值可以用于服务器,来识别参数更新,或者让其为空。

表10 SetParameterValuesResponse参数

参数 类型 描述
Status int[0:1] 对该方法的成功应答返回一个整数型的枚举值定义如下:0 = 参数的改动已经验证并应用。1 = 参数的改动已经验证并提交,只是尚未应用(比如,在新的参数值应用前需要进行重新启动)。

在成功接受到SetParameterValues PRC后,CPE必须立即和自动应用每个指定的参数的变化值。参数表中参数的顺序无关紧——CPE对改动值的应用必须与它们列示的顺序独立。只有当新的参数值已经成功应用后,才能给该RPC回复一个成功应答。如果CPE在应用新参数值前需要重新启动,CPE必须在进行重新启动前应答,即在参数值应用之前应答。在这种情况下,应答时必须确认所有请求已经完成,并且新值已经正确地保存下来,一旦重新启动后,这些值一定会立即得到应用。

ParameterValueStruct结构在表11中定义。

表11 ParameterValueStruct定义

名称 类型 描述
Name string(256) 这是参数的名称。
Value Any 这是参数需要设置的值。

如果有一个或多个参数错误,对该方法的错误应答必须为每个错误的参数包括一个SetParameterValuesFault元素。在此情况下,整个错误应答的首要错误代码必须是无效参数(9003)。

本方法定义的错误代码有:9001,9002,9003,9004,9005,9006,9007,9008。

GetParameterValues

这一方法可用于服务器来获取一个或多个CPE参数的值。该方法的调用参数在表12中定义,应答参数在表13中定义。

表12 GetParameterValues参数

参数 类型 描述
ParameterName string(256)[] 字符串数组,每个代表所请求的参数的名称。如果参数名是以部分路径名的方式出现,则该请求需被解释为请求返回命名层次中共用相同前缀的该分支的所有参数。部分路径名必须在层次的最后一个节点名称后面以“.”(点)结尾。空字符串代表整个层次名称的顶部。下面是完整参数名称的例子:InternetGatewayDevice.DeviceInfo.SerialNumber下面是部分路径名称的例子:InternetGatewayDevice.DeviceInfo.

表13 GetParameterValuesResponse参数

参数 类型 描述
ParameterList ParameterValueStruct[] Name-value对的数组,在表11中定义。包括每个被请求参数的名称和值。

该方法定义了如下错误代码:9001,9002,9003,9004,9005。如果错误是由无效的参数名称引起,则必须使用Invalid Parameter Name错误代码(9005)而不是用更泛化的Invalid Argument错误代码(9003)。

GetParameterNames

本方法可以由服务器用来发现某一CPE上的可访问的参数。本方法的调用参数列示在表14中,应答参数列示在表15中。

表14 GetParameterNames参数

参数 类型 描述
ParameterPath string(256) 包括一个完整参数名或部分路径名的字符串,代表名称层次的一个子集。空字符串代表名称空间的顶层。部分路径名必须在层次中的最后一个节点名称后面以“.”(点)结尾。下面是完整参数名的例子:InternetGatewayDevice.DeviceInfo.SerialNumber下面是部分路径名的一个例子:InternetGatewayDevice.DeviceInfo.
NextLevel boolean 如果值为false,则应答将列出所有以ParameterPath参数指定字符串开始的参数的完整路径名。如果值为true,则应答只列出指定的ParameterPath下一层的部分路径名。例如,如果ParameterPath是“InternetGatewayDevice.LANDevice.”,应答可能列出“InternetGatewayDevice.LANDevice.1. ”和“InternetGatewayDevice.LANDevice.2. ”,而不会列出在该层次下面的所有参数

表15 GetParameterNamesResponse参数

参数 类型 描述
ParameterList ParameterInfoStruct[] 结构数组,每个包含一个参数的名称和其它信息,见表16的定义。当NextLevel是false时,这一方法返回所有名称以ParameterPath参数指定的字符串开头的所有可访问的参数及其信息。如果ParameterPath参数是一个空字符串,则将返回该CPE上所有可访问的参数名称。当NextLevel是true时,这一列表包括以ParameterPath指明路径的下一层的所有部分路径名。

表16 ParameterInfoStruct定义

名称 类型 描述
Name string(256) 这是参数的名称或部分路径名。
Writable boolean 是否该参数值能够用SetParameterValues方法来覆盖。如果因NextLevel值为true,该名称是一个部分路径名,则表明是否AddObject和DeleteObject可以被用于该层次来移除该实例或增加其它的实例。

本方法定义的错误代码有:9001,9002,9003,9005。如果错误是由无效的参数名称引起,则必须使用Invalid Parameter Name错误代码(9005)而不是用更泛化的Invalid Argument错误代码(9003)。

SetParameterAttributes

本方法可以由服务器用来更改CPE上的一个或更多参数的属性。本方法的调用参数列示在表17中,应答参数列示在表18中。

表17 SetParameterAttributes参数

参数 类型 描述
ParameterList SetParameterAttributesStruct[] 列出用于更改一组参数的属性改动值。该数组中的每项条目是一个SetParameterAttributesStruct结构,在表19中定义。

表18 SetParameterAttributesResponse参数

参数 类型 描述
- void 该方法的应答没有参数。

表19 SetParameterAttributesStruct定义

名称 类型 描述
Name string(256) 这是应用新属性的参数的名称。另一种方式是,该名称可以是一个部分路径名,表明新的属性应当应用于命名层次中该节点下的所有参数。部分路径名必须在层次中的最后一个节点名称后面以“.”(点)结尾。空字符串代表名称空间的顶层。下面是完整参数名的例子:InternetGatewayDevice.DeviceInfo.SerialNumber下面是部分路径名的一个例子:InternetGatewayDevice.DeviceInfo.
NotificationChange boolean 如果为true,Notification的值将替换该参数或参数组的当前notification的设置。如果是false,则不作任何notification设置的改动。
Notification int[0:2] 指定是否CPE应当将指定的该(或多个)参数的变化值放到其Inform报文中,以及是否当指定参数的值发生变化时,CPE应当发起一个到ACS的会话。值的定义如下:0 = Notification关闭。 CPE不必通过ACS指定参数的变化。1 = 被动式Notification。当指定的参数值变化时,CPE必须在下一次建立与ACS的会话时,将这一新值包含在Inform报文的ParameterList中。2 = 主动式Notification。一旦指定参数的值发生变化,CPE必须发起与ACS的会话,将新值包含在相应的Inform报文的ParameterList中。因非零的Notification设置引起发送的Inform报文中参数发生变化,事件代码“4 VALUE CHANGE”必须包括在事件列表中。如果试图给一个不适合设置notification值的参数(比如一个持续变化的统计值)设置notification值,CPE可以返回一个“notification request rejected”错误。
AccessListChange boolean 如果为true,AccessList的值会替换该参数或参数组的当前access list值。如果为false,access list不作改动。
AccessList String(64)[] 零个或多个实体的数组,该实体对指定的参数有写权限。如果数组中不包含条目,则只允许ACS有写权限。目前,只定义了一类实体可以包含在该列表中:“Subscriber” 指明由LAN上的Subscriber控制的设备拥有写权限。比如通过LAN端的DSL CPE配置协议或通过UPnP。默认情况下,在ACS对access list作改动前,上述的所有实体应当被赋予写访问权。

本方法定义的错误代码有:9001,9002,9003,9004,9005,9009。如果错误是由无效的参数名称引起,则必须使用Invalid Parameter Name错误代码(9005)而不是用更泛化的Invalid Argument错误代码(9003)。

GetParameterAttributes

本方法可以由服务器用来读取CPE上的一个或更多参数的属性。本方法的调用参数在表20中定义,应答参数在表21中定义。

表20 GetParameterAttributes参数

参数 类型 描述
ParameterNames string(256)[] 字符串数组,每一条对应所请求的参数的名称。如果参数名是以部分路径名的方式出现,则该请求需被解释为请求返回命名层次中共用相同前缀的该分支的所有参数。部分路径名必须在层次的最后一个节点名称后面以“.”(点)结尾。空字符串代表整个层次名称的顶部。下面是完整参数名称的例子:InternetGatewayDevice.DeviceInfo.SerialNumber下面是部分路径名称的例子:InternetGatewayDevice.DeviceInfo.

表21 GetParameterAttributesResponse参数

参数 类型 描述
ParameterList ParameterAttributeStruct[] 列示指定的参数集的access control信息。该数组中的每一条目是一个ParameterAcessStruct结构,在表22中定义。

表22 –**ParameterAttributesStruct定义**

名称 类型 描述
Name string(256) 这是给出属性值的参数名称。
Notification int[0:2] 指定是否CPE应当将指定的该(或多个)参数的变化值放到其Inform报文中,以及是否当指定参数的值发生变化时,CPE应当发起一个到ACS的会话。值的定义如下:0 = Notification关闭。 CPE不必通过ACS指定参数的变化。1 = 被动式Notification。当指定的参数值变化时,CPE必须在下一次建立与ACS的会话时,将这一新值包含在Inform报文的ParameterList中。2 = 主动式Notification。一旦指定参数的值发生变化,CPE必须发起与ACS的会话,将新值包含在相应的Inform报文的ParameterList中。
AccessList string(64)[] 零个或多个实体的数组,该实体对指定的参数有写权限。如果数组中不包含条目,则只允许ACS有写权限。目前,只定义了一类实体可以包含在该列表中:“Subscriber” 指明由LAN上的Subscriber控制的设备拥有写权限。比如通过LAN端的DSL CPE配置协议或通过UPnP。

本方法定义的错误代码有:9001,9002,9003,9004,9005。如果错误是由无效的参数名称引起,则必须使用Invalid Parameter Name错误代码(9005)而不是用更泛化的Invalid Argument错误代码(9003)。

AddObject

这一方法可以由服务器使用来建立一个多实例对象(multi-instance object)的新实例。多实例对象是指参数集合及/或其它定义了多个实例的对象。该方法调用的参数是需要建立新实例的一组对象的路径名,例如:

​ Top.Group.Object.

该路径名不包括要建立的对象的实例编号。实例编号由CPE指定,并在应答中返回。一旦指定,该对象的实例编号不得更改,并一直使用直到该对象被DeleteObject方法删除。在建立后,该对象的参数或其子对象用路径名及附加其后的实例编号来引用。例如,如果AddObject方法返回实例编号为2,则该实例中的一个参数可以用这样的路径名来引用:

​ Top.Group.Object.2.Parameter

使用该方法建立了对象后,该对象包含的参数被设置为默认值,其相关属性值设置如下:

l Notification设置为0(Notification关闭)

l AccessList包括所有定义的实体

Internet网关设备,可以使用该方法的特定对象集合列示在附录B中。本方法的调用参数在表23中定义,应答参数在表24中定义。

表23 AddObject参数

参数 类型 描述
objectName string(256) 要建立新实例的对象集合的路径名称。路径名必须在该对象的层次名称的最后节点后加上“.”(点)结尾。
ParameterKey string(32) 需要设置的ParameterKey参数的值。该参数由服务器决定,并可以为空。

表24 AddObjectResponse参数

参数 类型 描述
InstanceNumber unsignedInt[1:] 新建对象的实例号码。在对象建立后,可以在路径名中使用该实例号码来引用该对象的参数或子对象。由CPE指定的实例号码是任意的,并且与后续的AddObject调用分配的号码无需连续。CPE不应当将曾经分配出去的现已删除的对象使用过的号码再分配给新的实例。CPE应当在耗尽某指定对象的整个整数值空间后再重用实例号码。
Status int[0:1] 对该方法的成功应答返回一个整数型的枚举值定义如下:0 = 对象已经建立。1 = 对象的建立已经验证并提交,只是尚未应用(比如,增加新对象前需要进行重新启动)。

该方法错误代码的定义有:9001,9002,9003,9004,9005。

DeleteObject

本方法用于删除一个对象的特定实例。该方法调用的参数值是包含实例号码的对象实例的路径名称。例如:

​ Top.Group.Object.2.

如果该方法的调用成功,则指定对象的实例无法再访问,CPE可以丢弃与该实例包含的任意参数或子对象相关的状态。

当对象实例被删除后,与该实例号相关的同一对象集合的其它实例号码不变。这样,在同一个集合中,对象实例的实例号码可能是不连续的。

Internet网关设备,可以使用该方法的特定的对象集合列示在附录B中。该方法的调用参数在表25中定义,应答参数表26中定义。

表25 DeleteObject参数

参数 类型 描述
ObjectName string(256) 欲删除的对象实例的路径名。路径名必须以对象的实例号码后加“.”(点)来结尾。
ParameterKey string(32) 设置ParameterKey参数的值。该参数的值由服务器决定,并可以为空。

表26 DeleteObjectResponse参数

参数 类型 描述
Staus int[0:1] 对该方法的成功应答返回一个整数型的枚举值定义如下:0 = 对象已经删除。1 = 对象的删除已经验证并提交,只是尚未应用(比如,将删除对象前需要进行重新启动)。

该方法错误代码的定义有:9001,9002,9003,9005。

Download

本方法可以由服务器使用来指示CPE在指定的位置下载特定的文件。该方法的调用参数在表27中定义,应答参数在表28中定义。

表27 Download参数

参数 类型 描述
CommandKey string(32) CPE用来指向特定下载的字符串。该参数在方法TransferComplete和GetQueuedTransfers中引用。
FileType string(64) 一个整数,其后是一个空格,再其后是一个文件类型说明。目前FileType参数仅定义了以下值:”1 Firmware Upgrade Image””2 Web Content””3 Vendor Configuration File”下列格式用于定义唯一的厂商自定义文件类型:”X “其中,用6位十六进制数字的在[9]中定义的OUI(组织唯一标识)代替,其中所有字母用大写,包括所有前置零。
URL string(256) URL说明源文件的位置。必须支持HTTP传输。可以支持其它可选的传输方式,如2.3.2节的定义。
Username string(256) CPE用于认证文件服务器的用户名。如果不需要认证,则该字符串设置为空串。
Password string(256) CPE用于认证文件服务器的密码。如果不需要认证,则该字符串设置为空串。
FileSize unsignedInt 以字节为单位的要传输文件的大小。CPE可以利用该值来判断它是否有足够的空间来下载该文件,或者它必须释放更多空间以为指定文件腾出空间。
TargetFileName string(256) 在目标文件系统中应使用的文件名。如果目标文件名可以从下载的文件本身来提取,或可以从URL参数中提取,或不需要目标文件名,这一参数的值可以为空。如果说明了该值,但是目标文件名也由其它来源指明了(比如是从下载的文件中自动提取的),这一参数应当被忽略。如果目标文件名已经使用,下载的文件将替换任何已经使用的相同名称的文件(是否CPE将被替换的文件存档由CPE自主决定)。
DelaySeconds unsignedInt 从本方法被调用到CPE被要求开始下载之间的时间间隔。如果值为零表明不需要延迟。如果是非零值,则下载不应当使用与该请求相同的事务会话。
SuccessURL string(256) 在能应用的情况下,本参数包含在下载成功完成后,CPE应当将用户的浏览器重定向到哪一URL。这一URL值可能包含服务器所需要的CGI参数(比如,来维护会话的状态)。只有当下载是由基于浏览器的用户交互式发起,并且CPE支持基于下载结果选择性重定向的能力时才能使用。在不需要这样的URL的情况下,这一参数应当为空。
FailureURL string(256) 在能应用的情况下,本参数包含在下载未成功完成后,CPE应当将用户的浏览器重定向到哪一URL。这一URL值可能包含服务器所需要的CGI参数(比如,来维护会话的状态)。只有当下载是由基于浏览器的用户交互式发起,并且CPE支持基于下载结果选择性重定向的能力时才能使用。在不需要这样的URL的情况下,这一参数应当为空。

表28 DownloadResponse参数

参数 类型 描述
Staus int[0:1] 对该方法的成功应答返回一个整数型的枚举值定义如下:0 = 下载已结束并已应用。1 = 下载还没有结束(比如,CPE需要重新启动后才能执行文件的下载)。如果该参数的值非零,则CPE必须在本会话的后续时间,或者在其后的会话中,调用TransferComplete方法来说明本次下载的完成状态(成功或者失败)。
StartTime dateTime 下载开始的日期和时间(UTC)。只有在下载结束后该值才需要填写。
CompleteTime dateTime 下载完全结束并应用时的日期和时间(UTC)。只有在下载结束后该值才需要填写。

本方法的错误代码定义为:9000,9001,9002,9003,9010,9012,9013。

Reboot

这一方法令CPE重新启动。CPE必须在启动前发送该方法的应答。在使用该方法时一定要万分小心。这一方法的调用参数在表29中定义,应答参数在表30中定义。

本方法主要用于诊断目的。本方法的目的**不是**让ACS在设置完CPE参数或初始化下载后进行重新启动而使用。如果在这些情况下,CPE需要重新启动,它自主负责在会话结束后进行重新启动。因为一些CPE在此类条件下,可能不需要重新启动,因此ACS不应当在这类情况下调用该方法,以避免不必要的重新启动。

表29 Reboot参数

参数 类型 描述
CommandKey string(32) 当CPE重新启动并调用Inform方法时,将在InfromStruct的CommandKey元素中返回该元素值。

表30 RebootResponse参数

参数 类型 描述
- void 该应答方法无参数。

这本方法定义的错误代码为:9001,9002,9003。

服务器方法

在本节中列示的方法只需在服务器的支持。只有CPE可以调用这些方法。

Inform

任何时刻要建立与ACS的连接,CPE必须调用Inform方法,来初始化一个传输序列。该方法的调用参数在表31中定义,应答参数在表32中定义。

表31 Inform参数

参数 类型
DeviceID DeviceIdStruct 唯一标识CPE的结构,在表34中定义。
Event EventStruct[16] 结构数组,在表35中定义,说明引发事务会话建立的一个或多个事件。如果存在多于一个原因,CPE必须列出所有原因。
MaxEnvelopes unsignedInt CPE能够从ACS接受的一个HTTP回复中的最大SOAP信包数目。零值表明在该信包数目上没有特别的限制。
CurrentTime dateTime CPE的当前的日期与时间(UTC)。
RetryCount unsignedInt 在成功完成对Inform方法的调用前,已进行了多少次调用尝试。特别地,该值在每次非成功的尝试后会增1。非成功的尝试包括发送Inform报文以与ACS建立连接,或每次对Inform报文的不成功使用,比如收到错误应答或没有收到应答。在已经发送了Inform报文并且收到了成功应答后,该值重置为零。
ParameterList ParameterValueStruct[] 表11中定义的name-value对的数组。对每种类型的CPE,在Inform请求中包括参数信息表。表33列出了Internet网关设备必须包括的参数。CPE可以发送其它信息。

表32 InformResponse参数

名称 类型 描述
MaxEnvelopes unsignedInt ACS接受的来自CPE的每个HTTP post的SOAP信包的最大数目。零值表明没有对信包数目的限定。

表33列示了在Internet网关设备发出的Inform中需要包含的参数。CPE也可以在Inform包中包括其它参数。

如果是一个或多个参数值变化引起的(不是由ACS自己要求设置而引起)Inform调用,并且该参数值ACS通过SetParameterAttributes已经标记为notification(包括主动与被动),所有这些改变了的参数也必须包括在ParameterList中。如果一个参数在最后一次这类notification后改变过多次,只需要包括其最后一次更动的值。

对表33中“更改通知”列中做了标记的项,相应参数值的任何变动必须产生一个CPE发起的与ACS的连接,以调用Inform方法,而不管ACS是否将这些参数设置为notification。

因任何在表33中“更改通知”列标记过的参数变化而引起的Inform调用,或者ACS标记为notification(包括主动与被动)的参数变化而引起的Inform调用,必须在Inform方法的事件列表中包括事件”4 VALUE CHANGE”。

表33 Internet网关设备所需的Inform参数

参数 更改通知
InternetGatewayDevice.DeviceInfo.SpecVersion
InternetGatewayDevice.DeviceInfo.HardwareVersion
InternetGatewayDevice.DeviceInfo.SoftwareVersion X
InternetGatewayDevice.DeviceInfo.ProvisioningCode X
InternetGatewayDevice.ManagementServer.ConnectionRequestURL X
InternetGatewayDevice.ManagementServer.ParameterKey
InternetGatewayDevice.WANDevice.{i}.WANConnectionDevice.{j}.WAN{***}Connection.{k}.-ExternalIPAddress X

表34 DeviceIdStruct定义

名称 类型 描述
Manufacturer string(64) 设备的制造商(仅用于显示)。
OUI string(6) 设备制造商的组织唯一标识。用6位十六进制值表示,均为大写,并且包括任何的前置零。该值必须是[9]中定义的有效OUI值。
ProductClass string(64) 序列号所使用的产品类型标识。也就是说,对指定的制造商,该参数是用于标识产品或产品类型,在该类型下,SerialNumber参数是唯一的。
SerialNumber string(64) 对指定的产品类型和制造商,该标识可以唯一地确定该设备。

表35 EventStruct定义

名称 类型 描述
EventCode string(64) 每个值包括一个标识字符随后是对应原因的文字描述。几项原因值列示在下面,同时也定义了厂商自定制原因的语法。值**原因“0 BOOTSTRAP”表明会话发起原因是CPE首次安装或ACS的URL发生变化。”1 BOOT”表明会话发起原因是CPE加电或重置,包括系统首次启动,以及因任何原因而引起的重启,包括使用Reboot方法。”2 PERIODIC”表明会话发起原因是定期的Inform引起。”3 SCHEDULED”表明会话发起原因是调用了ScheduleInform方法。”4 VALUE CHANGE”表明会话发起原因是一个或多个参数**值的变化。该参数值包括在Inform方法的调用中。例如CPE分配了新的IP地址。”5 KICKED”表明会话发起原因是为了web标识管理(见附录D),及在本会话中将会调用Kicked方法(见A.4.2.1节)。”6 CONNECTION REQUEST”表明会话发起原因是3.2节中定义的源自服务器的Connection Request notification。”7 TRANSFER COMPLETE”表明会话的发起是为了表明以前请求的下载或上载(不管是否成功)已经结束,在此会话中将要调用一次或多次TransferComplete方法。”8 DIAGNOSTICS COMPLETE”当完成由ACS发起的诊断测试结束后,重新与ACS建立连接时使用。如DSL环路诊断(见附录B)。”M “如果这是另一方法的结果,值“M”后紧接着一个空格和方法的名称。例如:“M Reboot”“X “ 厂商自定义事件。在“X”后的OUI和空格是组织唯一标识符,表示为6位十六进制值,均使用大写,并包括任何前置零。该值必须是在[9]中定义的有效OUI。对的值与解释是厂商自定义的。例如:“X 00D09E MyEvent”
CommandKey string(32) 如果是因定义了一个CommandKey而产生了Inform结构,该元素必须CommandKey的值。在其它情况下,该元素的值为空字符串。对本规范的这一版本而言,对以下方法的调用会造成CommandKey值的改变:l ScheduledInform方法l Reboot方法l Download方法l Upload方法

为该方法定义的错误代码有:8001,8002,8003,8004,8005。

TransferComplete

本方法通知服务器由以前的Download或Upload方法调用而引起的文件传输已经结束(不管成功还是失败)。当相关的Download或Upload应答表明指定的文件传输在当时还没有完成(应答中Status参数非零)时,必须调用本方法。在这种情况下,本方法可以在发起文件传输的会话中调用,也可以在后续的会话中调用。如果使用该方法,则只有在文件传输已经结束(或者已经失败)后才能调用。CPE用来判断何时传输可认作结束的标准由CPE的实现方法自行决定。该方法的调用参数在表36中定义,应答参数在表37中定义。

表36 TransferComplete参数

参数 类型
CommandKey string(32) 设置为CommandKey参数的值,该值是在发起文件传输的Download或Upload方法调用中传递给CPE的。
FaultStruct FaultStruct 表38中定义的FaultStruct结构。如果文件传输成功,FaultCode的值设置为0。否则会指明非零的FaultCode值和说明失败原因的FaultString。
StartTime dateTime 文件传输开始的日期和时间(UTC)。
CompleteTime dateTime 文件传输结束的日期和时间(UTC)。

表37 TransferCompleteResponse参数

参数 类型
- void 该方法应答无参数。

表38 FaultStruct定义

名称 类型
FaultCode unsignedInt 在A.5.1节中定义的数字型错误代码。在失败情况下,允许使用的代码是:9001,9002,9010,9011,9012。零值代表无错误。
FaultString string(256) 错误的可人读文字描述。如果FaultCode的值为零,则该域应当为空。

本方法定义的错误代码为:8000,8001,8002,8003,8004,8005。

除此之外还有一些可选的RPC方法:

该节列示的所有方法是CPE设备可选支持的。只有服务器能够调用这些方法。

GetQueuedTransfers

服务器可以用本方法来确定前面的下载或上载请求的状态。该方法的调用参数在表39中定义,其应答参数在表40中定义。

表39 GetQueuedTransfers

参数 类型 描述
- void 该方法没有调用参数。

表40 GetQueuedTransfersResponse参数

参数 类型 描述
TransferList QueuedTransferStruct[16] 结构数组,在表41中定义。每个结构描述了一个CPE已经指示去执行,但还没有完全结束的文件传输。

表41 QueuedTransferStruct定义

名称 类型 描述
CommandKey string(32) 其值设置为发起文件传输的Download或Upload方法传递给CPE的CommandKey参数值。
State int[1:3] 传输的当前状态。定义的值有:1 = 尚未开始2 = 进行中3 = 已结束,正完成清理保留所有其它值。

为该方法定义的错误代码包括:9000,9001,9002。

ScheduleInform

服务器可以用本方法请求CPE来在未来某时刻计划(与CPE的定期调用Inform方法分离)一次性的Inform方法调用。方法的调用参数在表42中定义,应答参数在表43中定义。

表42 ScheduleInform参数

参数 类型 描述
DelaySeconds unsignedInt 从该方法被调用到CPE响应请求发起一次性的Inform方法调用之间的秒数。CPE发送一个请求,然后DelaySeconds之后调用Inform方法。该值必须比零大。
CommandKey string(32) 当CPE调用Inform方法时,InformStruct的CommandKey元素应返回的值。

表43 ScheduleInformResponse参数

参数 类型 描述
- void 该应答方法没有参数。

SetVouchers

服务器调用该方法来设置CPE使用的一个或多个Vouchers(凭据)选项。该方法的调用参数在表44中定义,应答选项在表45中定义。

表44 SetVouchers参数

参数 类型 描述
VoucherList base64[] Vouchers数组,其中每一个Voucher表示普一个Base64编码的十进制字符串。Voucher的具体结构在附录C中定义。

表45 SetVouchersResponse参数

参数 类型 描述
- void 该应答方法没有参数。

为本方法定义的错误代码有:9000,9001,9002,9003,9004。

GetOptions

服务器可以用此方法来获得CPE目前设置的选项表,及其它相关状态信息。该方法的调用参数在表46中定义,应答参数在表47中定义。

表46 GetOptions参数

参数 类型 描述
OptionName string(64) 表示一个特定选项的名称的字符串,或一个空串指出该方法应当返回CPE支持的所有选项的状态(而不管它们目前是否已经启用)。

表47 GetOptionsResponse参数

参数 类型 描述
OptionList OptionStruct[] OptionStruct数组,在表48中定义。包括或者一个OptionStruct(当接收到对一个特定选项的信息请求)或一个OptionStruct表,每个结构包括CPE支持的一个选项。

表48 OptionStruct定义

名称 类型 描述
OptionName string(64) 标识特定选项的名称。
VoucherSN unsignedInt 标识特定选项的数目。
State unsignedInt 由两位构成的数字,定义如下:Bit 0 (LSB):0 = 选项目前被禁用1 = 选项目前被启用Bit 1:0 = 选项已经被设置1 = 选项未被设置对每个选项的设置状态的解释是该选项所自定义的。但通常情况下解释为指定是否最终用户已经主动地执行了一些动作以使该选项完全发挥功能。
Mode int[0:2] 这一元素说明指定选项启用还是禁用。如果已经启用,是否已经指定了过期。定义的值有:0 = 禁用1 = 启用,过期2 = 启用,无过期
StartDate dateTime 选项开始的日期时间(UTC)。如果是未来时间,是指要启用选项的时间。如果是过去时间,是选项启用时的时间。
ExpirationDate dateTime 如果有,表明选项要过期的日期时间(UTC)。
IsTransferable boolean 指定是否选项已被指定为能够传递或不能传递(见附录C)。定义的值有:0 = 不能传递1 = 能够传递

为本方法定义的错误代码有:9000,9001,9002,9003。

Upload

服务器用本方法使CPE向指定的位置上载一个特定的文件。本方法的调用参数在表49中定义,应答方法在表50中定义。

表49 Upload参数

参数 类型 描述
CommandKey string(32) CPE用来指向特定上载的字符串。该参数在TransferComplete和GetQueuedTransfers方法中引用。
FileType string(64) 一个整数,其后是一个空格,再其后是一个文件类型说明。目前FileType参数仅定义了以下值:”1 Firmware Upgrade Image””2 Web Content”下列格式用于定义唯一的厂商自定义文件类型:”X “其中,用6位十六进制数字的在[9]中定义的OUI(组织唯一标识)代替,其中所有字母用大写,包括所有前置零。
URL string(256) URL说明目标文件位置。必须支持HTTP传输。可以支持其它可选的传输方式,如2.3.2节的定义。
Username string(256) CPE用于认证文件服务器的用户名。如果不需要认证,则该字符串设置为空串。
Password string(256) CPE用于认证文件服务器的密码。如果不需要认证,则该字符串设置为空串。
DelaySeconds unsignedInt 从本方法被调用到CPE被要求开始上载之间的时间间隔。如果值为零表明不需要延迟。如果是非零值,则上载不应当使用与该请求相同的事务会话。

表50 UploadResponse参数

参数 类型 描述
Staus int[0:1] 对该方法的成功应答返回一个整数型的枚举值定义如下:0 = 上载已完成。1 = 上载尚未完成(比如,如果上载必须等等本会话终止)。如果该参数的值非零,则CPE必须在本会话的后续时间,或者在其后的会话中,调用TransferComplete方法来说明本次上载的完成状态(成功或者失败)。
StartTime dateTime 上载开始的日期和时间(UTC)。只有在上载结束后该值才需要填写。
CompleteTime dateTime 上载完全结束并应用时的日期和时间(UTC)。只有在上载结束后该值才需要填写。

为本方法定义的错误代码有:9000,9001,9002,9003,9011,9012,9013。

FactoryReset

这一方法将重置CPE到其出厂默认状态。该方法使用时需要万分小心。该方法的调用参数在表51中定义,应答参数在表52中定义。

表51 FactoryReset参数

名称 类型 描述
- void 该方法没有参数。

表52 FactoryResetResponse参数

名称 类型 描述
- void 该方法的应答没有参数。

为本方法定义的错误代码包括:9000,9001,9002,9003。

服务器方法

本节定义的方法为服务器可选支持,只有CPE才能调用这些方法。

Kicked

任何时刻CPE被“踢”(在附录D中描述)时,CPE调用该方法。该方法的调用参数在表53中定义,应答参数在表54中定义。

表53 Kicked参数

参数 类型
Command string(32) 通用参数,服务器用它来作识别,或作其它目的。
Referer string(64) 当被踢出时,发送给CPE的“Referer”HTTP头的值。
Arg string(256) 通用参数,服务器用它来作识别,或作其它目的。
Next string(1024) 在正常情况下,服务器应当在本方法的应答中返回的URL。

表54 KickedResponse参数

参数 类型
NextURL string(1024) 用户的浏览器应当重定向到的下一个URL。该URL可以包括服务器所需的CGI参数(比如,为维持会话状态)。如果服务器希望给用户的浏览器发送CPE设备本身的一个页面,则只返回URL的路径部分作为结果,(比如“/security/index.html”)。这使CPE在HTTP 302应答中能够使用自己的规范名称。注意这需要ACS通过其它机制(不在本规范中讨论)来对CPE设备上的可用URL有事先的了解。

如果本方法返回错误,CPE应当将用户的浏览器重定向到CPE设备上的一个错误页面。

为本方法定义的错误代码有:8000,8001,8002,8003,8005。

RequestDownload

该方法允许CPE向服务器请示求一个文件下载。当接收到该请求时,服务器可以调用Download方法来启动下载。本方法的调用参数在表55中定义,应答参数在表56中定义。

表55 RequestDownload参数

参数 类型
FileType string(64) 这是被要求的文件类型(见表27列示的允许的文件类型)。
FileTypeArg ArgStruct[16] 零个或多个附加参数数组,每一个参数是一个表57所定义的name-value值对结构。对其它参数的使用依赖于指明的FileType。对每个目前已定义的文件类型,定义了下列参数:FileType**FileTypeArg名称**1 Firmware Upgrade(无)2 Web Content“版本”3 Vendor Configuration File(无) 如果服务器接收到它不能理解的参数,它必须忽略这些未知参数,但仍然用它能够理解的参数来处理请求。

表56 RequestDownloadResponse参数

名称 类型 描述
- void 该方法应答无参数。

表57 ArgStruct定义

名称 类型 描述
Name string(64) 参数名称。
Value string(256) 参数值。

CPE错误代码

表51列示了CPE能够返回的错误代码。注意这些错误代码的值以十进制表示。

表 58 错误代码

错误代码 描述
9000 方法不支持
9001 拒绝请求(未说明原因)
9002 内部错误
9003 无效参数
9004 资源超限(当用于SetParameterValues的关联时,它不得用来指示参数错误)
9005 无效参数名(与Set/GetParameterValues,GetParameterNames,Set/GetParameterAttributes相关)
9006 无效参数类型(与SetParameterValues相关)
9007 无效参数值(与SetParameterValues相关)
9008 试图设置不可写的参数(与SetParameterValues相关)
9009 Notification请求被拒(与SetParameterAttributes方法相关)
9010 下载失败(与Download或TransferComplete方法相关)
9011 上载失败(与Upload或TransferComplete方法相关)
9012 文件传输服务器认证失败(与Upload,Download,或TransferComplete方法相关)
9013 文件传输的协议不支持(与Upload和Download方法相关)
9800 - 9899 厂商定义的错误代码

服务器错误代码

表59列出了服务器能够返回的错误代码。注意错误代码以十进制表示。

表59 错误代码

错误代码 描述
8000 方法不支持
8001 拒绝请求(未指明原因)
8002 内部错误
8003 无效参数
8004 资源超限
8005 重试请求
8800 - 8899 厂商自定义错误代码
参数节点

首先,我们需要知道有哪儿些数据类型,这是针对参数(parameter)来说的。

Tr069的参数是一种树状的结构。对于路由,网关设备,通常参数的根节点是“InternetGatewayDevice”,对于电话设备,根节点是”Device”。在根节点下有一些子节点,比如DeviceSummary 称为:”InternetGatewayDevice”的一个子节点。表示方法是“InternetGatewayDevice.DeviceSummary ”。子节点中还有自己的子节点。父节点和子节点之间使用”.”进行分隔。这些协议规定的,并不是每一个RFC协议规定的节点都要实现,并不是每一个节点都要按照RFC协议规定的含义进行定义,也并不是每一个节点的路径都要按照协议来定义。这些,都要取决于服务器和客户端的统一意愿。如果双方定义了一个协议中没有说明的节点也可以。

厂商可以用其自定义的参数和对象来扩展标准参数表。厂商自定义的参数和对象可以定义在不同的命名空间,或者定义在标准的命名空间。

厂商自定义的参数或对象的名称必须采用以下格式:

X_VENDOR_VendorSpecificName

在该定义中,VENDOR是唯一的厂商标识符,可以是一个OUI或域名。OUI(organizationally unique identifier组织的唯一标识)在[9]中定义,必须格式化为6个十六进制字符的OUI,所有字母要大写,要包括所有的前置0。域名必须是大写,并且将每个点(“.”)替换为连字符或下划线。

VendorSpecificName必须是在B.2.1中定义的有效字符串,并不得包含“.”(小数点)或空格字符。

用字符串“X_”来表示厂商自定义的参数,也就暗示了不得有标准参数可以以“X_”开头

下面是一些厂商自定义的参数或对象名的例子:

InternetGatewayDevice.UserInterface.X_00D09E_AdBanner

InternetGatewayDevice.LANDevice.1.X_00D09E_LANInfraredInterfaceConfig.2.Status

X_GAMECO-COM_GameDevice.Info.Type

在需要时,厂商也可以扩展枚举类型的值集。如果这样做,厂商自定义的值必须使用格式“X_VENDOR_VendorSpecificValue”。这样的字符符的总长度不得超过31字节。

ACS和CPE的交互

为了交互的安全,应该尽量使用SSL或者TLS进行加密,使用https传输。

但是为了了解交互过程,分析报文,我们会以http的连接为例。

首先需要简明一下双方交互的流程:

每一次的会话都是由客户端发起的,这表示,如果某个事件触发,CPE会向ACS发起一次http会话。而ACS不能主动建立会话。如果ACS想主动操作CPE,他需要先通过UDP或TCP,向CPE发起建立会话的请求,然后CPE就会去建立会话。所以ACS会话请求是属于触发事件中的一个,其他还有一些触发事件,比如,CPE第一次启动,CPE定时访问ACS的时钟到时,某个重要参数比如IP地址发生变化等等。

下面是通常情况下的流程:

tr069交互流程图

我们通过wireshark抓包,了解一下具体报文是如何显示的:

1、CPE发出Inform,eventCode=1 BOOT表示是系统启动引发的这次回话。最大信包的处理数量是1,表示双方的每一次回复都只完成一个事件。retryCount为0表示在此之前,没有失败的Inform。下面还会有一些参数列表,是用来告诉服务器,设备自己的信息。根据这些信息,就能唯一标识CPE了,当然,通常情况下唯一标识的是设备的Mac地址。

inform

inform2


2、ACS回复InformResponse。标识收到了设备发来的Inform。服务器回复这个请求,使用的headerID和请求的一样,表明对应于该请求的回复,Header中还有一个元素是NoMoreRequest,指明CPE不得在后续的会话中发送更多的请求,但是没有mustunderstand的值,被解释成0,所以暂时没有作用。InformRespnse
3、CPE发送空的信包,表示没有后续请求。

norequest

4、ACS收到空包后,调用一个方法:GetParameterValues,想要获得两个参数PeriodicInformEnable:是否CPE必须定期向服务器通过Inform方法调用发送CPE信息。PeriodicInformInterval:在PeriodicInformEnable为真时,CPE必须试图连接ACS并调用Inform方法的时间间隔(以秒计)。

getvalue

5、CPE收到请求后,以相同的ID值,回复ACS请求的参数。回复的方式是GetParameterValuesResponse可能产生的错误代码是9001,9002,9003,9004,9005,表示参数不存在等或其他错误。

getResponse

6、最后ACS发送空消息表示结束会话。

至此,一次普通的ACS和CPE的会话就结束了。

对于tr069就先介绍到这里,有更多问题,可以去查找tr069的标准文档。