冉凡辉,邓 辉,梁 波,王 锋,卫守林,季凯帆
(昆明理工大学 云南省计算机技术应用重点实验室,云南 昆明 650500)
基于XML-RPC的RTS2自主观测系统远程访问技术*
冉凡辉,邓 辉,梁 波,王 锋,卫守林,季凯帆
(昆明理工大学 云南省计算机技术应用重点实验室,云南 昆明 650500)
自主观测软件系统的设计与实现是天文望远镜自主观测的核心,近年来已经成为天文技术研究中的一个重要方向。在当前可用的自主观测系统中,远程望远镜系统第2版(Remote Telescope System 2nd version, RTS2)拥有较多优势从而成为国内天文技术界较为关注的系统之一。针对RTS2不提供远程访问控制功能的问题,深入分析RTS2中利用XML-RPC技术实现数据访问和功能调用的机制,实现了一个基于XML-RPC的望远镜自动控制终端系统原型,在不更改RTS2核心代码的基础上,通过其服务层提供的XML-RPC接口实现RTS2的应用扩展,并为后续工作中集成利用RTS2奠定了基础。
XML-RPC;RTS2;自主观测
远程望远镜系统第2版[1]是一个天文望远镜自主观测软件系统,是远程望远镜系统[2]的进一步发展,目的是实现全自主的天文观测。RTS2系统在Linux下开发并运行,优点较为明显:(1)系统运行稳定;(2)系统响应快;(3)有开放源码利于实现系统扩展和进一步的开发。
国内在远程控制方面已经有一些研究工作,如在WEB界面中实现了对望远镜的远程控制[3-4]。RTS2作为一个相对成熟的自主控制软件系统,支持大量的天文观测设备,包括望远镜系统、CCD系统、自动对焦器等,直接利用RTS2可以简化系统开发工作量的同时保证系统的稳定性。然而,尽管目前商用的RTS3中有远程系统控制功能,但是开源的RTS2系统只提供了一个基于文本终端的命令行方式的操作界面,不能满足望远镜远程控制的需求。
本文正是在这样的背景下开展相应的研究工作,通过分析RTS2的XML-RPC接口,掌握RTS2系统中XML-RPC接口的调用方法,通过改进的XML-RPC接口,实现RTS2管理下的各类设备状态参数获取以及功能调用,使得通过WEB或移动手机界面对RTS2系统进行操作成为可能。
远程过程调用(Remote Procedure Call, RPC)是一种在本地机器上调用远端机器上的一个过程(方法)的技术。远程过程调用系统包括2部分:一是远程过程调用客户端,用来向远程过程调用服务器发出调用请求,并接收方法的返回数据;另一个是远程过程调用服务器,用于响应远程过程调用客户端的请求,执行相应的方法(Method),并回送执行结果。
XML-RPC是一种网络编程接口定义规范,以XML封装并通过HTTP协议进行传输, XML-RPC的实现是基于HTTP 的POST和GET 方法,传输数据流遵循HTTP格式。客户端可以指定目标服务器,将XML数据,包括目标方法和参数,传递给服务器;目标服务器通过XML-RPC接口得到XML 数据,处理后将结果以同样的方式生成XML格式的报文返回客户端。XML-RPC不受限于计算机平台和操作系统,任何一种支持HTTP协议的编程语言都可以支持XML-RPC编程[3]。XML-RPC工作原理如图1。
图1 XML-RPC工作原理图
Fig.1 Block diagram of the XML-RPC
客户端发出连接申请,服务端响应客户端的请求,建立连接。客户端把用户要求编码成XML格式传输服务端,服务端调用已注册方法(Method)对所接收的命令进行处理,并把处理结果以XML格式返回客户端,客户端解码,并把结果送给用户[4]。
数据的传输主要是方法名字和参数的输入和结果输出,格式为XML格式。客户端发送请求时传递的XML格式报文包括请求报头和请求报文,报头中包括消息格式(text/xml)和消息长度,有的也会有XML版本。
请求报文中必须包含有
方法名
如果需要传递参数,则在
<数据类型>
参数值
数据类型>
参数的数据类型包括整形(int)、字符串(string)、逻辑型(boolean)、数组(array)、结构体(struct)等。
服务端响应的消息包括响应报头和报文,响应报头和请求报头一样,响应报文中一定要有
。
其中,faultCode的值是整型,代表错误的代码;faultString的值是字符串型,代表错误的原因。
RTS2采用层状结构[5],共4层。第1层是中控层,提供系统中所有可用的设备与服务列表、系统状态改变和各设备的同步;第2层是设备层,实现与各个硬件的连接,针对不同的设备提供不同的类;第3层是服务层,包括系统的执行逻辑,提供对最终用户的各类功能,获得其他预报源(如伽马暴预报)的数据,实现XML-RPC的访问;第4层是客户层,一般工作在交互模式,通过交互终端或者简单工具实现观测脚本。
在此基础上,对RTS2系统的应用扩展无疑可以有多种方法,其中较为便捷的做法是在完全不改变RTS2结构的前提下,通过服务层提供的XML-RPC,实现对RTS2各方法的调用,读取相应的设备参数与状态,并通过XML-RPC写入需要控制的设备参数。这种方法是本文讨论的重点。
在RTS2中XML-RPC的实现主要通过调用XML-RPCD进程。构造函数XML-RPCD继承于Device 和XML-RPCServer,作为一个后台程序(Daemon),与其它设备后台守护进程交互,获得各设备的状态,实现对各设备的控制,如观测脚本的启动和执行情况等;同时,XML-RPCD自身又是RTS2的一个可被调用的服务,能被RTS2-MON这一类的RTS2用户界面程序所调用。XML-RPCD采用8889端口,外部可以通过HTTP协议进行访问,也可以通过标准的XML-RPC的进行访问。XML-RPCD的基本流程如图2。
图2 XML-RPCD流程图
Fig.2 Flowchart of the XML-RPCD
(1) 流程中,XML-RPCD通过套接通信与HTTP协议读取客户端数据,从客户端传递的数据先封装成XML的格式,如rts2.devices.list方法,封装的格式是
(2)RTS2中定义的方法需要在XMLRPCAPI中有具体的方法实现过程,同时这些方法已经在XML-RPCD中注册。
(3)服务端根据客户端请求的方法和参数,调用相应的功能,执行完后返回的数据是XML格式。如DeviceCount方法,返回的结果是设备个数,封装成的XML格式为
要实现外部对RTS2的访问,关键在于利用RTS2提供的XML-RPC访问接口,获得RTS2的各种状态,并通过相应命令,实现对各类设备的控制。表1列出了RTS2提供的用户访问接口方法。
表1 RTS2提供的接口Table 1 The interfaces supported by the RTS2
客户端通过XML-RPC协议,实现对RTS2的访问,具体的流程如图3。
(1)客户端与服务器建立连接后,远程调用rts2.user.login方法,bool verifyUser()函数进行响应处理,通过返回的结果判断登录是否成功(“0”失败,“1”成功)。
(2)调用rts2.devices.list方法。由类XMLRPCD定义的对象getMasterApp(),并由其下面的构造函数getConnections()获取当前正在工作的设备名,然后以设备名为参数,调用rts2.devices.values.list方法,在服务端调用构造函数connectionValuesToXmlRpc()获得设备工作参数,如望远镜当前转动阻塞状态,CCD脚本执行状态等等。
(3)调用rts2.device.command方法,由设备名字和命令作为参数,在服务端由类Connect下的构造函数getOpenConnection(),检查设备是否处在连通状态,如果是,再调用构造函数queCommand(),对参数中指定设备根据命令进行相应操作。
基于上述讨论,在Windows操作系统下,利用开源的xmlrpc++库[6],以C++为开发语言,实现了一套基于RTS2的望远镜系统状态数据采集和控制终端系统原型,系统使用一台Meade LX200GPS望远镜[7]。客户端界面如图4。
图3 客户端访问流程Fig.3 Flowchart of the calling of the RST2 by a client
图4 客户端界面Fig.4 The client interface
通过客户端界面输入RTS2的IP地址和端口并执行“连接”功能,获得所有设备目录(图4中的设备列表)。选择一个设备,比如“T0”,该设备的各种参数显示在图5设备状态列表框中。输入该设备所支持的一条命令,如图4命令框中的“move 20∶00∶00.000 30∶00∶00.000”,点击“发送”,实现望远镜的转动控制。服务端响应如图5。
图5 服务端响应客户端请求
Fig.5 A sample of response of the server to a connection requirement from a client
主要代码如下:
port=GetDlgItemInt(IDC_EDIT1); //获得端口号
GetDlgItem(IDC_EDIT2)->GetWindowText(ip,16); //获得ip;
const char*uri=NULL;
XmlRpc∷XmlRpcClient c(server, port, uri); //定义客户端
XmlRpc∷XmlRpcValue params, result; //定义数据类型
CString s;
GetDlgItem(IDC_EDIT10)->GetWindowText(s); //获得设备命令
string s0(s.GetBuffer()); //数据类型转换
CString s1;
((CComboBox*)GetDlgItem(IDC_COMBO))->GetWindowText(s1); //获得设备名
string s2(s1.GetBuffer()); //数据类型转换
params[0]=s2; //设备名
params[1]=s0; //命令
c1.execute("rts2.device.command", params, result); //客户端发送命令给服务端
原型系统测试表明,以RTS2为基础核心,采用XML-RPC方式,可以较快地对RTS2进行功能扩展,快速构建满足天文远程自主观测需求的用户终端软件系统。
自主观测软件系统的设计与实现是天文望远镜自主观测的核心,近几年已经成为天文技术研究中的一个重要方向。在当前可用的自主观测系统中,RTS2系统因为其核心部分开源,已经有诸多实际应用,特别是已经成功应用于Bootes[8],成为国内天文技术界较为关注的系统之一。
本文深入分析RTS2中XML-RPC的数据访问和功能调用接口,实现了一个基于XML-RPC的望远镜自动控制终端系统原型。在不更改RTS2核心代码的基础上,通过服务层提供的XML-RPC接口,可以快速实现RTS2的应用扩展,为后续工作中集成利用RTS2奠定了基础。
[1] Remote Telescope System-2nd version[EB/OL]. [2012-11-20]. http://rts2.org/.
[2] Petr Kubánek. RTS2—the remote telescope system[J]. Advances in Astronomy, 2010: 1005-1014.
[3] 谌俊毅, 陈东, 范玉峰, 等. 基于网络的望远镜远程控制实验[J]. 天文研究与技术——国家天文台台刊, 2007, 4(1): 36-41.
Chen Junyi, Chen Dong, Fan Yufeng, et al. The remote control experiment of the telescope based on the embedded internet[J]. Astronomical Research & Technology——Publications of National Astronomical Observatories of China, 2007, 4(1): 36-41.
[4] 许骏, 金振字. Windows Sockets实现天文终端的远程控制[J]. 天文研究与技术——国家天文台台刊, 2001(1): 40-46.
Xu Jun, Jin Zhenyu. Remote control of astronomical terminals based on WinSockets[J]. Astronomical Research & Technology——Publications of National Astronomical Observatories of China, 2001(1): 40-46.
[5] Petr Kubánek, Martin Jelínek, Stanislav Vítek, et al. The RTS2 protocol[C]//Proceedings of SPIE, 2008, 70192S: 92-103.
[6] Xml-RPC for C and C++[EB/OL]. [2012-11-20]. http://xmlrpc-c.sourceforge.net/.
[7] David Suder. Software and hardware autoguiding issues with the LX200GPS[M/OL]. [2012-11-20]. http://www.pdfio.com/k-1465698.html.
[8] BOOTES: Burst Optical Observer and Transient Exploring[EB/OL]. [2012-11-20]. http://bootes.iaa.es/.
AStudyofRemoteAccessTechniquesforAnRTS2AutonomousObservationSoftwareSystemBasedontheXML-RPC
Ran Fanhui, Deng Hui, Liang Bo, Wang Feng, Wei Shoulin, Ji Kaifan
(Key Lab of Applications of Computer Technology of the Yunnan Province, University of Science and Technology of Kunming, Kunming 650500, China, Email: dh@cnlab.net)
An autonomous observation software system is a key component in modern autonomous astronomical telescope observation, which has been an important new research direction of astronomical technologies in recent years. Among established autonomous observation software systems, the RTS2 has a variety of advantages and has
relatively more attention. However, the RTS2 does not provide any function for remote access and control. In this paper, we have an in-depth study on installing in an RTS2 system function callings and data-access interfaces based on the XML-RPC technology. We provide a prototype of a terminal system for autonomous telescope control based on the XML-RPC. We present the details of the source codes including descriptions of interface functions and interface parameters. Our experimental results show that the XML-RPC based methods are simple for expanding the applications of an RTS2 system. These methods could also be helpful for further development of autonomous observation systems.
XML-RPC; RTS2; Autonomous observation
CN53-1189/PISSN1672-7673
TP311.11
A
1672-7673(2013)04-0372-06
国家自然科学基金 (11203011) 资助.
2012-11-20;修定日期:2012-12-21
冉凡辉,男,硕士. 研究方向:天文技术与方法. Email: rff@cnlab.net
邓 辉,女,教授. 研究方向:计算机应用技术. Email: dh@cnlab.net