2. 中国科学院国家天文台, 北京 100012;
3. 中国科学院云南天文台, 云南 昆明 650011
2. National Astronomical Observatories, Chinese Academy of Sciences, Beijing 100012, China;
3. Yunnan Observatories, Chinese Academy of Sciences, Kunming 650011, China
中国新一代厘米-分米波射电日像仪(CSRH)位于中国内蒙古锡林郭勒盟正镶白旗明安图镇,用于观测日冕大气和监测太阳活动[1]。CSRH的观测量是太阳的射电宽带频谱,分为高、低频段两套设备。CSRH-I是项目的低频部分,工作的射频频率范围为0.4 GHz~2.0 GHz,主要硬件由天线、传输、模拟接收机、数字接收机和后续的处理及控制设备等部分组成。天线接收的射电噪声信号经过低噪声放大器放大后,再进行电/光转换,将电信号转换为光信号并通过光纤传至机房[2]。经过模拟接收机和数字接收机的处理后,最终生成约定格式的数据并以文件的方式进行存储[3]。
为了实现在线实时状态监控等功能,数字接收机在保存观测数据文件的同时,也可以将部分观测数据通过网络发送到指定地址,供实时数据分析使用,目前发送频率为5 s一次,每次的数据量约1.6 MB。
CSRH-I数据接收子系统就是在这一基础上设计的。子系统在数字接收机和后续监控、发布等系统之间建立数据通道,将数字接收机发送的数据传输给后续多个处理系统使用,实现观测与后续处理的联动。子系统通过创建套接端点,与发送端建立连接,接收从数字接收机发送的数据,并根据数据格式对数据进行拆分、检验和组合,得到正确的观测数据并以文件的方式存储,进而通过报文通知后续其它子系统当前观测数据的更新状态。图 1给出了CSRH-I系统数据流图,图中虚线框内为CSRH-I观测数据接收子系统的定位与前后关系。
|
| 图 1 CSRH-I数据流图,虚线框内是数据接收子系统涉及范围 Fig. 1 A flowchart of the CSRH-I. Our data-receiving subsystem is marked as the region enclosed by dotted lines |
CSRH-I使用的数字接收机采用一种自定义数据格式进行数据传输与存储,以下简称为裸格式。裸格式以帧为单位,包括系统参数和相关处理结果。图 2为帧格式示意图,帧的起始位置坐标为0,以字节为单位,图中表格内数据均为十六进制。观测系统每3 ms生成一帧数据,每帧数据由帧头部分和数据部分组成,总数据量为100 000字节。帧头的长度为192字节,其中包含了帧起始引导标志、系统时间、信号带宽、工作模式等信息。CSRH-I数据接收系统需要对帧的引导标志、极化方式、工作模式以及射频频率进行判别,实现对接收的帧进行选择。
|
| 图 2 帧格式示意图 Fig. 2 The format of a data frame of the CSRH-I |
CSRH-I观测设备可以在循环工作模式和非循环工作模式两种模式下工作。在非循环工作模式下,设备以固定的射频频率和极化方式工作;而在循环工作模式下,设备在0.4 GHz~0.8 GHz、0.8 GHz~1.2 GHz、1.2 GHz~1.6 GHz和1.6 GHz~2.0 GHz 4个频段上循环进行工作,同时极化方式采取在一个频率上先左旋极化再右旋极化的方式进行循环。循环工作模式下,先改变极化方式,然后改变射频频率。两种工作模式得到的数据帧排列如图 3。由图 3知,循环模式下设备完成一次完整观测得到的观测数据是由8个3 ms观测得到的帧组成。
|
| 图 3 数据帧排列图 Fig. 3 The arrangements of data frames under two working modes of the CSRH-I,respectively |
CSRH-I观测数据接收子系统是以Linux环境下的套接字(Socket)为基础实现。子系统作为TCP服务器端,对外提供面向连接的可靠服务,有序、无差错、无重复的完成数据传输[4]。数字接收机在需要进行数据传输时,作为TCP客户机连接本系统的TCP端口建立相应的连接,进行数据传输。
2.2 Boost库Linux环境下服务器端套接字创建的基本步骤为:创建套接,绑定地址,启动监听,接受连接,数据交换,连接断开[5]。近几年来,为简化Linux环境下套接字编程,越来越多的软件开发人员采用了Boost软件库。Boost是一个功能强大、构造精巧、跨平台、开源的C++程序库,Boost库为用户提供了线程安全的异步套接编程[6]。在异步模式下,Boost库提供异步回调机制,开发人员可以通过调用“boost∷bind()”函数将后续要调用的函数作为当前执行函数的一个参数使用。另外,Boost库还为开发人员提供了智能指针,方便解决C++编程中的内存管理问题。Boost下的ASIO库是一个针对低端I/O编程和网络编程的库,对网络编程和计算机底层I/O编程做了较好的接口。应用程序可以通过“io_service”对象获得操作系统的I/O服务,“io_service”调用操作系统功能执行连接操作,操作系统向“io_service”返回执行结果,无需再考虑程序的底层构建,为开发者进行C++套接编程提供了稳定的异步模型[7]。
2.3 基于Boost库的接收服务器实现该数据接收子系统主要分为数据接收、数据检验、数据存储、数据共享几部分。数据接收部分的主要任务是创建服务器端套接字,与发送端建立连接,接收所有发送来的数据并暂存于缓冲区数组中;数据检验部分检验接收过程中是否发生数据丢失、数据错传等传输错误,从接收的数据中获得后续系统需要的数据,抛弃错误或者不需要的数据;数据存储部分实现将经过正确性检验确认无误的数据依照一定的存储方法进行存盘;数据共享部分实现后续多个处理系统及时地获取最新数据,并行地使用存盘数据。
2.3.1 数据接收使用Boost库可以快速地完成服务器端套接字的创建并启动监听,实现与发送端建立连接后并行地接收数据。调用“io_service”生成“io_service”对象,调用“ip∷tcp∷endpoint()”生成套接字节点,绑定指定机器的IP地址以及5260端口,在此基础上创建一个“acceptor”对象,通过调用“async_accept”函数在指定端口开启监听,等待连接。当有多个连接请求时,服务器端为每一个连接创建一个线程,避免客户端的长时间等待。创建服务器端套接字并启动监听的部分代码如表 1。
|
boost∷asio∷io_service CSRHIoservice; tcp∷endpoint Endpoint(tcp∷v4(),5260); ip∷tcp∷socket socket(CSRHIoservice); boost∷acceptor acceptor_(CSRHIoservice,Endpoint); acceptor_.async_accept(socket,boost∷bind(handle_accept,this,boost∷asio∷placeholders∷error)); |
//创建io_service对象 //创建套接节点,指定通信协议和监听端口 //创建服务器端套接字 //创建acceptor对象 //开启5260端口监听,等待连接 |
服务器端监听到请求,接受请求建立连接后便立即进行数据的接收。调用“async_read()”函数进行数据的异步接收,返回条件是完成从套接缓冲区中读取指定字节的数据或者数据接收过程中发生错误。通过回调函数调用“async_read()”函数,开启多个线程并行地接收数据。回调函数返回两个默认的参数:函数执行结果“boost∷asio∷placeholders∷error”和本次接收最终接收的字节数“boost∷asio∷placeholders∷bytes_transferred”。通过这两个参数可知本次数据的接收是否成功以及接收的数据量。如果发生错误,则返回已接收的数据量和错误信息。接收的数据暂存于系统缓冲区数组中,等待对其进行拆分和选择,以节省系统I/O资源。
在异步模式下接收数据时系统可利用空闲资源为接收任务创建多个线程,从而并行地接收数据,提高系统资源利用率,加快数据接收速度,减少因为频繁的接收超时带来的损失。
2.3.2 数据检验在当前的CSRH-I中,数字接收机所发送的数据没有提供数据校验位。为了避免错误的数据给后续处理带来不可预料的后果,需要对接收的数据进行检验。另外,由上文裸数据格式的分析可知,在不同的设备工作模式下,后续处理对数据的可处理性要求不同。非循环模式下得到的观测数据帧,每一帧都可以进行单独处理,而对于循环模式下得到的数据帧,连续且有规律排列的8个帧组成的一个完整数据才能对其进行后续处理。数据检验根据裸数据格式和不同模式下数据的可处理性完成对接收缓冲区数组中的数据进行拆分、检验和组合。另外,数字接收机随机选取某一帧作为发送数据的第一帧进行发送,帧对应的设备射频频率以及极化方式未知。为了避免存盘数据混乱,方便后续系统使用数据,传输过程中,约定频率为0.4 GHz~0.8 GHz的左旋极化数据帧作为接收系统存盘的第1帧。
数据检验流程如图 4,在暂存接收数据的缓冲区数组中遍历查找32字节十六进制的“55”,确定帧起始位置,然后跳转相应的偏移量,判断帧尾位置是否为16字节十六进制的“aa”。判断成功后,循环检验后续8帧的帧头和帧尾位置数据是否正确,以此判断数组中是否存在8个完整的帧。如果判断成功,则从帧起始位置跳转190字节到模式判别字段,判断该帧数据对应的设备工作模式。若是非循环模式,则直接存储该帧,该次数据检验完成,若是循环模式,则进行后续的检验。
|
| 图 4 数据检验流程图 Fig. 4 The flowchart of checking data |
对于判定为循环模式的帧,从帧起始位置向后跳转99 264字节,读取帧的跳频码字段。判断跳频码字段的值是否为十六进制的“0000”,判定失败,则向后滑动重新查找帧头,进行下一次检验。否则,假设当前帧为第1帧,后续相邻的帧为第2帧,以此类推,判断第1帧和第2帧,第3帧和第4帧,第5帧和第6帧,第7帧和第8帧的跳频码字段的值是否相等。相等则说明传输过程中没有发生帧丢失,存储这8帧,进行下一次接收。否则,丢弃该次接收的所有数据,该次数据检验完毕,进行下一次接收。
2.3.3 数据保存和共享接收系统完成数据检验后将数据存储成文件,为了避免接收系统写文件与后续多个系统读文件造成死锁,数据保存完成后,对一个名为 “Recvlog.txt” 的文本文件进行维护,该文件对存盘文件进行管理。新接收的数据以文件存储后,将生成文件的名称以及大小以追加的方式更新进“Recvlog.txt”文件。更新完成后,系统通过UDP协议向所有事先配置好的IP地址发送UDP报文,UDP报文的内容为最后更新的文件名。每个后续数据处理子系统接收报文数据后,以只读方式打开对应的数据文件。
系统的数据保存和共享实现了对文件的并行读写。同时,采用UDP报文发送的方法,可以有效防止接收系统写文件与后续多个系统读文件引发的文件互锁问题,以此避免文件互锁导致整个系统无法正常工作。
3 系统异常处理CSRH-I系统对数据的正确性有严格的要求。为了保证传输过程中数据的正确性,系统根据TCP协议套接数据传输过程中的常见问题分别考虑了相应的异常处理方法,以应对系统运行过程中可能出现的异常事件,提高系统的可靠性和稳定性。系统针对连接中断、数据错传、传输超时等异常设定了相关处理办法,具体说明如下。
3.1 连接中断系统实现了在客户端断开连接后及时提醒用户,避免系统做无谓的等待。当网络故障或者其他短暂故障导致发送数据的客户端与系统断开连接时,接收端根据数据接收函数返回的“boost∷asio∷placeholders∷error”参数值对此进行识别,确认客户端失去连接后系统将主动断开原有TCP连接,同时将当前正在接收但未能接收完成的数据丢弃,并跳过此次接收,等待客户端重新连接。
3.2 数据错传系统根据接收的数据量实现对数据传输过程的错误检验。数据接收机发送数据量是已知的,同时,在Boost的异步通信方式下,数据接收端每次接收的数据量可以由接收函数的返回参数“boost∷asio∷placeholders∷bytes_transferred”记录,通过统计该参数的值知道在特定时间段内接收系统接收的数据总量。如果接收的数据总量与发送端发送的数据量不同,则认为传输过程中发生了错误,选择丢弃该次已经接收的数据,并开始下一次接收,从而保证接收数据的正确性。
3.3 传输超时本系统利用传输超时解决网络拥堵或系统I/O繁忙等异常情况。超出系统设定时间的接收动作或者处于等待状态的存储动作将被终止,同时丢弃已经接收的数据。
Boost库提供了一个“timer”库,这个库拥有简易的度量时间的功能。该子库中封装有“timer”类,这是一个小型的计时器,提供毫秒级的计时精度。因此,可以通过这个类统计每一次数据接收完成的时间,如果该时间大于300 ms(暂定,考虑后续处理时间)则认为系统接收超时。
4 系统测试为了验证系统的可靠性与稳定性,根据系统的实际工作环境,分别对系统进行了实验室环境下的测试以及实际工作现场的测试,并结合测试结果以及系统的应用要求对系统做了进一步的完善。
实验室环境下的测试以两台装有Centos 6.4版本64位操作系统的计算机作为试验平台。两台机器通过百兆以太网连接,分别运行发送端测试程序和待测试的系统。测试分为两部分进行,正常工作状态测试和异常发生处理测试,分别对系统能否在正常工作状态下完成数据传输任务以及异常发生时能否进行相应异常处理进行了有效测试。
(1)单次测试:发送端持续循环发送观测数据文件起始位置的1.6 M数据,两次发送之间延时5 s,系统对其进行接收、处理。经过多次测试,系统完成单次接收和处理需要200 ms左右的时间。每次接收和处理完成后,系统生成一个大小为0.8 M的二进制数据文件,同时 “Recvlog.txt” 文件正确更新,后续的模拟发布系统收到含有文件名的UDP报文。
(2)连续测试:发送端不间断发送观测数据,测试数据量为1.92 G。发送间隔为5 s,每次发送1.6 MB数据,累计发送1 200次。系统对其进行接收处理,实验得到的结果无错误,说明系统可以完成持续性的数据传输任务。
(3)针对系统的异常处理方法,在系统运行过程中人为制造网络断开、发错数据、设定延时等异常,测试结果证明系统可以对这些异常进行正常处理,解除异常后,系统可以正常工作。
在实验室测试完成后,系统部署在内蒙古明安图观测站现场服务器上进行了真实环境测试。系统实现了与发送端建立连接和数据的接收、存储,并能稳定工作。同时,系统完成单次接收和处理同样需要200 ms左右的时间,与实验室测试结果吻合。经过近3个月的试运行,CSRH-I观测数据接收子系统稳定运行,实现了在数字接收机和后续实时监控,展现系统间的数据通道,保证了数据的可靠传输,满足项目需求。
5 总 结本文针对CSRH-I的特点和任务要求进行了深入的调研分析,实现了一个在Linux平台下基于C++编程库Boost的CSRH-I观测数据接收子系统。系统细致考虑了可能出现的异常错误和对应的异常处理方法,确保了系统的稳定性以及数据的正确性。测试结果表明系统具有较好的鲁棒性,能够满足CSRH-I应用需求。但当前系统中实现的数据错误检验办法仍有较大的局限性,根本的解决方法仍需要在数字接收机中增加校验数据解决。
致谢:衷心感谢中国科学院国家天文台的颜毅华老师、王威老师和刘东浩老师的指导。
| [1] | Yan Y, Zhang J, Wang W. The Chinese Spectral Radioheliograph-CSRH[J]. Earth, Moon, and Planets, 2009, 104(1-4): 97-100. |
| [2] | 王威, 陈志军, 姬国枢, 等. CSRH 光纤传输方案探讨[J]. 天文研究与技术——国家天文台台刊, 2006, 3(2): 143-147. Wang Wei, Chen Zhijun, Ji Guoshu, et al. Optical fiber transmission analysis for CSRH[J]. Astronomical Research & Technology——Publications of National Astronomical Observatories of China, 2006, 3(2): 143-147. |
| [3] | 姬国枢, 窦玉江, 王威, 等. CSRH 模拟接收机设计[J]. 天文研究与技术——国家天文台台刊, 2006, 3(2): 135-142. Ji Guoshu, Dou Yujiang, Wang Wei, et al. RF receiver design for CSRH[J]. Astronomical Research & Technology——Publications of National Astronomical Observatories of China, 2006, 3(2): 135-142. |
| [4] | 张润华. UNIX环境下基于socket网络通信的实现[J]. 科技信息(科学教研), 2008(9): 74+85. |
| [5] | 张斌, 高波. Linux网络编程[M]. 北京: 清华大学出版社, 2000. |
| [6] | 罗剑锋. Boost 程序库完全开发指南[M]. 北京: 电子工业出版社, 2010. |
| [7] | Torjo J. Boost. Asio C++ network programming[M]. America: Packt Publishing Ltd, 2013. |



