Ros用XML-RPC实现进程间通信。本文说下什么是XML-RPC,以及XML-RPC中的数据类型。想了解更多XM_RPC细节参考网上其它文章,像“XML-RPC远程方法调用”。
一、XML-RPC
XML-RPC的全称是XML Remote Procedure Call,即XML远程过程调用。
它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。 这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。XML-RPC尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。
XML-RPC是使用HTTP协议做为传输协议的RPC(远程过程调用)机制,使用XML文本的方式传输命令和数据,即HTTP协议中的BODY部分是XML文本。
一个RPC系统,必然包括2个部分:
- RPC Client。用来向RPC Server调用方法,并接收方法的返回数据。
- RPC Server。用于响应RPC Client的请求,执行方法,并回送方法执行结果。
RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。
1.1 XML-RPC的可用版本
XML-RPC client和XML-RPC server都有很多版本的实现。一般而言,一个实现版本都会同时实现client/server。但由于都满足xml rpc规范,从理论上讲,任何一个版本的XML-RPC client实现与任何一个版本的XML-RPC server都能配套使用。
更进一步,由于XML-RPC以XML文本的方式,使用http协议传输,所以与编程语言无关。例如:XML-RPC client的已实现版本包括了:perl、php、python、c/c++、java,等等。XML-RPC server的实现语言包括perl、java,等。
Ros使用的XML-RPC是C/C++,具体是开源项目xmlrpcpp。
二、XML-RPC的数据类型
6种基本数据类型,2种组合数据类型。总之一切皆value。所以一共有八种value。以下加粗文字是要封装的数据。
- <value><int>2323</int></value>
- <value><double>23.23<double></value>
- <value><boolean>1或者0</boolean></value>
- <value><string>weidiao</string></value>
- <value><dateTime>20021125T02:20:04</dateTime></value>格式显而易见:yyyyMMddThh:mm:ss
- <value><base64>ASDFASD9823</base64></value>将任意二进制数据转换成base64编码方式。
- <value><array><data>里面可以放多个value</data></array></value>我认为data这个标签有点多余
- <value><struct>这里可以放多个member,每一个member都是一个name-value-pair</struct></value>
2.1 6种基本数据类型
Type | Value | Examples |
int or i4 | 32-bit integers between - 2,147,483,648 and 2,147,483,647. | <int>27</int>; <i4>27</i4> |
double | 64-bit floating-point numbers | <double>27.31415</double>; <double>-1.1465</double> |
boolean | true (1) or false (0) | <boolean>1</boolean>; <boolean>0</boolean> |
string | ASCII text, though many implementations support Unicode | <string>Hello</string>; <string>bonkers! @</string> |
dateTime.iso8601 | Dates in ISO8601 format: CCYYMMDDTHH:MM:SS | <dateTime>20021125T02:20:04</dateTime> <dateTime>20020104T17:27:30</dateTime> |
base64 | Binary information encoded as Base 64, as defined in RFC 2045 | <base64>SGVsbG8sIFdvcmxkIQ==</base64> |
表中是基本数据类型,它们在xml中表示如下:<value><type>xxxx</type></value>。除了string类型可以省略<type>标签外,其余五种基本数据类型必须明确注明数据类型,但强烈建议不要使用这个例外,做统一处理,即所有数据类型必须注明数据类型(type)。
两种组合数据类型:数组和结构体。数组表示了一种序列化信息,数组可以包含多种数据类型;结构体其实相当于映射,是键值对,是属性集,是关联数组。
2.2 数组
数组中的元素类型可以有多种,数组也可以嵌套的。以下是数组示例。
<value> <array> <data> <value> <array> <data> <value><string>张三</string></value> <value><int>20</int></value> <value><int>30</int></value> </data> </array> </value> <value> <array> <data> <value><string>李四</string></value> <value><int>25</int></value> <value><int>35</int></value> </data> </array> </value> </data> </array> </value>
2.3 结构
struct内可以放多个member,每一个member都是一个name-value-pair
<value> <struct> <member> <name>givenName</name> <value><string>Joseph</string></value> </member> <member> <name>familyName</name> <value><string>DiNardo</string></value> </member> <member> <name>age</name> <value><int>27</int></value> </member> </struct> </value>
三、HTTP请求、回复
3.1 发出请求
请求的格式是http请求头部+xml的具体数据内容,通过post方式发送到服务器。
其中xml内容包括两大部分:方法名及参数,一旦进入<param></param>标签,就跟上面那些数据类型一样一样的了。
<?xml version="1.0"?> <methodCall> <methodName>circleArea</methodName> <params> <param> <value><double>2.41</double></value> </param> </params> </methodCall>
3.2 收到的回复
包括两部分:http头部+xml具体内容,跟发送时没多大区别。如你所见,既然有http头部,那就完全可以保存cookie。
HTTP/1.1 200 OK Date: Sat, 06 Oct 2001 23:20:04 GMT Server: Apache.1.3.12 (Unix) Connection: close Content-Type: text/xml Content-Length: 124 <?xml version="1.0"?> <methodResponse> <params> <param> <value><double>18.24668429131</double></value> </param> </params> </methodResponse>
以下是正确处理时的回复,如果处理失败,Server把错误信息反馈给Client。
<?xml version="1.0"?> <methodResponse> <fault> <value> <struct> <member> <name>code</name> <value><int>26</int></value> </member> <member> <name>message</name> <value><string>No such method!</string></value> </member> </struct> </value> </fault> </methodResponse>