引言

miniSEED格式是美国地震地质调查局对测震数据约定的国际数据格式,这种格式的数据采用steim压缩算法,将数据压缩成更小的数据包,便于在网络带宽小和存储容量有限的条件下使用,一直沿用至今。但是这种格式的数据在使用时需要通过软件进行解压缩计算,在现有网络带宽条件与信息系统存储容量足够承载大量数据的情况下,无需对数据进行压缩,且压缩过的数据会影响计算机处理效率。因此,笔者设计并开发了程序将miniSEED数据格式转换成标准的、通用的ASCII码数据格式,并可将这种大容量的数据存储在基于数据库或Hadoop的系统中,提高测震实时数据波形的系统移植性,使测震可视化波形能够在不同平台运行,例如windows、linux、android等,最终实现可视化波形、数据共享,为社会提供服务。

1 设计思路与方法

数据解析按照获取数据、解析数据、处理数据三个部分设计。

1.1 获取数据

从测震流服务器中获取实时数据。测震流服务器通过socket接口获取身份认证和数据(苏柱金等,2014)。笔者使用java.net包中的socket接口与liss流进行通信,并采用inputstream获取miniSEED格式(张旸等,2007)数据包,每一个miniSEED数据包512字节。

1.2 解析数据
图 1 测震波形转换服务程序结构图 Fig. 1Program structure diagram of earthquake waveform transformation

获取数据包后使用seedCodec包对实时接入的数据进行解析。miniSEED数据包分为head数据块与data数据块两个部分,head数据块64个字节,包括该数据包的数据描述信息;data数据块448个字节,是观测数据部分。

1.3 处理数据

liss流是多台站多通道公用的数据接口,因此要对接收到的数据进行分类处理。分类依次解析数据的head数据块中的stationCode和channel以区分台站和通道。对获取的数据进行去均值与归一化处理。以单台站三通道的数据包为例,程序设计的总体结构图如图1所示。

2 设计与实现

程序采用J2EE框架(Bruce,2007)进行开发,在suselinux操作系统下运行,使用x86体系架构,jdk1.7运行环境及Mysql数据库,通过ApacheTomcat中间件运行发布。该系统为B/S架构,可实现跨平台应用。软件开发使用struts2+spring+mybatis结构(王保罗,2003),建立三个类包,分别为SesmicDao、SesmicService与SesmicModel。SesmicDao通过调用mybaitis接口负责数据库中数据的增、删、改、查操作;SesmicService处理数据解析的业务逻辑;SesmicModel定义了数据转换所需要的数据类型。由于系统针对实时数据进行处理,因此使用队列设计了缓冲池,用于分类和临时存储liss流中的数据(祝恒书等,2008)。缓冲池利用队列FIFO(First in fisrt out,先进先出)的形式建立数据结构(李卫东等,2008),缓冲池存储的数据间隔设定时间为5s,即当设备采样率为100Hz,缓冲池存储有500个观测数据,见图2。

图 2 数据缓冲池流程图 Fig. 2Structure diagram of datapool
2.1 数据获取

流服务器具有身份验证功能(和跃时,2007),因此接入liss流(李刚等,2012)需要进行两次socket握手链接,第一次登录获取服务端口号,第二次登录输入第一次获取的端口号。在实现的程序中需要将第二次登录认证放在第一次循环体内执行,以达到获取数据的目的。具体代码如下:

classSocketLiss {
  publicvoidsesmicData(String userName, String userPwd, String stationCode,
      String stationPwd) {
    try {
      Socket sk = newSocket(IUseNet.IP, IUseNet.PORT);
      BufferedReader in = newBufferedReader(newInputStreamReader(
          sk.getInputStream()));
      PrintWriter pw = newPrintWriter(newBufferedWriter(
          newOutputStreamWriter(sk.getOutputStream())), true);
      pw.write("USER "+userName + "\n");
      pw.flush();
      pw.write("PASS "+userPwd + "\n");
      pw.flush();
      pw.write("stat upload\n");
      pw.flush();
      pw.write("pasvrt\n");
      pw.flush();
      String reply = "";
      String[] param = new String[2];
      int result = 0;
      while (!((reply = in.readLine()) == null)) {
        System.out.println("接收服务器的信息:" + reply);
        if (reply.substring(0, 3).equals("227")) {
          System.out.println(reply = reply.substring(58,
              reply.length() - 1));
          param = reply.split(",");
          result = Integer.parseInt(param[0]) * 256
              + Integer.parseInt(param[1]);
          Socket sk1 = newSocket(IUseNet.IP, result);
          InputStream ins = sk1.getInputStream();
          PrintWriterpwr = newPrintWriter(newBufferedWriter(
              newOutputStreamWriter(sk1.getOutputStream())),
            true);
          pw.write("RETR " + stationCode + "\n");
          pw.flush();
  while (ins.read(strbyte, 0, strbyte.length) != -1) {
            for (int j = 0; j < 448; j++) {
              newbb[j] = strbyte[j + 64];
            }
catch (SteimException e) {
          e.printStackTrace();
        }
      }
}
2.2 数据解压缩

通过2.1节的程序得到的strbyte字节数组中,0—63字节是头部信息块,64—512字节是数据块(王秀文等,1994)。在获取64—512字节观测数据的时候,需要使用头部数据块中的nsamples字段作为数据块解压缩的参数。nsamples字段由strbyte[30]与strbyte[31]两个字节组成。通过使用字节转整形算法进行处理,具体代码如下:

publicstaticintbyte2int2(byte b[ ]) {
    return b[1] & 0xff | (b[0] & 0xff) << 8;
  }

建立整形数组“int[ ]”,通过调用“int[] out = Steim2.decode(newbb, nsamples, false);”可以返回一个整形数组,该整形数组中存储的就是解压缩以后的以ASCⅡ码形式存储的原始数据。

2.3 数据处理

2.2节中介绍的是以一个台站单通道为实例的处理miniSEED数据(吴永权等,2010)的获取和解析过程。在实际数据处理过程中,由于liss流服务包含多个台站的多通道数据,首先根据头部数据块中的stationCode字段对台站进行分类,然后按照解析出的channel字段对数据通道进行分类,之后将数据写入对应的系统缓冲池。处理与解析过程中还要按照头部信息中的start_time、end_time、start_time_frac、end_time_frac四个字段按相应时间对数据块进行排序与校正,形成连续可用的ASCII数据流,最后可根据数据服务的不同要求,将产出的数据进行存储与可视化展示。

3 实现效果
3.1 ASCII码格式数据存储

将解压缩后的数据存储于Mysql数据库,为其他业务系统提供数据服务。图3是在MysqlQueryBrowser客户端程序查看到的数据存储情况,其中包括id、台站、信道、开始及结束时间、波形数据和样本数等字段等信息。其中WaveForm字段以字符串形式存储观测数据,数据之间以“,”进行分隔。

图 3 转存后的数据表界面截图 Fig. 3The interface of data table after transferring
3.2 跨平台在线展示

将存储于Mysql数据库中的数据通过Fusionchart图表工具(李刚等,2013)做出南北向、东西向、垂直向的实时测震波形在线展示程序。先将数据与测算因子转换为加速度值,再进行归零化,并将数值的上下界设定为10和-10。在data.xml文件中通过配置interval选项将时间设置为3s,设定每3s更新一次波形。展示程序能够在macOS操作系统的safari浏览器、linux平台下的firefox浏览器及手机android系统下的浏览器下运行。见图4所示。

图 4 多平台下的可视化波形 Fig. 4The interface of earthquake waveform in real-time
3.3 在Hadoop系统中的应用规划

Hadoop是Apache(O' Reilly,2001)基金会的一款开源的大数据平台(李刚等,2011),能解决实际测震工作中海量数据的存储和备份问题,以便对数据进行统计和分析。传统的磁盘与光盘数据存储为离线式数据存储,而光盘存在着划损的风险,磁盘、磁带存在消磁等问题。通过大数据平台,可以有效、长期在线存储海量数据,为数据的分析、处理、共享、服务提供条件。本软件系统对数据进行整合与归类后,存储在Hadoop大数据平台中,并通过Mapreduce统计分析组件实现对大量地震波形数据进行对比,特征分析,最终为地震分析预报提供依据。

图 5 基于Hadoop平台HDFS数据库的测震数据截图 Fig. 5Diagram of seismic data in HDFS database based on Hadoop platform
4 结论

通过本文所述方法处理的测震数据能够实现跨平台系统的开发与应用,具有很强的系统移植性。利用Mapreduce能够以更高的效率进行数据的分析与统计。在基于Hadoop平台的基础上进行进一步开发利用,通过扩展spark内存数据库,提高测震波形的获取效率,进一步提高系统性能,从而缩短地震预警计算机系统计算的响应时间。

致谢:感谢梁建宏、杨晨两位专家在专业上的指导。

参考文献
1.和跃时,2007.CDSN台SEED数据格式的软件开发东北地震研究,23(4):59—64.
2.李刚,姚会琴,李悦等,2013.JpGraph绘图类库在地震数据展示中的应用震灾防御技术,8(2):209—215.
3.李刚,孙晶岩,卞真付等,2012.MPLS VPN高速区域网络在天津地震监测系统中的应用震灾防御技术,7(1):92—99.
4.李刚,周丽霞,宋军等,2011.基于VmwareEsxi软件的服务器虚拟化技术在天津地震监测网络中的应用震灾防御技术,6(3):311—318.
5.李卫东,梁兆东,2008.使用Ultra-NMS监控软件扩展测震仪器监控功能的方法震灾防御技术,3(2):204—207.
6.苏柱金,黄文辉,2014.基于JOPENS系统的地震速报信息聚合与发布系统的设计与实现华南地震,34(4):35—40.
7.王保罗,2003.Java面向对象程序设计北京:清华大学出版社
8.王秀文,姚立平,赖德伦等,1994.地震数据交换标准地震地磁观测与研究,15(2):1—80.
9.吴永权,黄文辉,2010.数据处理系统软件JOPENS的架构设计与实现地震地磁观测与研究,31(6):59—63.
10.张旸,滕云田,王喜珍等,2007.地震观测仪器的MiniSEED数据格式的实现地震地磁观测与研究,28(3):110—113.
11.祝恒书,宋立军,赵雯佳,2008.WMN技术用于构建新型地震应急救援无线通讯平台的分析与设想内陆地震,22(3):226—233.
12.Bruce Eckel,2007.Thinking in Java 4, American: Prentice Hall PTR
13.O' Reilly,2001.Java Servlet Programming, American: SernniYey