一、RPC的说明
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
二、CPE与ACS之间的RPC
ACS与CPE之间通过TR069协议特有的RPC方法进行互操作。RPC方法分为ACS支持的方法和CPE支持的方法。ACS支持的方法实际上就是CPE能够远程调用的方法,CPE支持的方法实际上就是ACS能够远程调用的方法。
1、CPE函数由ACS调用,用来对CPE进行管理如:设置CPE参数、获取CPE参数、硬件升级、重启设备等;就是ACS让CPE执行,然后返回参数的话返回到ACS这边。
2、ACS函数由CPE调用,用来向ACS上报状态信息,请求硬件镜像文件下载(用来升级硬件)等。
这些方法有些是可选,有些事必选的(Required/Optional)。
(1)GetRPCMethods参数
参数 | 类型 | 描述 |
---|---|---|
- | void | 这个方法没有调用参数 |
GetRPCMethodsResponse参数
参数 | 类型 | 描述 |
---|---|---|
MethodList | string(64)[] | 字符串数组包含RPC方法的每个收件人的名字。方法返回一个列表的ACS必须包括“inform”。 例如,CPE实现只有这个版本的规范中定义的基线方法将返回请求的ACS时下面的列表: "GetRPCMethods" "SetParameterValues" "GetParameterValues" "GetParameterNames" “SetParameterAttributes” “GetParameterAttributes” “AddObject” “DeleteObject” “Reboot” “Download” 作为ACS实现另一个例子,只有这个版本的规范中定义的基线方法将返回下面的列表时,当被CPE请求时: “Inform” "GetRPCMethods" “TransferComplete” |
(2)SetParameterValues参数
参数 | 类型 | 描述 |
---|---|---|
ParameterList | ParameterValueStruct[] | 对于每个名称值对,CPE被指示将名称指定的参数设置为相应的值。 此数组不能包含多个具有相同参数名的条目。如果一个给定的参数出现在这个数组中不止一次,CPE必须响应故障9003(无效参数)。 如果该数组的长度为零,那么CPE必须将ParameterKey设置为ParameterKey参数指定的值,但必须不设置任何其他Parameter值。 |
ParameterKey | string(32) | 设置ParameterKey参数的值。CPE必须将ParameterKey设置为该参数中指定的值,当且仅当SET参数值成功完成。如果SetParameterValues未成功完成(意味着请求的参数值更改没有生效),则必须不修改ParameterKey的值。ParameterKey为ACS提供了一种可靠的和可扩展的方法来跟踪ACS所做的更改。这个参数的值留给ACS的自由裁量权,并且可能是空的。 |
通过对参数设置的抓包明显得出上述参数的值。
SetParameterValuesResponse参数
参数 | 类型 | 描述 |
---|---|---|
Status | int[0:1] | 对该方法的成功响应返回如下定义的整数枚举: 0 = 所有参数更改已被验证和应用。 1 = 所有参数更改都已验证和提交,但一些或全部尚未应用(例如,如果在应用新值之前进行重启)。 |
由图可知此时状态码为0。
(3)GetParameterValues参数
参数 | 类型 | 描述 |
---|---|---|
ParameterNames | string(256)[] | 字符串数组,每个字符串表示所请求参数的名称。 如果参数名称参数作为部分路径名称给出,则该请求将被解释为返回命名层次结构的分支中与参数共享相同前缀的所有参数的请求。部分路径名必须在层次结构中的最后一个节点名后面以“.”(点)结束。空字符串指示名称层次结构的顶部。 如果在参数名中使用OPTIONAL实例通配符,则该请求将被解释为返回所有现有实例的所有参数,这些参数与所请求的参数名匹配。实例通配符可以与部分路径名组合。 下面是一个完整参数名称的例子: Device.DeviceInfo.SerialNumber 下面是部分路径名称的示例: Device.DeviceInfo. |
GetParameterValuesResponse参数
参数 | 类型 | 描述 |
---|---|---|
ParameterList | ParameterValueStruct[] | 名称值对的数组,包含每个请求参数的名称和值。 如果GetParameterValues请求中的ParameterNames数组中的多个参数重叠,从而存在对相同Parameter值的多个请求,则CPE可以自行决定是否复制响应数组中的那个Parameter。也就是说,CPE要么只在其响应中包括该参数值一次,要么为请求它的每个实例包含该参数值。 如果请求中的ParameterNames参数是部分路径名称,并且如果由该部分路径名称表示的对象内没有参数(在下面的任何级别),则ParameterList必须为空,并且此必须不导致错误响应。 如果使用OPTIONAL实例通配符,并且对象中没有匹配的实例,则必须清空ParameterList,并且此必须不会导致错误响应。 |
(4)GetParameterNames参数
参数 | 类型 | 描述 |
---|---|---|
ParameterPath | string(256) | 包含完整参数名的字符串,或表示名称层次结构子集的部分路径名。空字符串指示名称层次结构的顶部。部分路径名必须在层次结构中的最后一个节点名后面以“.”(点)结束。 如果在参数名中使用可选实例通配符,则该请求将被解释为返回所有现有实例的所有参数,这些参数与所请求的参数名匹配。实例通配符可以与部分路径名组合。 下面是一个完整参数名称的例子: Device.DeviceInfo.SerialNumber 下面是部分路径名称的示例: Device.DeviceInfo. |
NextLevel | boolean | 如果为false,则响应必须包含名称与ParameterPath参数完全匹配的Parameter或Object,以及ParameterPath参数给出的对象的后代的所有Parameters和Object(Object层次结构中指定Object之下的所有级别)。例如,如果ParameterPath是“Device.Hosts.”,则响应将包括以下内容(如果存在具有实例号“1”的主机的单个实例)。 如果为真,则响应必须包含由ParameterPath参数给出的对象的下一级子对象(如果有的话)的所有参数和对象。例如,如果ParameterPath是“Device.Hosts.”,则响应将包括以下内容: Device.Hosts.HostNumberOfEntries Device.Hosts.Host. 或者,如果参数路径为空, NextLevel等于true,则响应将列出只有“Device.”。 |
GetParameterNamesResponse参数
参数 | 类型 | 描述 |
---|---|---|
ParameterList | ParameterInfoStruct[] | 结构数组,每个包含参数或对象的名称和其他信息。 当NextLevel为假时,此列表必须包含名称与ParameterPath参数完全匹配的Parameter或Object,以及ParameterPath参数所给出的对象的后代的所有Parameters和Objects(Object层次结构中指定对象之下的所有级别)。如果使用OPTIONAL实例通配符,则列表必须包含所有实例的参数或对象,这些实例的名称匹配ParameterPath参数,以及所有子实例。如果ParameterPath参数是空字符串,则返回在特定CPE上可访问的所有对象和参数的名称。 当NextLevel为真时,此列表必须包含所有Parameters和Object,如果有的话,它们是ParameterPath参数给出的Object的下一级子对象。如果使用OPTIONAL实例通配符,则列表必须包含所有实例的参数或对象,这些实例的名称与ParameterPath参数匹配。 对于一个参数,这个结构中返回的名称必须是一个完整的路径名,以参数元素的名称结尾。对于对象,此结构中返回的名称必须是部分路径名,以点结束。 此列表必须包括当前空的任何对象。空对象是不包含实例(多实例对象)、子对象和子参数的实例。 如果NextLevel为真且参数路径指的是空的对象,则该数组必须包含零项。 参数列表必须只包含由CPE实际实现的参数和对象。如果列出了一个参数,这意味着该参数的GetParameterValues值将有望成功。 |
ParameterInfoStruct定义
名字 | 类型 | 描述 |
---|---|---|
Name | string(256) | 这是参数或部分路径名的完整路径名。 |
Writable | boolean | 参数值是否可以使用SetParameterValues方法重写。 如果Name是引用对象的部分路径名称,则表明AddObject是否可用于添加该对象的新实例。 如果Name是引用多实例对象的特定实例的部分路径名称,则这指示是否可以使用DeleteObject删除该特定实例。 只有当在此CPE中实现的相应参数或对象如上所述可写时,该元素才必须为真。这个元素的值必须只反映实际的实现,而不是参数或对象的规范是否允许它可写。 |